blob: 995c806c36dadc96961067a271967977ac8fec11 [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.dde.internal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.uima.aae.deployment.AEDeploymentDescription;
import org.apache.uima.aae.deployment.impl.AEDeploymentDescription_Impl;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.application.metadata.impl.UimaApplication_Impl;
import org.apache.uima.dde.internal.page.AEConfigurationPage;
import org.apache.uima.dde.internal.page.OverviewPage;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.metadata.Import;
import org.apache.uima.taeconfigurator.editors.MultiPageEditor;
import org.apache.uima.taeconfigurator.editors.MultiPageEditorContributor;
import org.apache.uima.taeconfigurator.editors.point.IUimaEditorExtension;
import org.apache.uima.taeconfigurator.editors.point.IUimaMultiPageEditor;
import org.apache.uima.taeconfigurator.editors.ui.AbstractSection;
import org.apache.uima.taeconfigurator.editors.ui.Utility;
import org.apache.uima.taeconfigurator.editors.xml.XMLEditor;
import org.apache.uima.tools.internal.cde.uima.util.UimaDescriptionUtils;
import org.apache.uima.util.InvalidXMLException;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLizable;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.ISaveablePart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.FileEditorInput;
public class DeploymentDescriptorEditor implements IUimaMultiPageEditor, IUimaEditorExtension {
protected boolean isBadXML = true;
static public final String ID = "com.ibm.apache.uima.dde.internal.MultiPageEditor";
static public final String TITLE = "UIMA DDE";
static public final String VERSION = "0.1.2";
public MultiPageEditor cde;
// private String inputFileName = null;
private IFile inputIFile;
private AEDeploymentDescription aeDD;
private OverviewPage overviewPage;
private AEConfigurationPage aeConfigPage;
/** The text editor used in page 0. */
private XMLEditor sourceTextEditor;
protected int sourceIndex = -1;
/** ********************************************************************** */
public DeploymentDescriptorEditor() {
super();
}
public void init () {
UimaApplication_Impl.initUimaApplicationFramework();
}
public boolean canEdit(MultiPageEditor cde, XMLizable xmlizable) {
if (xmlizable instanceof AEDeploymentDescription) {
return true;
}
return false;
}
public void activateEditor(IEditorSite site, IEditorInput editorInput, MultiPageEditor cde,
XMLizable xmlizable) throws PartInitException {
this.cde = cde;
aeDD = (AEDeploymentDescription) xmlizable;
inputIFile = ((IFileEditorInput) cde.getEditorInput()).getFile();
cde.setPartNameSuper(inputIFile.getName() + " (" + VERSION + ")");
isBadXML = false;
// init(site, editorInput);
// XML source editor may be opened by CDE
// when the source is "initially" invalid
if (cde.getSourceEditor() != null) {
sourceTextEditor = cde.getSourceEditor();
}
}
/* protected void init(IEditorSite site, IEditorInput input) throws PartInitException {
if (!(input instanceof IFileEditorInput)) {
throw new PartInitException("Invalid Input: " + input.getClass().getName() + " (Must be IFileEditorInput)");
}
cde.initSuper(site, input);
String filePathName = null;
inputIFile = ((IFileEditorInput) input).getFile();
filePathName = inputIFile.getLocation().toOSString();
cde.setPartNameSuper(inputIFile.getName() + " (" + VERSION + ")");
try {
aeDD = (AEDeploymentDescription) UimaXmlParsingUtil.parseUimaXmlDescriptor(filePathName);
isBadXML = false;
ResourceSpecifier aed;
try {
aed = aeDD.getAeService()
.resolveTopAnalysisEngineDescription(cde.createResourceManager(), false);
if (aed instanceof AnalysisEngineDescription
&& ( ! ((AnalysisEngineDescription) aed).isPrimitive()) ) {
// if (aeDD.getAeService().getAnalysisEngineDeploymentMetaData().isAsync()) {
// Resolve delegates
aeDD.getAeService().getAnalysisEngineDeploymentMetaData()
.resolveDelegates(cde.createResourceManager(), true);
}
} catch (InvalidXMLException e) {
e.printStackTrace();
isBadXML = true;
Utility.popMessage(Messages.getString("InvalidXMLException"), //$NON-NLS-1$
cde.getMessagesToRootCause(e), MessageDialog.ERROR);
}
} catch (InvalidXMLException e) {
Utility.popMessage(
Messages.getString("MultiPageEditor.XMLerrorInDescriptorTitle"), //$NON-NLS-1$
Messages.getString("MultiPageEditor.XMLerrorInDescriptor") + "\n" + cde.getMessagesToRootCause(e), //$NON-NLS-1$ //$NON-NLS-2$
MessageDialog.ERROR);
} catch (IOException e) {
e.printStackTrace();
Utility.popMessage(Messages.getString("IOException"), //$NON-NLS-1$
cde.getMessagesToRootCause(e), MessageDialog.ERROR);
}
} // init
*/
public void setFileDirty() {
cde.setFileDirty();
}
public AEDeploymentDescription getAEDeploymentDescription() {
return aeDD;
}
public void refresh() {
aeConfigPage.setInput(aeDD);
}
public void setInput () {
overviewPage.setInput(aeDD);
aeConfigPage.setInput(aeDD);
}
// AEMetaDataDetailsPage needs to access OverviewPage to enable/disable some controls
// (e.g., CAS Pool Size)
public OverviewPage getOverviewPage () {
return overviewPage;
}
/** ********************************************************************** */
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.forms.editor.FormEditor#addPages()
*/
public void addPagesForCurrentEditor() {
try {
// Resolve "import" (and Delegates if any);
if (aeDD != null) {
ResourceSpecifier aed;
try {
aed = aeDD.getAeService()
.resolveTopAnalysisEngineDescription(cde.createResourceManager(), false);
if (aed instanceof AnalysisEngineDescription
&& ( ! ((AnalysisEngineDescription) aed).isPrimitive()) ) {
// if (aeDD.getAeService().getAnalysisEngineDeploymentMetaData().isAsync()) {
// Resolve delegates
aeDD.getAeService().getAnalysisEngineDeploymentMetaData()
.resolveDelegates(cde.createResourceManager(), true);
}
} catch (InvalidXMLException e) {
e.printStackTrace();
isBadXML = true;
Utility.popMessage(Messages.getString("InvalidXMLException"), //$NON-NLS-1$
cde.getMessagesToRootCause(e), MessageDialog.ERROR);
}
}
if (!isBadXML) {
cde.addPage(overviewPage = new OverviewPage(this, "123", "Overview"));
cde.addPage(aeConfigPage = new AEConfigurationPage(this, "123", "Deployment Configurations"));
}
createSourcePage();
} catch (PartInitException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (isBadXML) {
pageChangeForCurrentEditor(sourceIndex);
}
}
/**
* Creates a page of the multi-page editor, which contains a text editor.
*/
protected void createSourcePage () {
// XML source editor may be opened by CDE
// when the source is "initially" invalid
if (sourceTextEditor != null) {
return;
}
try {
sourceTextEditor = new XMLEditor(cde);
sourceIndex = cde.addPage(sourceTextEditor, cde.getEditorInput());
cde.setPageTextSuper(sourceIndex, "Source");
} catch (PartInitException e) {
ErrorDialog.openError(cde.getSite().getShell(), "Error creating nested text editor", null, e
.getStatus());
}
}
public String prettyPrintModel() {
return ((AEDeploymentDescription_Impl) aeDD).prettyPrint(MultiPageEditorContributor.getXMLindent());
}
// boolean inside = false;
boolean isPageChangeRecursion = false;
/* public void pageChangeForCurrentEditor_OLD(int newPageIndex) {
if (inside) {
return;
}
int oldPageIndex = cde.getCurrentPageSuper();
if (newPageIndex == sourceIndex) {
// Switch to Source Page
if (!isBadXML) {
updateSourceFromModel();
}
} else {
// Switch FROM Source Page
if (oldPageIndex == sourceIndex) {
// Validate source
if ( ! validateSource() ) {
inside = true;
cde.setActivePageSuper(sourceIndex);
inside = false;
return ;
}
cde.pageChangeSuper(newPageIndex);
setInput();
return;
}
}
cde.pageChangeSuper(newPageIndex);
}
*/
public void pageChangeForCurrentEditor(int newPageIndex) {
if (/*inside ||*/ isPageChangeRecursion) {
return;
}
int oldPageIndex = cde.getCurrentPageSuper();
if (oldPageIndex != -1) {
if (oldPageIndex == sourceIndex) {
if (!validateSource()) {
setActivePageWhileBlockingRecursion(sourceIndex);
return;
}
}
}
// Set the current page to source page
cde.pageChangeSuper(newPageIndex);
if (newPageIndex == sourceIndex) {
// Switch to Source Page
if (!isBadXML) {
updateSourceFromModel();
}
} else {
// Switch FROM Source Page
if (oldPageIndex == sourceIndex) {
// Validate source
if ( ! validateSource() ) {
// inside = true;
setActivePageWhileBlockingRecursion(sourceIndex);
// inside = false;
return ;
}
cde.pageChangeSuper(newPageIndex);
setInput();
return;
}
}
setActivePageWhileBlockingRecursion(newPageIndex);
}
protected void setActivePageWhileBlockingRecursion(int sourceIndex) {
try {
isPageChangeRecursion = true;
// next call needed to be done but wasn't prior to
// Eclipse 3.2
// In Eclipse 3.2 they fixed this, but call this now
// calls pageChange, and makes a recursive loop
// We break that loop here.
cde.setActivePageSuper(sourceIndex); // isn't being done otherwise?
} finally {
isPageChangeRecursion = false;
}
}
public void updateSourceFromModel() {
sourceTextEditor.setIgnoreTextEvent(true);
IDocument doc = sourceTextEditor.getDocumentProvider().getDocument(
sourceTextEditor.getEditorInput());
doc.set(prettyPrintModel());
sourceTextEditor.setIgnoreTextEvent(false);
}
public void switchToBadSource (boolean genSource) {
isBadXML = true;
if (genSource) {
updateSourceFromModel();
}
cde.setActivePageSuper(sourceIndex);
}
/** ********************************************************************** */
// From CDE MultiPageEditor.java
protected boolean validateSource () {
isBadXML = true; // preset
IDocument doc = sourceTextEditor.getDocumentProvider().getDocument(
sourceTextEditor.getEditorInput());
String text = doc.get();
InputStream is;
try {
is = new ByteArrayInputStream(text.getBytes(cde.getCharSet(text)));
} catch (UnsupportedEncodingException e2) {
Utility.popMessage(Messages.getString("MultiPageEditor.19"), //$NON-NLS-1$
cde.getMessagesToRootCause(e2), MessageDialog.ERROR);
// super.setActivePage(sourceIndex);
return false;
}
// Set the location of XML descriptor
String filePathName = getFile().getLocation().toString();
XMLInputSource input = new XMLInputSource(is, new File(filePathName));
// Parse the XML descriptor
try {
XMLizable inputDescription = UimaDescriptionUtils.parseDescriptor(input);
if (inputDescription instanceof AEDeploymentDescription) {
aeDD = (AEDeploymentDescription) inputDescription;
ResourceSpecifier aed = aeDD.getAeService()
.resolveTopAnalysisEngineDescription(cde.createResourceManager(), false);
if (aed instanceof AnalysisEngineDescription
&& ( ! ((AnalysisEngineDescription) aed).isPrimitive()) ) {
// if (aeDD.getAeService().getAnalysisEngineDeploymentMetaData().isAsync()) {
// Resolve delegates
aeDD.getAeService().getAnalysisEngineDeploymentMetaData()
.resolveDelegates(cde.createResourceManager(), true);
}
isBadXML = false;
} else {
String msg = Messages.getFormattedString(
"Unrecognized descriptor type for file ''{0}''.", //$NON-NLS-1$
new String[] { AbstractSection.maybeShortenFileName(filePathName) })
+ "\n"; //$NON-NLS-1$
Utility.popMessage("Error", //$NON-NLS-1$
msg, MessageDialog.ERROR);
return false;
}
} catch (InvalidXMLException e) {
// super.setActivePage(sourceIndex);
Utility.popMessage(Messages.getString("InvalidXMLException"), //$NON-NLS-1$
cde.getMessagesToRootCause(e), MessageDialog.ERROR);
return false;
}
return true;
}
/** **************************** Possible Merge with CDE ***************************** */
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
*/
public void doSaveForCurrentEditor(IProgressMonitor monitor) {
if (cde.getCurrentPageSuper() != sourceIndex) {
updateSourceFromModel(); // Only when it is not in source page
}
sourceTextEditor.doSave(monitor);
cde.setFileDirtyFlag(false);
cde.firePropertyChangeSuper(ISaveablePart.PROP_DIRTY);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorPart#doSaveAs()
*/
public void doSaveAsForCurrentEditor() {
if (cde.getCurrentPageSuper() != sourceIndex) {
updateSourceFromModel(); // Only when it is not in source page
}
cde.setSaveAsStatus(cde.SAVE_AS_STARTED);
sourceTextEditor.doSaveAs();
if (cde.m_nSaveAsStatus == cde.SAVE_AS_CANCELLED) {
cde.m_nSaveAsStatus = cde.SAVE_AS_NOT_IN_PROGRESS;
return;
}
// should only do if editorInput is new
FileEditorInput newEditorInput = (FileEditorInput) sourceTextEditor.getEditorInput();
// if(old)
cde.setInputSuper(newEditorInput);
cde.firePropertyChangeSuper(cde.PROP_INPUT);
// setTitle(newEditorInput.getFile().getName());
cde.setPartNameSuper(newEditorInput.getFile().getName());
// this next does NOT seem to change the overall page title
cde.firePropertyChangeSuper(cde.PROP_TITLE);
cde.setFileDirtyFlag(false);
cde.firePropertyChangeSuper(ISaveablePart.PROP_DIRTY);
}
/** ************************* From CDE ********************************** */
/**
* @return current file being edited
*/
public IFile getFile() {
return inputIFile;
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
private IJavaProject javaProject = null;
public IJavaProject getJavaProject() {
IFile iFile = getFile();
if (null == javaProject && null != iFile) {
javaProject = JavaCore.create(iFile.getProject());
}
return javaProject;
}
/**
* Convenience method to get the workspace root.
*/
public IWorkspaceRoot getWorkspaceRoot() {
return ResourcesPlugin.getWorkspace().getRoot();
}
// Won't work for "linked" project !
// public String getDescriptorRelativePath(String aFullOrRelativePath) {
// String sEditorFileFullPath = getFile().getLocation().toString();
// String sFullOrRelativePath = aFullOrRelativePath.replace('\\', '/');
//
// // Won't work for "linked" project !
// // Comment out !
// //
// // first, if not in workspace, or if a relative path, not a full path, return path
// // String sWorkspacePath = getWorkspace().getRoot().getLocation().toString();
// // if (sFullOrRelativePath.indexOf(sWorkspacePath) == -1) {
// // return sFullOrRelativePath;
// // }
//
// String sFullPath = sFullOrRelativePath; // rename the var to its semantics
//
// String commonPrefix = getCommonParentFolder(sEditorFileFullPath, sFullPath);
// if (commonPrefix.length() < 2 || commonPrefix.indexOf(':') == commonPrefix.length() - 2) {
// return sFullPath;
// }
//
// // now count extra slashes to determine how many ..'s are needed
// int nCountBackDirs = 0;
// String sRelativePath = ""; //$NON-NLS-1$
// for (int i = commonPrefix.length(); i < sEditorFileFullPath.length(); i++) {
// if (sEditorFileFullPath.charAt(i) == '/') {
// sRelativePath += "../"; //$NON-NLS-1$
// nCountBackDirs++;
// }
// }
// sRelativePath += sFullPath.substring(commonPrefix.length());
// return sRelativePath;
// }
/**
* Open top level's Xml descriptor in new window
*/
public void openTopLevelXmlDescriptor(Import importItem) {
cde.open(cde.getAbsolutePathFromImport(importItem));
}
}