blob: 8ee47cb9dd43b6970ee73ff8fa801ac328414caf [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.utils.apply;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.uima.UIMAFramework;
import org.apache.uima.analysis_engine.AnalysisEngine;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.impl.XmiCasDeserializer;
import org.apache.uima.cas.impl.XmiCasSerializer;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.ruta.addons.RutaAddonsPlugin;
import org.apache.uima.ruta.engine.RutaEngine;
import org.apache.uima.ruta.ide.core.builder.RutaProjectUtils;
import org.apache.uima.util.FileUtils;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLSerializer;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.xml.sax.SAXException;
public abstract class AbstractApplyScriptHandlerJob extends Job {
private ExecutionEvent event;
private IFile scriptFile;
private boolean createXMI;
AbstractApplyScriptHandlerJob(ExecutionEvent event, IFile scriptFile, boolean createXMI) {
super("Applying " + scriptFile.getName() + "...");
this.event = event;
this.scriptFile = scriptFile;
this.createXMI = createXMI;
setUser(true);
}
@Override
public IStatus run(IProgressMonitor monitor) {
monitor.beginTask("Collecting files...", 1);
if (HandlerUtil.getCurrentSelection(event) instanceof IStructuredSelection) {
StructuredSelection selection = (StructuredSelection) HandlerUtil.getCurrentSelection(event);
Iterator<?> iter = selection.iterator();
IResource first = null;
List<IPath> paths = new ArrayList<IPath>();
while (iter.hasNext()) {
Object object = iter.next();
if (object instanceof IResource) {
IResource resource = (IResource) object;
if (first == null) {
first = resource;
}
paths.addAll(getPaths(resource));
}
}
CAS cas = null;
AnalysisEngine ae = null;
try {
IPath rootPath = RutaProjectUtils.getDescriptorRootPath(scriptFile.getProject());
IPath descriptorPath = RutaProjectUtils.getAnalysisEngineDescriptorPath(
scriptFile.getLocation(), scriptFile.getProject());
XMLInputSource in = new XMLInputSource(descriptorPath.toPortableString());
ResourceSpecifier specifier = UIMAFramework.getXMLParser().parseResourceSpecifier(in);
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
resMgr.setDataPath(rootPath.toPortableString());
ae = UIMAFramework.produceAnalysisEngine(specifier, resMgr, null);
initAE(ae);
ae.reconfigure();
} catch (Exception e) {
DLTKCore.error(e.getMessage(), e);
return Status.CANCEL_STATUS;
}
monitor.beginTask("Processing... ", paths.size());
for (IPath path : paths) {
if (monitor.isCanceled()) {
break;
}
monitor.setTaskName("Processing " + path.lastSegment() + "... ");
try {
if (cas == null) {
cas = ae.newCAS();
} else {
cas.reset();
}
if (path.getFileExtension().equals("xmi")) {
XmiCasDeserializer.deserialize(new FileInputStream(path.toPortableString()), cas, true);
} else {
cas.setDocumentText(getText(path.toPortableString()));
}
RutaEngine.removeSourceDocumentInformation(cas);
RutaEngine.addSourceDocumentInformation(cas, new File(path.toPortableString()));
ae.process(cas);
} catch (Exception e) {
DLTKCore.error(e.getMessage(), e);
monitor.worked(1);
continue;
}
if (createXMI) {
monitor.setTaskName("Writing " + path.lastSegment() + "... ");
File newFile = null;
if (path.getFileExtension().equals("xmi")) {
newFile = new File(path.toPortableString());
} else {
newFile = new File(path.toPortableString() + ".xmi");
}
try {
writeXmi(cas, newFile);
} catch (Exception e) {
DLTKCore.error(e.getMessage(), e);
monitor.worked(1);
continue;
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IPath makeRelativeTo = path.makeRelativeTo(root.getLocation());
IResource resource = root.findMember(makeRelativeTo);
try {
if (resource != null) {
resource.getParent()
.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
}
} catch (CoreException e) {
}
}
monitor.worked(1);
}
if (cas != null) {
cas.release();
}
if (ae != null) {
ae.destroy();
}
}
monitor.done();
return Status.OK_STATUS;
}
private static void writeXmi(CAS aCas, File name) throws IOException, SAXException {
FileOutputStream out = null;
try {
// write XMI
out = new FileOutputStream(name);
XmiCasSerializer ser = new XmiCasSerializer(aCas.getTypeSystem());
XMLSerializer xmlSer = new XMLSerializer(out, false);
ser.serialize(aCas, xmlSer.getContentHandler());
} catch (Exception e) {
RutaAddonsPlugin.error(e);
} finally {
if (out != null) {
out.close();
}
}
}
private List<IPath> getPaths(IResource resource) {
List<IPath> paths = new ArrayList<IPath>();
if (resource instanceof IFile) {
IFile file = (IFile) resource;
String fileExtension = file.getFileExtension();
if ("txt".equals(fileExtension) || "html".equals(fileExtension)
|| "xmi".equals(fileExtension) || "htm".equals(fileExtension)) {
paths.add(file.getLocation());
}
} else if (resource instanceof IFolder) {
IFolder folder = (IFolder) resource;
try {
IResource[] members = folder.members();
for (IResource each : members) {
paths.addAll(getPaths(each));
}
} catch (CoreException e) {
}
}
return paths;
}
abstract void initAE(AnalysisEngine ae);
private static String getText(String each) {
try {
return FileUtils.file2String(new File(each), "UTF-8");
} catch (IOException e) {
DLTKCore.error(e.getMessage(), e);
}
return "";
}
}