package org.drools.guvnor.server.builder;
import org.drools.guvnor.client.common.AssetFormats;
import org.drools.lang.dsl.DSLMappingParseException;
import org.drools.lang.dsl.DSLTokenizedMappingFile;
import org.drools.repository.AssetItem;
import org.drools.repository.PackageItem;
import org.drools.repository.RulesRepositoryException;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class DSLLoader {
public static List<DSLTokenizedMappingFile> loadDSLMappingFiles(PackageItem packageItem) {
return loadDSLMappingFiles(packageItem, new BRMSPackageBuilder.DSLErrorEvent() {
public void recordError(AssetItem asset,
String message) {
// ignore at this point...
}
});
}
public static List<DSLTokenizedMappingFile> loadDSLMappingFiles(PackageItem packageItem,
BRMSPackageBuilder.DSLErrorEvent dslErrorEvent) {
return loadDSLMappingFiles(packageItem.listAssetsWithVersionsSpecifiedByDependenciesByFormat(AssetFormats.DSL), dslErrorEvent);
}
static List<DSLTokenizedMappingFile> loadDSLMappingFiles(Iterator<AssetItem> assetItemIterator, BRMSPackageBuilder.DSLErrorEvent dslErrorEvent) {
List<DSLTokenizedMappingFile> result = new ArrayList<DSLTokenizedMappingFile>();
while (assetItemIterator.hasNext()) {
addAsset(dslErrorEvent, result, assetItemIterator.next());
}
return result;
}
private static void addAsset(BRMSPackageBuilder.DSLErrorEvent dslErrorEvent,
List<DSLTokenizedMappingFile> result,
AssetItem assetItem) {
if (!assetItem.getDisabled()) {
DSLTokenizedMappingFile file = new DSLTokenizedMappingFile();
try {
if (file.parseAndLoad(new StringReader(assetItem.getContent()))) {
result.add(file);
} else {
logErrors(dslErrorEvent, assetItem, file);
}
} catch (IOException e) {
throw new RulesRepositoryException(e);
}
}
}
private static void logErrors(BRMSPackageBuilder.DSLErrorEvent dslErrorEvent, AssetItem assetItem, DSLTokenizedMappingFile file) {
for (Object o : file.getErrors()) {
if(o instanceof DSLMappingParseException){
DSLMappingParseException dslMappingParseException = (DSLMappingParseException) o;
dslErrorEvent.recordError(assetItem, "Line " + dslMappingParseException.getLine() + " : " + dslMappingParseException.getMessage());
}else if(o instanceof Exception){
Exception excp = (Exception)o;
dslErrorEvent.recordError(assetItem, "Exception "+ excp.getClass()+" "+ excp.getMessage()+" "+excp.getCause());
}else{
dslErrorEvent.recordError(assetItem, "Uncategorized error "+o);
}
}
}
}