1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.vafer.jdeb.changes;
17
18 import java.io.BufferedReader;
19 import java.io.BufferedWriter;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.InputStreamReader;
23 import java.io.OutputStream;
24 import java.io.OutputStreamWriter;
25 import java.text.DateFormat;
26 import java.text.ParseException;
27 import java.text.SimpleDateFormat;
28 import java.util.ArrayList;
29 import java.util.Collection;
30 import java.util.Date;
31 import java.util.Locale;
32
33 import org.vafer.jdeb.descriptors.PackageDescriptor;
34
35
36
37
38
39
40
41
42
43
44
45
46 public final class TextfileChangesProvider implements ChangesProvider {
47
48 private final ChangeSet[] changeSets;
49
50 public TextfileChangesProvider( final InputStream pInput, final PackageDescriptor pDescriptor ) throws IOException, ParseException {
51
52 final BufferedReader reader = new BufferedReader(new InputStreamReader(pInput));
53
54 final DateFormat tdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
55 final DateFormat sdf = ChangeSet.createDateForma();
56
57 String packageName = pDescriptor.get("Package");
58 String version = pDescriptor.get("Version");
59 Date date = tdf.parse(pDescriptor.get("Date"));
60 String distribution = pDescriptor.get("Distribution");
61 String urgency = pDescriptor.get("Urgency");
62 String changedBy = pDescriptor.get("Maintainer");
63 final Collection changesColl = new ArrayList();
64 final Collection changeSetColl = new ArrayList();
65
66
67 while(true) {
68 final String line = reader.readLine();
69 if (line == null) {
70 final String[] changes = (String[]) changesColl.toArray(new String[changesColl.size()]);
71 final ChangeSet changeSet = new ChangeSet(packageName, version, date, distribution, urgency, changedBy, changes);
72 changeSetColl.add(changeSet);
73 break;
74 }
75
76 if (line.startsWith("release ")) {
77
78 if (changesColl.size() > 0) {
79 final String[] changes = (String[]) changesColl.toArray(new String[changesColl.size()]);
80 final ChangeSet changeSet = new ChangeSet(packageName, version, date, distribution, urgency, changedBy, changes);
81 changeSetColl.add(changeSet);
82 changesColl.clear();
83 }
84
85 final String[] tokens = line.substring("release ".length()).split(",");
86 for (int i = 0; i < tokens.length; i++) {
87 final String token = tokens[i].trim();
88 final String[] lr = token.split("=");
89 final String key = lr[0];
90 final String value = lr[1];
91
92 if ("urgency".equals(key)) {
93 urgency = value;
94 } else if ("by".equals(key)) {
95 changedBy = value;
96 } else if ("date".equals(key)) {
97 date = sdf.parse(value);
98 } else if ("version".equals(key)) {
99 version = value;
100 } else if ("distribution".equals(key)) {
101 distribution = value;
102 }
103 }
104 continue;
105 }
106
107 if (line.startsWith(" * ")) {
108 changesColl.add(line.substring(" * ".length()));
109 continue;
110 }
111
112 throw new ParseException("Unknown line syntax [" + line + "]", 0);
113 }
114
115 reader.close();
116
117 changeSets = (ChangeSet[]) changeSetColl.toArray(new ChangeSet[changeSetColl.size()]);
118 }
119
120 public void save( final OutputStream pOutput ) throws IOException {
121 final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(pOutput));
122
123 final DateFormat df = ChangeSet.createDateForma();
124
125 for (int i = 0; i < changeSets.length; i++) {
126 final ChangeSet changeSet = changeSets[i];
127
128 writer.write("release ");
129 writer.write("date=" + df.format(changeSet.getDate()) + ",");
130 writer.write("version=" + changeSet.getVersion() + ",");
131 writer.write("urgency=" + changeSet.getUrgency() + ",");
132 writer.write("by=" + changeSet.getChangedBy() + ",");
133 writer.write("distribution=" + changeSet.getDistribution());
134 writer.write("\n");
135
136 final String[] changes = changeSet.getChanges();
137 for (int j = 0; j < changes.length; j++) {
138 writer.write(" * ");
139 writer.write(changes[j]);
140 writer.write("\n");
141 }
142 }
143
144 writer.close();
145 }
146
147 public ChangeSet[] getChangesSets() {
148 return changeSets;
149 }
150
151 }