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.changes;
018
019import java.io.BufferedReader;
020import java.io.BufferedWriter;
021import java.io.IOException;
022import java.io.InputStream;
023import java.io.InputStreamReader;
024import java.io.OutputStream;
025import java.io.OutputStreamWriter;
026import java.text.DateFormat;
027import java.text.ParseException;
028import java.text.SimpleDateFormat;
029import java.util.ArrayList;
030import java.util.Collection;
031import java.util.Date;
032
033import org.vafer.jdeb.debian.BinaryPackageControlFile;
034
035/**
036 * Gets the changes from a changes file. The first entry are the current changes.
037 * The release line will be added. Example:
038 *
039 * release date=22:13 19.08.2007,version=1.5+r90114,urgency=low,by=Torsten Curdt <torsten@vafer.org>
040 *   * debian changes support
041 * release date=20:13 17.08.2007,version=1.4+r89114,urgency=low,by=Torsten Curdt <torsten@vafer.org>
042 *   * debian changes support
043 *
044 */
045public final class TextfileChangesProvider implements ChangesProvider {
046
047    private final ChangeSet[] changeSets;
048
049    private DateFormat fmt = new SimpleDateFormat("HH:mm dd.MM.yyyy");
050
051    public TextfileChangesProvider( final InputStream pInput, final BinaryPackageControlFile packageControlFile ) throws IOException, ParseException {
052
053        final BufferedReader reader = new BufferedReader(new InputStreamReader(pInput));
054
055        String packageName = packageControlFile.get("Package");
056        String version = packageControlFile.get("Version");
057        Date date = new Date();
058        String distribution = packageControlFile.get("Distribution");
059        String urgency = packageControlFile.get("Urgency");
060        String changedBy = packageControlFile.get("Maintainer");
061        Collection<String> changesColl = new ArrayList<String>();
062        Collection<ChangeSet> changeSetColl = new ArrayList<ChangeSet>();
063
064
065        while (true) {
066            final String line = reader.readLine();
067            if (line == null) {
068                final String[] changes = changesColl.toArray(new String[changesColl.size()]);
069                final ChangeSet changeSet = new ChangeSet(packageName, version, date, distribution, urgency, changedBy, changes);
070                changeSetColl.add(changeSet);
071                break;
072            }
073
074            if (line.startsWith("release ")) {
075
076                if (changesColl.size() > 0) {
077                    final String[] changes = changesColl.toArray(new String[changesColl.size()]);
078                    final ChangeSet changeSet = new ChangeSet(packageName, version, date, distribution, urgency, changedBy, changes);
079                    changeSetColl.add(changeSet);
080                    changesColl.clear();
081                }
082
083                final String[] tokens = line.substring("release ".length()).split(",");
084                for (String token : tokens) {
085                    final String[] lr = token.trim().split("=");
086                    final String key = lr[0];
087                    final String value = lr[1];
088
089                    if ("urgency".equals(key)) {
090                        urgency = value;
091                    } else if ("by".equals(key)) {
092                        changedBy = value;
093                    } else if ("date".equals(key)) {
094                        date = fmt.parse(value);
095                    } else if ("version".equals(key)) {
096                        version = value;
097                    } else if ("distribution".equals(key)) {
098                        distribution = value;
099                    }
100                }
101                continue;
102            }
103
104            if (line.startsWith(" * ")) {
105                changesColl.add(line.substring(" * ".length()));
106                continue;
107            }
108
109            throw new ParseException("Unknown line syntax [" + line + "]", 0);
110        }
111
112        reader.close();
113
114        changeSets = changeSetColl.toArray(new ChangeSet[changeSetColl.size()]);
115    }
116
117    public void save(OutputStream pOutput) throws IOException {
118        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(pOutput));
119
120        for (ChangeSet changeSet : changeSets) {
121            writer.write("release ");
122            writer.write("date=" + fmt.format(changeSet.getDate()) + ",");
123            writer.write("version=" + changeSet.getVersion() + ",");
124            writer.write("urgency=" + changeSet.getUrgency() + ",");
125            writer.write("by=" + changeSet.getChangedBy() + ",");
126            writer.write("distribution=" + changeSet.getDistribution());
127            writer.write("\n");
128
129            for (String change : changeSet.getChanges()) {
130                writer.write(" * ");
131                writer.write(change);
132                writer.write("\n");
133            }
134        }
135
136        writer.close();
137    }
138
139    public ChangeSet[] getChangesSets() {
140        return changeSets;
141    }
142}