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}