package au.com.langdale.cimtoole.editors; import static au.com.langdale.ui.builder.Templates.Field; import static au.com.langdale.ui.builder.Templates.Form; import static au.com.langdale.ui.builder.Templates.Grid; import static au.com.langdale.ui.builder.Templates.Group; import static au.com.langdale.ui.builder.Templates.Label; import static au.com.langdale.ui.builder.Templates.PushButton; import static au.com.langdale.ui.builder.Templates.RadioButton; import static au.com.langdale.ui.builder.Templates.Row; import static au.com.langdale.ui.builder.Templates.TreeViewer; import static au.com.langdale.jena.TreeModelBase.label; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import au.com.langdale.cimtoole.project.Info; import au.com.langdale.cimtoole.project.Task; import au.com.langdale.cimtoole.wizards.SearchWizard; import au.com.langdale.cimtoole.wizards.SearchWizard.Searchable; import au.com.langdale.jena.JenaTreeBinding; import au.com.langdale.jena.JenaTreeModelBase; import au.com.langdale.jena.MappingTree; import au.com.langdale.jena.MappingTree.DatatypeNode; import au.com.langdale.jena.MappingTree.EquivNode; import au.com.langdale.jena.MappingTree.FunctionalNode; import au.com.langdale.jena.MappingTree.MappingNode; import au.com.langdale.jena.MappingTree.SuperClassNode; import au.com.langdale.jena.TreeModelBase.Node; import au.com.langdale.jena.UMLTreeModel; import au.com.langdale.kena.OntModel; import au.com.langdale.kena.OntResource; import au.com.langdale.kena.Property; import au.com.langdale.kena.Resource; import au.com.langdale.kena.ResourceFactory; import au.com.langdale.ui.binding.TextBinding; import au.com.langdale.ui.binding.Validators; import au.com.langdale.ui.builder.Assembly; import au.com.langdale.ui.builder.FurnishedEditor; import au.com.langdale.ui.builder.Template; import au.com.langdale.ui.util.IconCache; import au.com.langdale.ui.util.WizardLauncher; import au.com.langdale.xmi.UML; import com.hp.hpl.jena.vocabulary.RDFS; public class MappingEditor extends ModelEditor { private MappingTree tree = new MappingTree(); @Override public void init(IEditorSite site, IEditorInput editorInput)throws PartInitException { super.init(site, editorInput); fetchModels(); } private void fetchModels() { fromBinding.fetchModel(); toBinding.fetchModel(); tree.setOntModel(models.getOntology(getFile())); tree.setSource(getFile().getFullPath().toString()); tree.setRootResource(UML.global_package); } public void modelCached(IResource key) { fetchModels(); doRefresh(); } public void modelDropped(IResource key) { close(); } @Override public JenaTreeModelBase getTree() { return tree; } @Override protected void createPages() { addPage(main); } public class UMLTreeBinding extends JenaTreeBinding implements Searchable { public UMLTreeBinding() { super(new UMLTreeModel()); setRootVisible(false); } public void bindAfter(String name, Assembly plumbing, Object after) { super.bind(name, plumbing, after); getViewer().addSelectionChangedListener(plumbing.selectionChangedlistener); listenToSelection(getViewer()); } public final SelectionListener search = new SelectionListener() { public void widgetSelected(SelectionEvent e) { SearchWizard wizard = new SearchWizard(UMLTreeBinding.this); WizardLauncher.run(wizard, getSite().getWorkbenchWindow(), StructuredSelection.EMPTY); } public void widgetDefaultSelected(SelectionEvent e) { } }; public void fetchModel() { getTree().setOntModel(models.getProjectOntology(Info.getSchemaFolder(getFile().getProject()))); getTree().setRootResource(UML.global_package); } public OntModel getOntModel() { return getTree().getOntModel(); } public Node findNode(Resource target) { Node[] path = getTree().findPathTo(target, false); return path != null? path[path.length-1]: null; } public void previewTarget(Node node) { getViewer().setSelection(new TreeSelection(new TreePath(node.getPath(false))), true); } public String getDescription() { return "Search the schema for a class to be mapped."; } public Property getCriterion() { return ResourceFactory.createProperty(RDFS.label); } private OntResource getSelectedResource() { ITreeSelection selected = (ITreeSelection) getViewer().getSelection(); if( ! selected.isEmpty()) { Node node = (Node) selected.getPaths()[0].getLastSegment(); return node.getSubject(); } else return null; } public OntResource getResource() { return selected; } public void setResource(OntResource selected) { this.selected = selected; } private OntResource selected; public void refresh() { if( selected != null && ! selected.equals(getSelectedResource())) { Node node = findNode(selected); if( node != null ) previewTarget(node); } } public void reset() { } public void update() { selected = getSelectedResource(); } public String validate() { return null; } } @Override public void doSave(IProgressMonitor monitor) { OntModel model = tree.getOntModel(); if( model != null) { try { ResourcesPlugin.getWorkspace().run(Task.saveMappings(getFile(), model), monitor); } catch (CoreException e) { throw new RuntimeException(e); } } super.doSave(monitor); } UMLTreeBinding fromBinding = new UMLTreeBinding(); UMLTreeBinding toBinding = new UMLTreeBinding(); TextBinding name = new TextBinding(Validators.NCNAME_OPT) { protected String createSuggestion() { return label(fromBinding.getResource()) + "." + label(toBinding.getResource()); }; }; private MappingNode focusNode; private SelectionListener add = new SelectionListener() { public void widgetSelected(SelectionEvent e) { focusNode.create(); markDirty(); tree.getRoot().structureChanged(); doRefresh(); } public void widgetDefaultSelected(SelectionEvent e) { } }; private SelectionListener remove = new SelectionListener() { public void widgetSelected(SelectionEvent e) { focusNode.remove(); markDirty(); tree.getRoot().structureChanged(); doRefresh(); } public void widgetDefaultSelected(SelectionEvent e) { } }; FurnishedEditor main = new FurnishedEditor("") { @Override protected Content createContent() { return new Content(getToolkit(), false) { @Override protected Template define() { return Form( Grid( Group( Label("Select CIM (common) class"), Row(PushButton("search_from", "Search 'from' Class", "search")), Label("Select extension class or type"), Row(PushButton("search_to", "Search 'to' Class", "search"))), Group( TreeViewer("left"), null, TreeViewer("right")), null, Group(Grid(Group( Label("Property Name:"), Field("name"), Row( RadioButton("functional", "Functional Property", "functional"), RadioButton("equiv", "Equivalent class", "equiv"), RadioButton("superclass", "Superclass", "superclass"), PushButton("add", "Add Mapping", "plus"), PushButton("remove", "Remove Mapping", "minus") ) ))) ) ); } private MappingNode lastOutlineNode; protected void addBindings() { fromBinding.bindAfter("left", this, null); toBinding.bindAfter("right", this, fromBinding); name.bindAfter("name", this, toBinding); addListener("add", add); addListener("remove", remove); addListener("search_from", fromBinding.search); addListener("search_to", toBinding.search); getOutline().addSelectionChangedListener(selectionChangedlistener); }; public void update() { Node node = getNode(); if( node != lastOutlineNode && (node instanceof MappingNode)) { focusNode = (MappingNode)node; name.setText(focusNode.getName()); fromBinding.setResource(focusNode.getRelated()); toBinding.setResource(focusNode.getSubject()); lastOutlineNode = focusNode; } else { focusNode = tree.makeNode( name.getText(), toBinding.getResource(), fromBinding.getResource(), getButton("functional").getSelection(), getButton("equiv").getSelection()); } } public void refresh() { getForm().setImage(IconCache.getIcons().get("equiv")); getForm().setText("Create mappings between schema classes"); getButton("remove").setEnabled(focusNode != null && focusNode.extant()); getButton("add").setEnabled( !(focusNode == null || focusNode.extant() || focusNode.isProperty() && name.getText().isEmpty())); getText("name").setEnabled(focusNode != null && focusNode.isProperty()); getButton("search_from").setEnabled(fromBinding.getOntModel() != null); getButton("search_to").setEnabled(toBinding.getOntModel() != null); boolean radios = focusNode != null && ! (focusNode instanceof DatatypeNode); getButton("functional").setEnabled(radios); getButton("equiv").setEnabled(radios); getButton("superclass").setEnabled(radios); getButton("functional").setSelection(focusNode instanceof FunctionalNode); getButton("equiv").setSelection(focusNode instanceof EquivNode); getButton("superclass").setSelection(focusNode instanceof SuperClassNode); } }; } }; }