001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.tools.sourceformatter;
016    
017    import com.liferay.portal.kernel.util.GetterUtil;
018    import com.liferay.portal.kernel.util.ListUtil;
019    import com.liferay.portal.kernel.util.PropertiesUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    import com.liferay.portal.kernel.util.StringUtil;
022    import com.liferay.portal.util.FileImpl;
023    
024    import java.io.File;
025    import java.io.IOException;
026    
027    import java.util.ArrayList;
028    import java.util.List;
029    import java.util.Properties;
030    
031    import org.apache.tools.ant.DirectoryScanner;
032    
033    /**
034     * @author Igor Spasic
035     * @author Brian Wing Shun Chan
036     */
037    public class SourceFormatterHelper {
038    
039            public SourceFormatterHelper(boolean useProperties) {
040                    _useProperties = useProperties;
041            }
042    
043            public void close() throws IOException {
044                    if (!_useProperties) {
045                            return;
046                    }
047    
048                    String newPropertiesContent = PropertiesUtil.toString(_properties);
049    
050                    if (!_propertiesContent.equals(newPropertiesContent)) {
051                            _fileUtil.write(_propertiesFile, newPropertiesContent);
052                    }
053            }
054    
055            public void init() throws IOException {
056                    if (!_useProperties) {
057                            return;
058                    }
059    
060                    File basedirFile = new File("./");
061    
062                    String basedirAbsolutePath = StringUtil.replace(
063                            basedirFile.getAbsolutePath(), new String[] {".", ":", "/", "\\"},
064                            new String[] {"_", "_", "_", "_"});
065    
066                    String propertiesFileName =
067                            System.getProperty("java.io.tmpdir") + "/SourceFormatter." +
068                                    basedirAbsolutePath;
069    
070                    _propertiesFile = new File(propertiesFileName);
071    
072                    if (_propertiesFile.exists()) {
073                            _propertiesContent = _fileUtil.read(_propertiesFile);
074    
075                            PropertiesUtil.load(_properties, _propertiesContent);
076                    }
077            }
078    
079            public void printError(String fileName, File file) {
080                    printError(fileName, file.toString());
081            }
082    
083            public void printError(String fileName, String message) {
084                    if (_useProperties) {
085                            String encodedFileName = StringUtil.replace(
086                                    fileName, StringPool.BACK_SLASH, StringPool.SLASH);
087    
088                            _properties.remove(encodedFileName);
089                    }
090    
091                    System.out.println(message);
092            }
093    
094            public List<String> scanForFiles(DirectoryScanner directoryScanner) {
095                    directoryScanner.scan();
096    
097                    String[] fileNamesArray = directoryScanner.getIncludedFiles();
098    
099                    if (!_useProperties) {
100                            return ListUtil.toList(fileNamesArray);
101                    }
102    
103                    List<String> fileNames = new ArrayList<String>(fileNamesArray.length);
104    
105                    for (String fileName : fileNamesArray) {
106                            File file = new File(fileName);
107    
108                            String encodedFileName = StringUtil.replace(
109                                    fileName, StringPool.BACK_SLASH, StringPool.SLASH);
110    
111                            long timestamp = GetterUtil.getLong(
112                                    _properties.getProperty(encodedFileName));
113    
114                            if (timestamp < file.lastModified()) {
115                                    fileNames.add(fileName);
116    
117                                    _properties.setProperty(
118                                            encodedFileName, String.valueOf(file.lastModified()));
119                            }
120                    }
121    
122                    return fileNames;
123            }
124    
125            private static FileImpl _fileUtil = FileImpl.getInstance();
126    
127            private Properties _properties = new Properties();
128            private String _propertiesContent = StringPool.BLANK;
129            private File _propertiesFile;
130            private boolean _useProperties;
131    
132    }