001 package org.springframework.beans;
002
003 import java.io.File;
004 import java.io.FileInputStream;
005 import java.io.FileOutputStream;
006 import java.io.IOException;
007 import java.io.InputStream;
008 import java.io.OutputStream;
009 import java.util.ArrayList;
010 import java.util.HashSet;
011 import java.util.Iterator;
012 import java.util.List;
013 import java.util.Properties;
014 import java.util.Set;
015
016 import org.apache.commons.io.IOUtils;
017 import org.springframework.core.io.DefaultResourceLoader;
018 import org.springframework.core.io.Resource;
019 import org.springframework.core.io.ResourceLoader;
020
021 public class CopyrightHandler {
022
023 public static final String ECL_CR = "${ecl.cr}";
024 public static final String ECL_LF = "${ecl.lf}";
025 public static final String CR = "\r";
026 public static final String LF = "\n";
027
028 public static void main(String[] args) {
029 new CopyrightHandler().exec(args);
030 }
031
032 protected void exec(String[] args) {
033 try {
034 if (args == null || args.length != 1) {
035 throw new RuntimeException("Pass in basedir as the first (and only argument)");
036 }
037 String basedir = args[0];
038 ProblemFileContext context = new MultipleCopyrightContext(basedir);
039 ProblemFileDetector detector = new ProblemFileDetector();
040 List<File> files = detector.getProblemFiles(context);
041 System.out
042 .println("Located " + files.size() + " files with multiple lines containing the text 'copyright'");
043 Properties invalidEcl = getProperties("invalid-ecl.properties");
044 Set<String> contentsToRemove = getValues(invalidEcl);
045 ContentRemover remover = new ContentRemover();
046 Iterator<File> itr = files.iterator();
047 List<File> updatedFiles = new ArrayList<File>();
048 List<File> nonUpdatedFiles = new ArrayList<File>();
049 while (itr.hasNext()) {
050 File file = itr.next();
051 boolean updated = remover.removeContent(file, contentsToRemove);
052 if (!updated) {
053 copy(file);
054 nonUpdatedFiles.add(file);
055 } else {
056 updatedFiles.add(file);
057 }
058 }
059 System.out.println("Updated files");
060 System.out.println("---------------------");
061 for (File file : updatedFiles) {
062 System.out.println(file.getAbsolutePath());
063 }
064 System.out.println();
065 System.out.println("Multi-copyright files");
066 System.out.println("---------------------");
067 for (File file : nonUpdatedFiles) {
068 System.out.println(file.getAbsolutePath());
069 }
070 } catch (Throwable t) {
071 t.printStackTrace();
072 }
073 }
074
075 protected Set<String> getValues(Properties properties) {
076 Set<String> values = new HashSet<String>();
077 Set<String> keys = properties.stringPropertyNames();
078 for (String key : keys) {
079 String value = properties.getProperty(key);
080 if (values.contains(value)) {
081 throw new RuntimeException("key " + key + " is a duplicate");
082 }
083 values.add(value);
084 }
085 return values;
086 }
087
088 protected Properties getProperties(String location) {
089 ResourceLoader loader = new DefaultResourceLoader();
090 Resource resource = loader.getResource(location);
091 Properties properties = new Properties();
092 InputStream in = null;
093 try {
094 in = resource.getInputStream();
095 properties.load(in);
096 return properties;
097 } catch (IOException e) {
098 throw new RuntimeException(e);
099 } finally {
100 IOUtils.closeQuietly(in);
101 }
102 }
103
104 protected Properties getXMLProperties(String location) {
105 ResourceLoader loader = new DefaultResourceLoader();
106 Resource resource = loader.getResource(location);
107 Properties properties = new Properties();
108 InputStream in = null;
109 try {
110 in = resource.getInputStream();
111 properties.loadFromXML(in);
112 return properties;
113 } catch (IOException e) {
114 throw new RuntimeException(e);
115 } finally {
116 IOUtils.closeQuietly(in);
117 }
118 }
119
120 public static final void write(File file, String content) {
121 OutputStream out = null;
122 try {
123 out = new FileOutputStream(file);
124 IOUtils.write(content.getBytes(), out);
125 } catch (IOException e) {
126 throw new RuntimeException(e);
127 } finally {
128 IOUtils.closeQuietly(out);
129 }
130 }
131
132 public static final String read(File file) {
133 InputStream in = null;
134 try {
135 in = new FileInputStream(file);
136 return IOUtils.toString(in);
137 } catch (IOException e) {
138 throw new RuntimeException(e);
139 } finally {
140 IOUtils.closeQuietly(in);
141 }
142 }
143
144 public static final String expand(String s) {
145 s = s.replace(ECL_CR, CR);
146 s = s.replace(ECL_LF, LF);
147 return s;
148 }
149
150 public static final String flatten(String s) {
151 s = s.replace(CR, ECL_CR);
152 s = s.replace(LF, ECL_LF);
153 return s;
154 }
155
156 protected void copy(File file) {
157 String content = read(file);
158 String flat = flatten(content);
159 String filename = file.getName();
160 File flatFile = new File("C:/temp/ecl/" + filename);
161 write(flatFile, flat);
162 }
163
164 }