View Javadoc

1   /*
2    * Copyright 2005 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * Gets the changes from a changes file. The first entry are the current changes.
37   * The release line will be added. Example:
38   
39  release date=22:13 19.08.2007,version=1.5+r90114,urgency=low,by=Torsten Curdt <torsten@vafer.org>
40    * debian changes support
41  release date=20:13 17.08.2007,version=1.4+r89114,urgency=low,by=Torsten Curdt <torsten@vafer.org>
42    * debian changes support
43  
44   * @author Torsten Curdt <tcurdt@vafer.org>
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); // RFC 2822 format
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 }