com.liferay.source.formatter.BaseSourceProcessor Maven / Gradle / Ivy
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.source.formatter;
import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader;
import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
import com.liferay.portal.kernel.nio.charset.CharsetDecoderUtil;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.NaturalOrderStringComparator;
import com.liferay.portal.kernel.util.ReflectionUtil;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.util.SetUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.TextFormatter;
import com.liferay.portal.kernel.util.Tuple;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.tools.ToolsUtil;
import com.liferay.portal.xml.SAXReaderFactory;
import com.liferay.source.formatter.util.FileUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.nio.ByteBuffer;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FilenameUtils;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.tools.ant.types.selectors.SelectorUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* @author Brian Wing Shun Chan
* @author Igor Spasic
* @author Wesley Gong
* @author Hugo Huijser
*/
public abstract class BaseSourceProcessor implements SourceProcessor {
public static final int PLUGINS_MAX_DIR_LEVEL =
ToolsUtil.PLUGINS_MAX_DIR_LEVEL;
public static final int PORTAL_MAX_DIR_LEVEL =
ToolsUtil.PORTAL_MAX_DIR_LEVEL;
@Override
public final void format() throws Exception {
preFormat();
List fileNames = getFileNames();
ExecutorService executorService = Executors.newFixedThreadPool(
sourceFormatterArgs.getProcessorThreadCount());
List> futures = new ArrayList<>(fileNames.size());
for (final String fileName : fileNames) {
Future future = executorService.submit(
new Callable() {
@Override
public Void call() throws Exception {
try {
format(fileName);
return null;
}
catch (Exception e) {
throw new RuntimeException(
"Unable to format " + fileName, e);
}
}
});
futures.add(future);
}
for (Future future : futures) {
future.get();
}
executorService.shutdown();
postFormat();
_sourceFormatterHelper.close();
}
public final List getFileNames() throws Exception {
List fileNames = sourceFormatterArgs.getFileNames();
if (fileNames != null) {
return fileNames;
}
return doGetFileNames();
}
@Override
public SourceMismatchException getFirstSourceMismatchException() {
return _firstSourceMismatchException;
}
@Override
public List getModifiedFileNames() {
return _modifiedFileNames;
}
@Override
public List getSourceFormatterMessages() {
List sourceFormatterMessages =
new ArrayList<>();
for (Map.Entry> entry :
_sourceFormatterMessagesMap.entrySet()) {
sourceFormatterMessages.addAll(entry.getValue());
}
return sourceFormatterMessages;
}
@Override
public void processMessage(String fileName, String message) {
processMessage(fileName, message, -1);
}
@Override
public void processMessage(String fileName, String message, int lineCount) {
List sourceFormatterMessages =
_sourceFormatterMessagesMap.get(fileName);
if (sourceFormatterMessages == null) {
sourceFormatterMessages = new ArrayList<>();
}
sourceFormatterMessages.add(
new SourceFormatterMessage(fileName, message, lineCount));
_sourceFormatterMessagesMap.put(fileName, sourceFormatterMessages);
}
@Override
public void setSourceFormatterArgs(
SourceFormatterArgs sourceFormatterArgs) {
this.sourceFormatterArgs = sourceFormatterArgs;
_init();
}
protected boolean addExtraEmptyLine(
String previousLine, String line, boolean javaSource) {
String trimmedLine = StringUtil.trimLeading(line);
String trimmedPreviousLine = StringUtil.trimLeading(previousLine);
if (this instanceof JSPSourceProcessor) {
if (trimmedPreviousLine.matches("(--)?%>") &&
Validator.isNotNull(line) && !trimmedLine.equals("-->")) {
return true;
}
if (Validator.isNotNull(previousLine) &&
!trimmedPreviousLine.equals("