/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.lang.gosuc;
import gw.fs.IDirectory;
import gw.lang.parser.ISourceCodeTokenizer;
import gw.lang.parser.IToken;
import gw.lang.reflect.module.INativeModule;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class GosucModule implements INativeModule, Serializable {
private String _name;
private List<String> _allSourceRoots;
private List<String> _classpath;
private String _outputPath;
private List<GosucDependency> _dependencies;
public GosucModule(String name,
List<String> allSourceRoots,
List<String> classpath,
String outputPath,
List<GosucDependency> dependencies) {
_allSourceRoots = new ArrayList<String>();
for (String sourceRoot : allSourceRoots) {
if (!sourceRoot.endsWith(".jar")) {
_allSourceRoots.add(sourceRoot);
}
}
_classpath = classpath;
_outputPath = outputPath;
_dependencies = dependencies;
_name = name;
}
public List<String> getAllSourceRoots() {
return _allSourceRoots;
}
public List<String> getClasspath() {
return _classpath;
}
public List<GosucDependency> getDependencies() {
return _dependencies;
}
public String getName() {
return _name;
}
@Override
public Object getNativeModule() {
return this;
}
@Override
public IDirectory getOutputPath() {
return _outputPath != null ? GosucUtil.getDirectoryForPath(_outputPath) : null;
}
public String write() {
return getName() + " {\n" +
" sourcepath {\n" +
writeSourceRoots() +
" }\n" +
" classpath {\n" +
writeClasspath() +
" }\n" +
" outpath {\n" +
writeOutputPath() +
" }\n" +
" deps {\n" +
writeDependencies() +
" }\n" +
"}\n";
}
private String writeSourceRoots() {
StringBuilder sb = new StringBuilder();
for (String sourceRoot : getAllSourceRoots()) {
sb.append(" ").append("\"").append(sourceRoot).append("\",\n");
}
return sb.toString();
}
private String writeClasspath() {
StringBuilder sb = new StringBuilder();
for (String path : getClasspath()) {
sb.append(" ").append("\"").append(path).append("\",\n");
}
return sb.toString();
}
private String writeOutputPath() {
return _outputPath != null ? " \"" + _outputPath + "\"\n" :
" \"\"\n";
}
private String writeDependencies() {
StringBuilder sb = new StringBuilder();
for (GosucDependency dep : getDependencies()) {
sb.append(" ").append(dep.write()).append("\n");
}
return sb.toString();
}
public static GosucModule parse(GosucProjectParser parser) {
IToken t = parser.getTokenizer().getCurrentToken();
parser.verify(parser.match(null, ISourceCodeTokenizer.TT_WORD, false), "Expecting module name");
String name = t.getStringValue();
parser.verify(parser.match(null, '{', false), "Expecting '{' to begin module definition");
List<String> sourcepaths = parseSourcePaths(parser);
List<String> classpath = parseClasspath(parser);
String outputPath = parseOutputPath(parser);
List<GosucDependency> deps = parseDependencies(parser);
parser.verify(parser.match(null, '}', false), "Expecting '}' to close module definition");
return new GosucModule(name, sourcepaths, classpath, outputPath, deps);
}
private static List<GosucDependency> parseDependencies(GosucProjectParser parser) {
parser.verify(parser.matchWord("deps", false), "Expecting keyword 'deps'");
parser.verify(parser.match(null, '{', false), "Expecting '{' to begin deps list");
List<GosucDependency> deps = parseDependenciesList(parser);
parser.verify(parser.match(null, '}', false), "Expecting '}' to close deps list");
return deps;
}
private static List<GosucDependency> parseDependenciesList(GosucProjectParser parser) {
List<GosucDependency> deps = new ArrayList<GosucDependency>();
while (parser.match(null, ISourceCodeTokenizer.TT_WORD, true)) {
deps.add(GosucDependency.parse(parser));
}
return deps;
}
private static List<String> parseClasspath(GosucProjectParser parser) {
parser.verify(parser.matchWord("classpath", false), "Expecting keyword 'classpath'");
parser.verify(parser.match(null, '{', false), "Expecting '{' to begin classpath list");
List<String> classpaths = parseClasspathList(parser);
parser.verify(parser.match(null, '}', false), "Expecting '}' to close classpath list");
return classpaths;
}
private static List<String> parseClasspathList(GosucProjectParser parser) {
List<String> paths = new ArrayList<String>();
for (IToken t = parser.getTokenizer().getCurrentToken(); parser.match(null, '"', false); t = parser.getTokenizer().getCurrentToken()) {
paths.add(t.getStringValue());
if (!parser.match(null, ',', false)) {
break;
}
}
return paths;
}
private static List<String> parseSourcePaths(GosucProjectParser parser) {
parser.verify(parser.matchWord("sourcepath", false), "Expecting keyword 'sourcepath'");
parser.verify(parser.match(null, '{', false), "Expecting '{' to begin sourcepath list");
List<String> sourcepaths = parseSourcePathList(parser);
parser.verify(parser.match(null, '}', false), "Expecting '}' to close sourcepath list");
return sourcepaths;
}
private static List<String> parseSourcePathList(GosucProjectParser parser) {
List<String> paths = new ArrayList<String>();
for (IToken t = parser.getTokenizer().getCurrentToken(); parser.match(null, '"', false); t = parser.getTokenizer().getCurrentToken()) {
paths.add(t.getStringValue());
if (!parser.match(null, ',', false)) {
break;
}
}
return paths;
}
private static String parseOutputPath(GosucProjectParser parser) {
parser.verify(parser.matchWord("outpath", false), "Expecting keyword 'outpath'");
parser.verify(parser.match(null, '{', false), "Expecting '{' to begin outpath list");
IToken t = parser.getTokenizer().getCurrentToken();
parser.verify(parser.match(null, '"', false), "Expecting quoted path");
parser.verify(parser.match(null, '}', false), "Expecting '}' to close outpath list");
String value = t.getStringValue();
return value.trim().isEmpty() ? null : value;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
GosucModule that = (GosucModule) o;
if (!_allSourceRoots.equals(that._allSourceRoots)) {
return false;
}
if (!_classpath.equals(that._classpath)) {
return false;
}
if (!_dependencies.equals(that._dependencies)) {
return false;
}
if (!_name.equals(that._name)) {
return false;
}
if (_outputPath != null ? !_outputPath.equals(that._outputPath) : that._outputPath != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = _name.hashCode();
result = 31 * result + _allSourceRoots.hashCode();
result = 31 * result + _classpath.hashCode();
result = 31 * result + (_outputPath != null ? _outputPath.hashCode() : 0);
result = 31 * result + _dependencies.hashCode();
return result;
}
}