blob: 01f2e6f56e7e8f90d6d8eb0c8d91ad255c3bde24 [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.taeconfigurator.editors.ui;
import org.apache.uima.resource.ExternalResourceDescription;
import org.apache.uima.resource.FileLanguageResourceSpecifier;
import org.apache.uima.resource.FileResourceSpecifier;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.impl.ExternalResourceDescription_impl;
import org.apache.uima.resource.impl.FileLanguageResourceSpecifier_impl;
import org.apache.uima.resource.impl.FileResourceSpecifier_impl;
import org.apache.uima.resource.metadata.ExternalResourceBinding;
import org.apache.uima.resource.metadata.impl.ExternalResourceBinding_impl;
import org.apache.uima.taeconfigurator.editors.MultiPageEditor;
import org.apache.uima.taeconfigurator.editors.ui.dialogs.AddExternalResourceDialog;
import org.apache.uima.taeconfigurator.wizards.ResourceManagerConfigurationNewWizard;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.IManagedForm;
/**
*/
public class ExtnlResBindSection extends AbstractSection {
private final static String boundHeader = "Bound to: ";
private Composite sectionClient;
private Tree tree;
private Button addButton;
private Button editButton;
private Button removeButton;
private Button bindButton;
private Button exportButton;
private ResourceDependencySection resourceDependencySection;
private ImportResBindSection resBindImportSection;
public ExtnlResBindSection(MultiPageEditor aEditor, Composite parent) {
super(
aEditor,
parent,
"Resources Needs, Definitions and Bindings",
"Specify External Resources; Bind them to dependencies on the right panel by selecting the corresponding dependency and clicking Bind.");
}
public void initialize(IManagedForm form) {
super.initialize(form);
// set up Composite to hold widgets in the section
sectionClient = new2ColumnComposite(getSection());
tree = newTree(sectionClient);
// Buttons
Composite buttonContainer = newButtonContainer(sectionClient);
addButton = newPushButton(buttonContainer, S_ADD,
"Click to add a new External Resource definition");
editButton = newPushButton(buttonContainer, S_EDIT,
"Click to edit an External Resource definition");
removeButton = newPushButton(buttonContainer, "Remove",
"Click to remove selected binding or External Resource");
bindButton = newPushButton(buttonContainer, "Bind",
"Click to bind selected dependency with selected Resource");
exportButton = newPushButton(buttonContainer, S_EXPORT, S_EXPORT_TIP);
buttonContainer.pack();
getSection().getParent().getParent().pack();
getSection().getParent().getParent().layout();
initialFormWidth = getSection().getSize().x;
((GridData) tree.getLayoutData()).widthHint = initialFormWidth - buttonContainer.getSize().x;
enableBorders(sectionClient);
toolkit.paintBordersFor(sectionClient);
tree.addListener(SWT.MouseDoubleClick, this);
}
public void refresh() {
if (null == resBindImportSection)
resBindImportSection = editor.getResourcesPage().getResBindImportSection();
super.refresh();
resourceDependencySection = editor.getResourcesPage().getResourceDependencySection();
ExternalResourceDescription[] xrds = getExternalResources();
ExternalResourceBinding[] bindings = getExternalResourceBindings();
tree.removeAll();
if (null != xrds) {
for (int i = 0; i < xrds.length; i++) {
addExternalResourceDescriptionToGUI(xrds[i], bindings);
}
}
enable();
}
private void addExternalResourceDescriptionToGUI(ExternalResourceDescription xrd,
ExternalResourceBinding[] bindings) {
TreeItem item = new TreeItem(tree, SWT.NONE);
fillXrdItem(item, xrd);
fillBindings(item, xrd, bindings);
item.setExpanded(true);
}
private void fillXrdItem(TreeItem item, ExternalResourceDescription xrd) {
StringBuffer text = new StringBuffer();
text.append(xrd.getName());
ResourceSpecifier rs = xrd.getResourceSpecifier();
if (rs instanceof FileLanguageResourceSpecifier) {
FileLanguageResourceSpecifier flrs = (FileLanguageResourceSpecifier) rs;
text.append(" URL_Prefix: ").append(flrs.getFileUrlPrefix()).append(" URL_Suffix: ")
.append(flrs.getFileUrlSuffix());
} else if (rs instanceof FileResourceSpecifier) {
FileResourceSpecifier frs = (FileResourceSpecifier) rs;
text.append(" URL: ").append(frs.getFileUrl());
} else {
text.append(" Custom Resource Specifier");
}
String implName = xrd.getImplementationName();
if (null != implName && !implName.equals("")) {
text.append(" Implementation: ").append(implName);
}
item.setText(text.toString());
item.setData(xrd);
}
private void fillBindings(TreeItem parent, ExternalResourceDescription xrd,
ExternalResourceBinding[] bindings) {
if (null != bindings) {
for (int i = 0; i < bindings.length; i++) {
if (bindings[i].getResourceName().equals(xrd.getName())) {
addBindingToGUI(parent, bindings[i].getKey(), bindings[i]);
}
}
}
}
private void addBindingToGUI(TreeItem parent, String key, ExternalResourceBinding xrb) {
TreeItem item = new TreeItem(parent, SWT.NONE);
item.setText(boundHeader + key);
item.setData(xrb);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
if (event.widget == addButton)
handleAdd();
else if (event.widget == editButton || event.type == SWT.MouseDoubleClick)
handleEdit();
else if (event.widget == removeButton
|| (event.widget == tree && event.type == SWT.KeyUp && event.character == SWT.DEL))
handleRemove();
else if (event.widget == bindButton)
handleBind();
else if (event.widget == exportButton) {
try {
resBindImportSection.exportImportablePart("<resourceManagerConfiguration>",
ResourceManagerConfigurationNewWizard.RESOURCEMANGERCONFIGURATION_TEMPLATE);
} finally {
refresh(); // update in case of throw, even
}
}
enable();
}
public ExternalResourceDescription getXRDescriptionFromTreeItem(TreeItem item) {
return (ExternalResourceDescription) item.getData();
}
/**
* Bindings can't be edited. They can be removed or new ones bound. External resources can be
* edited. Edit button is disabled unles an editable thing is selected. But user could double
* click an illegal entry
*
*/
private void handleEdit() {
TreeItem item = tree.getSelection()[0];
if (isBoundSpec(item))
return;
ExternalResourceDescription xrd = getXRDescriptionFromTreeItem(item);
ResourceSpecifier rs = xrd.getResourceSpecifier();
if (!((rs instanceof FileResourceSpecifier) || (rs instanceof FileLanguageResourceSpecifier))) {
Utility.popMessage("Can''t edit custom resource", "This resource is a '"
+ rs.getClass().getName()
+ "', and any edits have to be done directly in the XML in the Source view.",
MessageDialog.INFORMATION);
return;
}
AddExternalResourceDialog dialog = new AddExternalResourceDialog(this, xrd);
if (dialog.open() == Window.CANCEL)
return;
alterExistingXRD(dialog, xrd, item);
}
/**
* Add new external resource, with no bindings
*
*/
private void handleAdd() {
AddExternalResourceDialog dialog = new AddExternalResourceDialog(this);
if (dialog.open() == Window.CANCEL)
return;
ExternalResourceDescription xrd = new ExternalResourceDescription_impl();
TreeItem item = new TreeItem(tree, SWT.NONE);
alterExistingXRD(dialog, xrd, item);
getResourceManagerConfiguration().addExternalResource(xrd);
}
private void alterExistingXRD(AddExternalResourceDialog dialog, ExternalResourceDescription xrd,
TreeItem item) {
valueChanged = false;
xrd.setName(setValueChanged(dialog.xrName, xrd.getName()));
xrd.setDescription(setValueChanged(dialog.xrDescription, xrd.getDescription()));
xrd
.setImplementationName(setValueChanged(dialog.xrImplementation, xrd
.getImplementationName()));
ResourceSpecifier rs = xrd.getResourceSpecifier();
if (null == dialog.xrUrlSuffix || "".equals(dialog.xrUrlSuffix)) {
FileResourceSpecifier frs;
if (null != rs && rs instanceof FileResourceSpecifier) {
frs = (FileResourceSpecifier) rs;
} else {
frs = new FileResourceSpecifier_impl();
}
frs.setFileUrl(setValueChanged(dialog.xrUrl, frs.getFileUrl()));
xrd.setResourceSpecifier(frs);
} else {
FileLanguageResourceSpecifier flrs;
if (null != rs && rs instanceof FileLanguageResourceSpecifier) {
flrs = (FileLanguageResourceSpecifier) rs;
} else {
flrs = new FileLanguageResourceSpecifier_impl();
}
flrs.setFileUrlPrefix(setValueChanged(dialog.xrUrl, flrs.getFileUrlPrefix()));
flrs.setFileUrlSuffix(setValueChanged(dialog.xrUrlSuffix, flrs.getFileUrlSuffix()));
xrd.setResourceSpecifier(flrs);
}
fillXrdItem(item, xrd);
if (valueChanged)
setFileDirty();
}
/**
* Bind button - enabled only when one dependency is selected, and one External Resource, not
* already bound to this key, is selected
*/
private void handleBind() {
TreeItem xrItem = tree.getSelection()[0];
if (null != xrItem.getParentItem())
xrItem = xrItem.getParentItem();
ExternalResourceDescription xrd = getXRDescriptionFromTreeItem(xrItem);
TableItem keyItem = resourceDependencySection.getTable().getSelection()[0];
ExternalResourceBinding xrb = new ExternalResourceBinding_impl();
String key = keyItem.getText(ResourceDependencySection.KEY_COL);
xrb.setKey(key);
xrb.setResourceName(xrd.getName());
getResourceManagerConfiguration().addExternalResourceBinding(xrb);
addBindingToGUI(xrItem, key, xrb);
xrItem.setExpanded(true);
keyItem.setText(0, "Bound");
keyItem.getParent().getColumn(0).pack();
setFileDirty();
}
/**
* remove either a binding or an external resource. Removing the resource removes all bindings
* associated with it
*
*/
private void handleRemove() {
int selectionCount = tree.getSelectionCount();
if (1 != selectionCount)
return;
TreeItem item = tree.getSelection()[0];
if (null == item.getParentItem()) { // case of removing a resource
if (Window.CANCEL == Utility
.popOkCancel("Removing Resource",
"Removing an External Resource and all its bindings. Resource name:"
+ item.getText(), MessageDialog.WARNING))
return;
removeAllBindings(item);
removeResource(item);
} else { // case of removing a binding
removeBinding(item);
}
}
public ExternalResourceBinding getXRBindingFromTreeItem(TreeItem item) {
return (ExternalResourceBinding) item.getData();
}
private void removeBinding(TreeItem item) {
ExternalResourceBinding xrb = getXRBindingFromTreeItem(item);
getResourceManagerConfiguration().removeExternalResourceBinding(xrb);
removeBoundFlagInDependencySection(xrb);
item.dispose();
setFileDirty();
}
private void removeBoundFlagInDependencySection(ExternalResourceBinding xrb) {
String key = xrb.getKey();
TableItem[] items = resourceDependencySection.getTable().getItems();
for (int i = 0; i < items.length; i++) {
if (key.equals(items[i].getText(ResourceDependencySection.KEY_COL)))
items[i].setText(0, ""); // reset bound
}
}
private void removeAllBindings(TreeItem item) {
TreeItem[] items = item.getItems();
for (int i = items.length - 1; i >= 0; i--) {
removeBinding(items[i]);
}
}
private void removeResource(TreeItem item) {
ExternalResourceDescription xrd = getXRDescriptionFromTreeItem(item);
getResourceManagerConfiguration().removeExternalResource(xrd);
item.dispose();
setFileDirty();
}
public void enable() {
// bind enabled when one item in tree and one in table is selected
bindButton.setEnabled(tree.getSelectionCount() == 1
&& resourceDependencySection.getTable().getSelectionCount() == 1
&& "".equals(resourceDependencySection.getTable().getSelection()[0].getText(0))); // not
// bound
removeButton.setEnabled(tree.getSelectionCount() > 0);
editButton.setEnabled(tree.getSelectionCount() == 1 && !isBoundSpec(tree.getSelection()[0]));
exportButton.setEnabled(tree.getItemCount() > 0);
}
private boolean isBoundSpec(TreeItem item) {
return item.getText().startsWith(boundHeader);
}
public boolean resourceNameAlreadyDefined(String name) {
ExternalResourceDescription[] xrds = getExternalResources();
if (xrds != null) {
for (int i = 0; i < xrds.length; i++) {
if (xrds[i].getName().equals(name)) {
Utility.popMessage("Name Already Defined",
"The External Resource Name specified is already defined", MessageDialog.ERROR);
return true;
}
}
}
return false;
}
}