package com.sun.tools.xjc.addon.xew.config;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* Global configuration.
*/
public class GlobalConfiguration extends CommonConfiguration {
private PrintWriter summaryWriter = null;
private List<ControlEntry> controlList = new ArrayList<ControlEntry>();
private static class ControlEntry {
Pattern pattern;
ControlMode controlMode;
ControlEntry(Pattern pattern, ControlMode controlMode) {
this.pattern = pattern;
this.controlMode = controlMode;
}
@Override
public String toString() {
return "ControlEntry[" + pattern + "=" + controlMode + "]";
}
}
/**
* Parse the given control file and initialize this config appropriately.
*/
void readControlFile(String fileName) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
try {
controlList.clear();
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.isEmpty() || line.startsWith("#")) {
continue;
}
int separatorIndex = line.indexOf('=');
if (separatorIndex <= 0) {
logger.warn("Control file line \"" + line + "\" is invalid as does not have '=' separator.");
continue;
}
String className = line.substring(0, separatorIndex);
ControlMode controlMode;
try {
controlMode = ControlMode.valueOf(line.substring(separatorIndex + 1).trim().toUpperCase());
}
catch (IllegalArgumentException e) {
logger.warn("Control file line \"" + line + "\" is invalid as control mode is unknown.");
continue;
}
controlList.add(new ControlEntry(
className.startsWith("/") && className.endsWith("/") && className.length() > 2
? Pattern.compile(className.substring(1, className.length() - 1))
: Pattern.compile(className, Pattern.LITERAL),
controlMode));
}
configurationValues.put(ConfigurationOption.CONTROL, fileName);
}
finally {
reader.close();
}
}
public String getControlFileName() {
return (String) configurationValues.get(ConfigurationOption.CONTROL);
}
/**
* Returns {@code true} if given candidate class should be considered.
*/
public boolean isClassIncluded(String className) {
boolean inclusionForced = false;
boolean exclusionForced = false;
for (ControlEntry controlEntry : controlList) {
if (controlEntry.pattern.matcher(className).matches()) {
switch (controlEntry.controlMode) {
case INCLUDE:
inclusionForced = true;
break;
case EXCLUDE:
exclusionForced = true;
break;
default:
}
}
}
if (inclusionForced) {
return true;
}
if (exclusionForced) {
return false;
}
return true;
}
/**
* Returns {@code true} if given candidate class should not be removed from model.
*/
public boolean isClassUnmarkedForRemoval(String className) {
for (ControlEntry controlEntry : controlList) {
if (controlEntry.pattern.matcher(className).matches() && controlEntry.controlMode == ControlMode.KEEP) {
return true;
}
}
return false;
}
@Override
protected ToStringBuilder appendProperties(ToStringBuilder builder) {
super.appendProperties(builder);
builder.append("controlList", controlList);
return builder;
}
/**
* Tune summary writer to write to given {@code fileName}.
*/
public void initSummaryWriter(String fileName) throws FileNotFoundException {
closeSummary();
summaryWriter = new PrintWriter(new FileOutputStream(fileName));
configurationValues.put(ConfigurationOption.SUMMARY, fileName);
}
/**
* Returns filename that is currently used for summary or {@code null} if summary is disabled.
*/
public String getSummaryFileName() {
return (String) configurationValues.get(ConfigurationOption.SUMMARY);
}
//
// Logging helpers
//
public void writeSummary(String s) {
if (summaryWriter != null) {
summaryWriter.println(s);
}
logger.info(s);
}
public void closeSummary() {
if (summaryWriter != null) {
summaryWriter.close();
summaryWriter = null;
}
configurationValues.remove(ConfigurationOption.SUMMARY);
}
}