001/*
002 * Copyright 2007-2021 The jdeb developers.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.vafer.jdeb.debian;
018
019import org.vafer.jdeb.utils.Utils;
020import org.vafer.jdeb.changes.ChangeSet;
021
022import java.text.DateFormat;
023import java.text.SimpleDateFormat;
024import java.util.Date;
025import java.util.Locale;
026import java.util.Map.Entry;
027
028/**
029 * Reflecting a changes file
030 *
031 * @see <a href="http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debianchangesfiles">Debian Policy Manual - Debian changes files</a>
032 */
033public final class ChangesFile extends ControlFile {
034
035    private static final ControlField[] FIELDS = {
036        new ControlField("Format", true),
037        new ControlField("Date", true),
038        new ControlField("Source", true),
039        new ControlField("Binary", true),
040        new ControlField("Architecture", true),
041        new ControlField("Version", true),
042        new ControlField("Distribution", true),
043        new ControlField("Urgency", true),
044        new ControlField("Maintainer", true),
045        new ControlField("Changed-By"),
046        new ControlField("Description", true, ControlField.Type.MULTILINE, true),
047        new ControlField("Changes", true, ControlField.Type.MULTILINE, true),
048        new ControlField("Closes"),
049        new ControlField("Checksums-Sha1", true, ControlField.Type.MULTILINE, true),
050        new ControlField("Checksums-Sha256", true, ControlField.Type.MULTILINE, true),
051        new ControlField("Files", true, ControlField.Type.MULTILINE, true)
052    };
053
054    public ChangesFile() {
055        set("Format", "1.8");
056        set("Urgency", "low");
057        set("Distribution", "stable");
058    }
059
060    /**
061     * Initializes the fields on the changes file with the values of the specified
062     * binary package control file.
063     *
064     * @param packageControlFile
065     */
066    public void initialize(BinaryPackageControlFile packageControlFile) {
067        set("Binary",       packageControlFile.get("Package"));
068        set("Source",       Utils.defaultString(packageControlFile.get("Source"), packageControlFile.get("Package")));
069        set("Architecture", packageControlFile.get("Architecture"));
070        set("Version",      packageControlFile.get("Version"));
071        set("Maintainer",   packageControlFile.get("Maintainer"));
072        set("Distribution", packageControlFile.get("Distribution"));
073
074        for (Entry<String, String> entry : packageControlFile.getUserDefinedFields().entrySet()) {
075            set(entry.getKey(), entry.getValue());
076        }
077
078        StringBuilder description = new StringBuilder();
079        description.append(packageControlFile.get("Package"));
080        if (packageControlFile.get("Description") != null) {
081            description.append(" - ");
082            description.append(packageControlFile.getShortDescription());
083        }
084        set("Description",  description.toString());
085    }
086
087    public void setChanges(ChangeSet[] changeSets) {
088        StringBuilder sb = new StringBuilder();
089
090        if (changeSets.length > 0) {
091            final ChangeSet mostRecentChangeSet = changeSets[0];
092            set("Urgency", mostRecentChangeSet.getUrgency());
093            set("Changed-By", mostRecentChangeSet.getChangedBy());
094
095            for (ChangeSet changeSet : changeSets) {
096                sb.append(changeSet.toString());
097            }
098        }
099
100        set("Changes", sb.toString());
101    }
102
103    protected ControlField[] getFields() {
104        return FIELDS;
105    }
106
107    protected char getUserDefinedFieldLetter() {
108        return 'C';
109    }
110
111    public static String formatDate(Date date) {
112        final DateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); // RFC 2822 format
113        return format.format(date);
114    }
115}