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