blob: f252921d9790e80499f647d380b69a347975921e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.ide.core.builder;
import java.util.ArrayList;
import java.util.List;
import org.apache.uima.ruta.engine.RutaEngine;
import org.apache.uima.ruta.extensions.IEngineLoader;
import org.apache.uima.ruta.extensions.IRutaActionExtension;
import org.apache.uima.ruta.extensions.IRutaBooleanFunctionExtension;
import org.apache.uima.ruta.extensions.IRutaConditionExtension;
import org.apache.uima.ruta.extensions.IRutaNumberFunctionExtension;
import org.apache.uima.ruta.extensions.IRutaStringFunctionExtension;
import org.apache.uima.ruta.extensions.IRutaTypeFunctionExtension;
import org.apache.uima.ruta.ide.RutaIdeCorePlugin;
import org.apache.uima.ruta.ide.core.RutaCorePreferences;
import org.apache.uima.ruta.ide.core.RutaExtensionManager;
import org.apache.uima.ruta.ide.parser.ast.RutaModuleDeclaration;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.builder.AbstractBuildParticipantType;
import org.eclipse.dltk.core.builder.IBuildChange;
import org.eclipse.dltk.core.builder.IBuildContext;
import org.eclipse.dltk.core.builder.IBuildParticipant;
import org.eclipse.dltk.core.builder.IBuildParticipantExtension;
import org.eclipse.dltk.core.builder.IBuildParticipantExtension2;
import org.eclipse.dltk.core.builder.IBuildParticipantExtension3;
import org.eclipse.dltk.core.builder.IBuildState;
import org.eclipse.jface.preference.IPreferenceStore;
public class RutaBuilder extends AbstractBuildParticipantType implements IBuildParticipant,
IBuildParticipantExtension, IBuildParticipantExtension2, IBuildParticipantExtension3 {
private IScriptProject project;
public RutaBuilder() {
super();
}
public RutaBuilder(IScriptProject project) {
super();
this.project = project;
}
private void generateDescriptorResources(ISourceModule sourceModule,
ModuleDeclaration moduleDeclaration) {
IProgressMonitor monitor = createMonitor(10);
try {
IContainer container = getContainer(sourceModule);
IPath outputPath = getAbsolutePath(sourceModule);
IPath[] generateResources = generateResources(moduleDeclaration, outputPath, container,
sourceModule);
monitor.worked(2);
String defaultDescriptorLocation = RutaProjectUtils.getDefaultDescriptorLocation();
IFolder folder = container.getProject().getFolder(defaultDescriptorLocation);
for (IPath iPath : generateResources) {
iPath = iPath.makeRelativeTo(folder.getLocation());
IResource findMember = folder.findMember(iPath);
if (findMember != null) {
findMember.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
findMember.getParent().refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
}
}
folder.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor,
generateResources.length));
monitor.worked(1);
} catch (ModelException e) {
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
} catch (CoreException e) {
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
}
monitor.done();
}
private IPath[] generateResources(ModuleDeclaration moduleDeclaration, IPath outputPath,
IContainer container, ISourceModule sourceModule) {
List<IPath> result = new ArrayList<IPath>();
if (moduleDeclaration instanceof RutaModuleDeclaration) {
RutaModuleDeclaration tmmd = (RutaModuleDeclaration) moduleDeclaration;
DescriptorManager sm = tmmd.descriptorInfo;
IPath pathToModule = sourceModule.getResource().getLocation();
String elementName = RutaProjectUtils.getModuleName(pathToModule);
IScriptProject proj = sourceModule.getScriptProject();
// TODO: dont use desc path!
IPath descPath = RutaProjectUtils.getDescriptorRootPath(proj.getProject());
IPath scriptPath = RutaProjectUtils.getScriptRootPath(proj.getProject());
IPath descPackagePath = RutaProjectUtils.getDescriptorPackagePath(sourceModule.getResource()
.getLocation(), proj.getProject());
String typeSystem = descPackagePath.append(elementName + "TypeSystem.xml").toPortableString();
String engine = descPackagePath.append(elementName + "Engine.xml").toPortableString();
String basicTS = descPath.append("BasicTypeSystem.xml").toPortableString();
String basicE = descPath.append("BasicEngine.xml").toPortableString();
// TODO: may not work with other script folders
IPath relativeTo = pathToModule.makeAbsolute().makeRelativeTo(scriptPath);
List<String> scriptPathList = new ArrayList<String>();
List<String> descriptorPathList = new ArrayList<String>();
// add all folders
try {
List<IFolder> scriptFolders = RutaProjectUtils.getAllScriptFolders(proj);
scriptPathList.addAll(RutaProjectUtils.getFolderLocations(scriptFolders));
} catch (CoreException e) {
RutaIdeCorePlugin.error(e);
}
try {
List<IFolder> descriptorFolders = RutaProjectUtils.getAllDescriptorFolders(proj
.getProject());
descriptorPathList.addAll(RutaProjectUtils.getFolderLocations(descriptorFolders));
} catch (Exception e) {
RutaIdeCorePlugin.error(e);
}
String[] descriptorPaths = descriptorPathList.toArray(new String[0]);
String[] scriptPaths = scriptPathList.toArray(new String[0]);
String mainScript = relativeTo.toPortableString();
mainScript = mainScript.replaceAll("/", ".");
if (mainScript.endsWith(RutaEngine.SCRIPT_FILE_EXTENSION)) {
mainScript = mainScript.substring(0, mainScript.length() - 5);
}
build(basicTS, basicE, typeSystem, engine, sm, mainScript, scriptPaths, descriptorPaths);
IPath tsPath = Path.fromPortableString(typeSystem);
IPath ePath = Path.fromPortableString(engine);
result.add(tsPath);
result.add(ePath);
}
return result.toArray(new IPath[0]);
}
private void build(String basicTypesystem, String basicEngine, String typeSystemDest,
String engineDest, DescriptorManager sm, String mainScript, String[] scriptPaths,
String[] enginePaths) {
RutaSimpleBuilder builder = null;
try {
builder = new RutaSimpleBuilder(basicTypesystem, basicEngine);
} catch (Exception e) {
DLTKCore.error(e.getMessage(), e);
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
}
IRutaConditionExtension[] conditionExtensions = RutaExtensionManager.getDefault()
.getRutaConditionExtensions();
IRutaActionExtension[] actionExtensions = RutaExtensionManager.getDefault()
.getRutaActionExtensions();
IRutaBooleanFunctionExtension[] booleanFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaBooleanFunctionExtensions();
IRutaNumberFunctionExtension[] numberFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaNumberFunctionExtensions();
IRutaStringFunctionExtension[] stringFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaStringFunctionExtensions();
IRutaTypeFunctionExtension[] typeFunctionExtensions = RutaExtensionManager.getDefault()
.getRutaTypeFunctionExtensions();
IEngineLoader[] engineExtensions = RutaExtensionManager.getDefault().getEngineExtensions();
List<String> language = new ArrayList<String>();
List<String> engines = new ArrayList<String>();
for (IRutaConditionExtension each : conditionExtensions) {
language.add(each.getClass().getName());
}
for (IRutaActionExtension each : actionExtensions) {
language.add(each.getClass().getName());
}
for (IRutaBooleanFunctionExtension each : booleanFunctionExtensions) {
language.add(each.getClass().getName());
}
for (IRutaNumberFunctionExtension each : numberFunctionExtensions) {
language.add(each.getClass().getName());
}
for (IRutaStringFunctionExtension each : stringFunctionExtensions) {
language.add(each.getClass().getName());
}
for (IRutaTypeFunctionExtension each : typeFunctionExtensions) {
language.add(each.getClass().getName());
}
for (IEngineLoader each : engineExtensions) {
engines.add(each.getClass().getName());
}
try {
RutaBuildOptions option = new RutaBuildOptions(language, engines);
IPreferenceStore store = RutaIdeCorePlugin.getDefault().getPreferenceStore();
option.setImportByName(store.getBoolean(RutaCorePreferences.BUILDER_IMPORT_BY_NAME));
option.setResolveImports(store.getBoolean(RutaCorePreferences.BUILDER_RESOLVE_IMPORTS));
builder.build(sm, typeSystemDest, engineDest, option, mainScript, scriptPaths, enginePaths);
} catch (Exception e) {
DLTKCore.error(e.getMessage(), e);
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
}
}
private IProgressMonitor createMonitor(int totalWork) {
IProgressMonitor pm = new NullProgressMonitor();
pm.beginTask("Creating descriptors ", totalWork);
return pm;
}
public static IContainer getContainer(ISourceModule sourceModule) {
try {
IResource file = sourceModule.getCorrespondingResource();
return file.getParent();
} catch (ModelException e) {
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
}
return null;
}
public static IPath getAbsolutePath(ISourceModule sourceModule) {
try {
IResource file = sourceModule.getCorrespondingResource();
IPath absolutePath = file.getRawLocation().removeLastSegments(1);
return absolutePath;
} catch (ModelException e) {
if (DLTKCore.DEBUG_PARSER) {
e.printStackTrace();
}
}
return null;
}
public static IPath getRelativePath(ISourceModule sourceModule, String resourceName) {
IContainer parent = getContainer(sourceModule);
IPath relativePath = parent.getFullPath();
IPath relativeFilePath = relativePath.append(resourceName);
return relativeFilePath;
}
public void clean() {
}
public void prepare(IBuildChange buildChange, IBuildState buildState) throws CoreException {
}
public void buildExternalModule(IBuildContext context) throws CoreException {
}
public boolean beginBuild(int buildType) {
return buildType != RECONCILE_BUILD;
}
public void endBuild(IProgressMonitor monitor) {
}
public void build(IBuildContext context) throws CoreException {
final ModuleDeclaration ast = (ModuleDeclaration) context
.get(IBuildContext.ATTR_MODULE_DECLARATION);
ISourceModule sourceModule = context.getSourceModule();
generateDescriptorResources(sourceModule, ast);
}
@Override
public IBuildParticipant createBuildParticipant(IScriptProject project) throws CoreException {
return new RutaBuilder(project);
}
}