001/*
002 * Copyright 2007-2018 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("Changed-By",   packageControlFile.get("Maintainer"));
073        set("Distribution", packageControlFile.get("Distribution"));
074
075        for (Entry<String, String> entry : packageControlFile.getUserDefinedFields().entrySet()) {
076            set(entry.getKey(), entry.getValue());
077        }
078
079        StringBuilder description = new StringBuilder();
080        description.append(packageControlFile.get("Package"));
081        if (packageControlFile.get("Description") != null) {
082            description.append(" - ");
083            description.append(packageControlFile.getShortDescription());
084        }
085        set("Description",  description.toString());
086    }
087
088    public void setChanges(ChangeSet[] changeSets) {
089        StringBuilder sb = new StringBuilder();
090
091        if (changeSets.length > 0) {
092            final ChangeSet mostRecentChangeSet = changeSets[0];
093            set("Urgency", mostRecentChangeSet.getUrgency());
094            set("Changed-By", mostRecentChangeSet.getChangedBy());
095
096            for (ChangeSet changeSet : changeSets) {
097                sb.append(changeSet.toString());
098            }
099        }
100
101        set("Changes", sb.toString());
102    }
103
104    protected ControlField[] getFields() {
105        return FIELDS;
106    }
107
108    protected char getUserDefinedFieldLetter() {
109        return 'C';
110    }
111
112    public static String formatDate(Date date) {
113        final DateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); // RFC 2822 format
114        return format.format(date);
115    }
116}