http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/util/Utils.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/util/Utils.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/util/Utils.java
new file mode 100644
index 0000000..e81cbf6
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/util/Utils.java
@@ -0,0 +1,144 @@
+/*
+* 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 io.github.taverna_extras.component.ui.util;
+
+import static 
io.github.taverna_extras.component.ui.ComponentConstants.ACTIVITY_URI;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import io.github.taverna_extras.component.api.ComponentFactory;
+import io.github.taverna_extras.component.api.Version;
+import io.github.taverna_extras.component.ui.preference.ComponentPreference;
+import 
io.github.taverna_extras.component.ui.serviceprovider.ComponentServiceIcon;
+import 
io.github.taverna_extras.component.ui.serviceprovider.ComponentServiceProvider;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.common.Named;
+import org.apache.taverna.scufl2.api.common.NamedSet;
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+import org.apache.taverna.scufl2.api.container.WorkflowBundle;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.workbench.file.FileManager;
+//import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
+//import net.sf.taverna.t2.workbench.file.FileManager;
+
+/**
+ * @author alanrw
+ */
+public class Utils {
+       // From 
http://stackoverflow.com/questions/163360/regular-expresion-to-match-urls-in-java
+       public static String URL_PATTERN = 
"^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
+       public static final String LONG_STRING = 
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+       public static final String SHORT_STRING = "XXX";
+
+       private FileManager fileManager;
+       private ServiceDescriptionRegistry registry;
+       private ComponentFactory factory;
+       private ComponentPreference prefs;
+       private ComponentServiceIcon icon;
+
+       public void setComponentFactory(ComponentFactory factory) {
+               this.factory = factory;
+       }
+       
+       public void setFileManager(FileManager fileManager) {
+               this.fileManager = fileManager;
+       }
+
+       public void setIcon(ComponentServiceIcon icon) {
+               this.icon = icon;
+       }
+       
+       public void setPrefs(ComponentPreference prefs) {
+               this.prefs = prefs;
+       }
+       
+       public void setRegistry(ServiceDescriptionRegistry registry) {
+               this.registry = registry;
+       }
+
+       public void refreshComponentServiceProvider(Configuration config) {
+               ComponentServiceProvider provider = new 
ComponentServiceProvider(
+                               factory, prefs, icon, this);
+               provider.configure(config);
+               registry.removeServiceDescriptionProvider(provider);
+               registry.addServiceDescriptionProvider(provider);
+       }
+
+       public void removeComponentServiceProvider(Configuration config) {
+               ComponentServiceProvider provider = new 
ComponentServiceProvider(
+                               factory, prefs, icon, this);
+               provider.configure(config);
+               registry.removeServiceDescriptionProvider(provider);
+       }
+
+       public boolean dataflowIsComponent(WorkflowBundle d) {
+               if (d == null)
+                       return false;
+               Object dataflowSource = fileManager.getDataflowSource(d);
+               return dataflowSource instanceof Version.ID;// FIXME Really?
+       }
+
+       public boolean currentDataflowIsComponent() {
+               return dataflowIsComponent(fileManager.getCurrentDataflow());
+       }
+
+       public static boolean isComponentActivity(Object obj) {
+               if (obj == null || !(obj instanceof Activity))
+                       return false;
+               Configuration cfg = ((Activity) obj).getConfiguration();
+               return cfg != null && ACTIVITY_URI.equals(cfg.getType());
+       }
+
+       private static final Pattern SANITIZER_RE = Pattern
+                       .compile("[^a-zA-Z0-9]+");
+       private static final Pattern SUFFIXED_RE = Pattern
+                       .compile("^(.+)_([0-9]+)$");
+
+       /**
+        * Pick a name that is unique within the context set. This is done by
+        * appending "<tt>_<i>n</i></tt>" as necessary, where <tt><i>n</i></tt> 
is a
+        * number.
+        * 
+        * @param name
+        *            The suggested name; this is always checked first.
+        * @param context
+        *            The set of things that the name will have to be unique 
within.
+        * @return A name that is definitely not the name of anything in the 
given
+        *         set.
+        */
+       public static String uniqueName(String name, NamedSet<? extends Named> 
context) {
+               String candidate = SANITIZER_RE.matcher(name).replaceAll("_");
+               if (context.getByName(candidate) == null)
+                       return candidate;
+               int counter = 0;
+               String prefix = candidate;
+               Matcher m = SUFFIXED_RE.matcher(candidate);
+               if (m.matches()) {
+                       prefix = m.group(1);
+                       counter = Integer.parseInt(m.group(2));
+               }
+               do {
+                       candidate = prefix + "_" + (++counter);
+               } while (context.getByName(candidate) != null);
+               return candidate;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivityContextViewFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivityContextViewFactory.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivityContextViewFactory.java
new file mode 100644
index 0000000..c27278f
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivityContextViewFactory.java
@@ -0,0 +1,140 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static 
io.github.taverna_extras.component.api.config.ComponentConfig.URI;
+
+import java.awt.Frame;
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.Action;
+
+import io.github.taverna_extras.component.api.ComponentFactory;
+import io.github.taverna_extras.component.ui.config.ComponentConfigureAction;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.servicedescriptions.ServiceDescriptionRegistry;
+import org.apache.taverna.services.ServiceRegistry;
+import org.apache.taverna.workbench.activityicons.ActivityIconManager;
+import org.apache.taverna.workbench.configuration.colour.ColourManager;
+import org.apache.taverna.workbench.edits.EditManager;
+import org.apache.taverna.workbench.file.FileManager;
+import 
org.apache.taverna.workbench.ui.actions.activity.HTMLBasedActivityContextualView;
+import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
+import 
org.apache.taverna.workbench.ui.views.contextualviews.activity.ContextualViewFactory;
+
+public class ComponentActivityContextViewFactory implements
+               ContextualViewFactory<Activity> {
+       private ColourManager colourManager;
+       private ViewUtil util;
+       private ComponentFactory factory;
+       private ActivityIconManager aim;
+       private ServiceDescriptionRegistry sdr;
+       private EditManager em;
+       private FileManager fm;
+       private ServiceRegistry sr;
+
+       public void setComponentFactory(ComponentFactory factory) {
+               this.factory = factory;
+       }
+
+       public void setColourManager(ColourManager colourManager) {
+               this.colourManager = colourManager;
+       }
+
+       public void setViewUtils(ViewUtil util) {
+               this.util = util;
+       }
+
+       public void setIconManager(ActivityIconManager aim) {
+               this.aim = aim;
+       }
+
+       public void setServiceDescriptionRegistry(ServiceDescriptionRegistry 
sdr) {
+               this.sdr = sdr;
+       }
+
+       public void setEditManager(EditManager em) {
+               this.em = em;
+       }
+
+       public void setFileManager(FileManager fm) {
+               this.fm = fm;
+       }
+
+       public void setServiceTypeRegistry(ServiceRegistry sr) {
+               this.sr = sr;
+       }
+
+       @Override
+       public boolean canHandle(Object selection) {
+               return selection instanceof Activity
+                               && ((Activity) selection).getType().equals(URI);
+       }
+
+       @Override
+       public List<ContextualView> getViews(Activity selection) {
+               return Arrays.<ContextualView>asList(new 
ComponentActivityContextualView(selection));
+       }
+
+       @SuppressWarnings("serial")
+       private class ComponentActivityContextualView extends
+                       HTMLBasedActivityContextualView {
+               public ComponentActivityContextualView(Activity activity) {
+                       super(activity, colourManager);
+                       init();
+               }
+
+               private void init() {
+               }
+
+               @Override
+               public String getViewTitle() {
+                       return "Component service";
+               }
+
+               /**
+                * View position hint
+                */
+               @Override
+               public int getPreferredPosition() {
+                       // We want to be on top
+                       return 100;
+               }
+
+               @Override
+               public Action getConfigureAction(Frame owner) {
+                       return new ComponentConfigureAction(getActivity(), 
owner, factory,
+                                       aim, sdr, em, fm, sr);
+               }
+
+               @Override
+               protected String getRawTableRowsHtml() {
+                       try {
+                               return util.getRawTablesHtml(getConfigBean());
+                       } catch (MalformedURLException e) {
+                               return "<tr><td>malformed URL: <pre>" + 
e.getMessage()
+                                               + "</pre></td></tr>";
+                       }
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationContextViewFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationContextViewFactory.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationContextViewFactory.java
new file mode 100644
index 0000000..fcb6e4a
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationContextViewFactory.java
@@ -0,0 +1,154 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static org.apache.log4j.Logger.getLogger;
+import static 
io.github.taverna_extras.component.api.config.ComponentConfig.URI;
+
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import io.github.taverna_extras.component.api.ComponentException;
+import io.github.taverna_extras.component.api.ComponentFactory;
+import io.github.taverna_extras.component.api.profile.Profile;
+import 
io.github.taverna_extras.component.ui.ComponentActivityConfigurationBean;
+import 
io.github.taverna_extras.component.ui.annotation.AbstractSemanticAnnotationContextualView;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.core.Workflow;
+import org.apache.taverna.scufl2.api.port.InputActivityPort;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputActivityPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.Port;
+import org.apache.taverna.workbench.file.FileManager;
+import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
+import 
org.apache.taverna.workbench.ui.views.contextualviews.activity.ContextualViewFactory;
+
+public class ComponentActivitySemanticAnnotationContextViewFactory implements
+               ContextualViewFactory<Object> {
+       public static final String VIEW_TITLE = "Inherited Semantic 
Annotations";
+       private static final Logger logger = 
getLogger(ComponentActivitySemanticAnnotationContextViewFactory.class);
+
+       private FileManager fm;
+       private ComponentFactory factory;
+
+       public void setFileManager(FileManager fm) {
+               this.fm = fm;
+       }
+
+       public void setComponentFactory(ComponentFactory factory) {
+               this.factory = factory;
+       }
+
+       @Override
+       public boolean canHandle(Object selection) {
+               return getContainingComponentActivity(selection) != null;
+       }
+
+       public Activity getContainingComponentActivity(Object selection) {
+               if (selection instanceof Activity) {
+                       Activity a = (Activity) selection;
+                       if (a.getType().equals(URI))
+                               return a;
+               }
+               if (selection instanceof InputActivityPort
+                               || selection instanceof OutputActivityPort)
+                       return 
getContainingComponentActivity(((OutputActivityPort) selection)
+                                       .getParent());
+               return null;
+       }
+
+       @Override
+       public List<ContextualView> getViews(Object selection) {
+               return Arrays
+                               .<ContextualView> asList(new 
SemanticAnnotationCV(
+                                               selection));
+       }
+
+       @SuppressWarnings("serial")
+       private class SemanticAnnotationCV extends
+                       AbstractSemanticAnnotationContextualView {
+               private Profile componentProfile;
+
+               public SemanticAnnotationCV(Object selection) {
+                       super(fm, false);
+                       Activity componentActivity = 
getContainingComponentActivity(selection);
+                       try {
+                               ComponentActivityConfigurationBean 
configuration = new ComponentActivityConfigurationBean(
+                                               
componentActivity.getConfiguration(), factory);
+                               setAnnotatedThing(selection, 
configuration.getVersion()
+                                               
.getImplementation().getMainWorkflow());
+                               componentProfile = 
configuration.getComponent().getFamily()
+                                               .getComponentProfile();
+                               setProfile(selection);
+                               super.initialise();
+                       } catch (ComponentException e) {
+                               logger.error("problem querying registry", e);
+                       } catch (MalformedURLException e) {
+                               logger.error("malformed URL in component 
description", e);
+                       }
+               }
+
+               private void setAnnotatedThing(Object selection,
+                               Workflow underlyingDataflow) {
+                       if (selection instanceof Activity) {
+                               setAnnotated(underlyingDataflow);
+                       } else if (selection instanceof InputActivityPort) {
+                               String name = ((Port) selection).getName();
+                               for (InputWorkflowPort dip : 
underlyingDataflow.getInputPorts())
+                                       if (dip.getName().equals(name)) {
+                                               setAnnotated(dip);
+                                               break;
+                                       }
+                       } else if (selection instanceof OutputActivityPort) {
+                               String name = ((Port) selection).getName();
+                               for (OutputWorkflowPort dop : underlyingDataflow
+                                               .getOutputPorts())
+                                       if (dop.getName().equals(name)) {
+                                               setAnnotated(dop);
+                                               break;
+                                       }
+                       }
+               }
+
+               private void setProfile(Object selection) throws 
ComponentException {
+                       if (componentProfile == null)
+                               return;
+                       if (selection instanceof Activity) {
+                               setSemanticAnnotationProfiles(componentProfile
+                                               .getSemanticAnnotations());
+                       } else if (selection instanceof InputActivityPort) {
+                               setSemanticAnnotationProfiles(componentProfile
+                                               
.getInputSemanticAnnotationProfiles());
+                       } else if (selection instanceof OutputActivityPort) {
+                               setSemanticAnnotationProfiles(componentProfile
+                                               
.getOutputSemanticAnnotationProfiles());
+                       }
+               }
+               
+               @Override
+               public String getViewTitle() {
+                       return VIEW_TITLE;
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationPanel.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationPanel.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationPanel.java
new file mode 100644
index 0000000..d3580a8
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentActivitySemanticAnnotationPanel.java
@@ -0,0 +1,112 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static java.awt.Color.GRAY;
+import static java.awt.Color.WHITE;
+import static java.awt.GridBagConstraints.BOTH;
+import static java.awt.GridBagConstraints.EAST;
+import static java.awt.GridBagConstraints.HORIZONTAL;
+import static java.awt.GridBagConstraints.SOUTHEAST;
+import static java.lang.String.format;
+import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getDisplayName;
+import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getObjectName;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.util.Set;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.border.AbstractBorder;
+import javax.swing.border.EmptyBorder;
+
+import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
+
+import org.apache.jena.ontology.OntProperty;
+import org.apache.jena.rdf.model.Statement;
+
+public class ComponentActivitySemanticAnnotationPanel extends JPanel {
+       private static final long serialVersionUID = 3599768150252711758L;
+       private static final String ANNTYPE_MSG = "Annotation type : %s";
+       private static final String NONE_MSG = "No semantic annotations";       
+       private SemanticAnnotationProfile profile;
+       private final Set<Statement> statements;
+
+       public ComponentActivitySemanticAnnotationPanel(
+                       SemanticAnnotationProfile profile, Set<Statement> 
statements) {
+               this.profile = profile;
+               this.statements = statements;
+               initialize();
+       }
+
+       private void initialize() {
+               setLayout(new GridBagLayout());
+               setBorder(new AbstractBorder() {
+                       private static final long serialVersionUID = 
-5921448975807056953L;
+
+                       @Override
+                       public void paintBorder(Component c, Graphics g, int x, 
int y,
+                                       int width, int height) {
+                               g.setColor(GRAY);
+                               g.drawLine(x, y + height - 1, x + width - 1, y 
+ height - 1);
+                       }
+               });
+
+               GridBagConstraints c = new GridBagConstraints();
+               c.anchor = SOUTHEAST;
+               c.fill = BOTH;
+               c.weightx = 1;
+               c.gridx = 0;
+
+               OntProperty predicate = profile.getPredicate();
+               c.gridwidth = 2;
+               JLabel label = new JLabel(format(ANNTYPE_MSG, 
getDisplayName(predicate)));
+               label.setBorder(new EmptyBorder(5, 5, 5, 5));
+               label.setBackground(WHITE);
+               label.setOpaque(true);
+               add(label, c);
+
+               c.insets = new Insets(5, 7, 0, 0);
+               c.anchor = EAST;
+               c.fill = HORIZONTAL;
+               if (statements.isEmpty()) {
+                       c.gridwidth = 2;
+                       // c.weightx = 1;
+                       // c.gridy++;
+                       add(new JLabel(NONE_MSG), c);
+               } else {
+                       c.gridwidth = 1;
+                       for (Statement statement : statements) {
+                               c.gridx = 0;
+                               c.weightx = 1;
+                               JTextArea value = new 
JTextArea(getObjectName(statement));
+                               value.setBackground(WHITE);
+                               value.setOpaque(true);
+                               value.setBorder(new EmptyBorder(2, 4, 2, 4));
+                               add(value, c);
+                       }
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextViewFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextViewFactory.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextViewFactory.java
new file mode 100644
index 0000000..938a32e
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextViewFactory.java
@@ -0,0 +1,61 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static 
io.github.taverna_extras.component.api.config.ComponentConfig.URI;
+
+import java.util.Arrays;
+import java.util.List;
+
+import io.github.taverna_extras.component.api.Version;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.container.WorkflowBundle;
+import org.apache.taverna.workbench.file.FileManager;
+import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
+import 
org.apache.taverna.workbench.ui.views.contextualviews.activity.ContextualViewFactory;
+
+public class ComponentContextViewFactory implements
+               ContextualViewFactory<WorkflowBundle> {
+       private FileManager fileManager;
+
+       public void setFileManager(FileManager fileManager) {
+               this.fileManager = fileManager;
+       }
+
+       @Override
+       public boolean canHandle(Object selection) {
+               if (selection instanceof WorkflowBundle) {
+                       Object dataflowSource = fileManager
+                                       .getDataflowSource((WorkflowBundle) 
selection);
+                       //FIXME Is this right?
+                       return dataflowSource instanceof Version.ID;
+               }
+               return selection instanceof Activity
+                               && ((Activity) selection).getType().equals(URI);
+       }
+
+       @Override
+       public List<ContextualView> getViews(WorkflowBundle selection) {
+               Object dataflowSource = 
fileManager.getDataflowSource(selection);
+               return Arrays.<ContextualView> asList(new 
ComponentContextualView(
+                               (Version.ID) dataflowSource));
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextualView.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextualView.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextualView.java
new file mode 100644
index 0000000..c763d06
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ComponentContextualView.java
@@ -0,0 +1,89 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static java.lang.String.format;
+
+import java.awt.Color;
+
+import javax.swing.JComponent;
+import javax.swing.JEditorPane;
+
+import io.github.taverna_extras.component.api.Version;
+import org.apache.taverna.lang.ui.HtmlUtils;
+import org.apache.taverna.workbench.configuration.colour.ColourManager;
+import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
+
+@SuppressWarnings("serial")
+public class ComponentContextualView extends ContextualView {
+       private JEditorPane editorPane;
+       private final Version.ID component;
+       ColourManager colourManager;//FIXME beaninject
+       ViewUtil viewUtils;//FIXME beaninject;
+
+       public ComponentContextualView(Version.ID component) {
+               this.component = component;
+               initView();
+       }
+
+       @Override
+       public JComponent getMainFrame() {
+               editorPane = HtmlUtils.createEditorPane(buildHtml());
+               return HtmlUtils.panelForHtml(editorPane);
+       }
+
+       private String buildHtml() {
+               StringBuilder html = new 
StringBuilder(HtmlUtils.getHtmlHead(getBackgroundColour()));
+               html.append(HtmlUtils.buildTableOpeningTag());
+               viewUtils.getRawTablesHtml(component, html);
+               return html.append("</table></body></html>").toString();
+       }
+
+       public String getBackgroundColour() {
+               Color colour = colourManager.getPreferredColour(
+                               
"io.github.taverna_extras.component.registry.Component");
+               return format("#%1$2x%2$2x%3$2x", colour.getRed(), 
colour.getGreen(),
+                               colour.getBlue());
+       }
+
+       @Override
+       public int getPreferredPosition() {
+               return 50;
+       }
+
+       private static int MAX_LENGTH = 50;
+
+       private String limitName(String fullName) {
+               if (fullName.length() > MAX_LENGTH)
+                       return fullName.substring(0, MAX_LENGTH - 3) + "...";
+               return fullName;
+       }
+
+       @Override
+       public String getViewTitle() {
+               return "Component " + limitName(component.getComponentName());
+       }
+
+       @Override
+       public void refreshView() {
+               editorPane.setText(buildHtml());
+               repaint();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ViewUtil.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ViewUtil.java
 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ViewUtil.java
new file mode 100644
index 0000000..5764f6c
--- /dev/null
+++ 
b/taverna-component-activity-ui/src/main/java/io/github/taverna_extras/component/ui/view/ViewUtil.java
@@ -0,0 +1,178 @@
+/*
+* 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 io.github.taverna_extras.component.ui.view;
+
+import static java.lang.String.format;
+import static org.apache.log4j.Logger.getLogger;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import io.github.taverna_extras.component.api.Component;
+import io.github.taverna_extras.component.api.ComponentFactory;
+import io.github.taverna_extras.component.api.Family;
+import io.github.taverna_extras.component.api.Version;
+import 
io.github.taverna_extras.component.ui.ComponentActivityConfigurationBean;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+import org.apache.taverna.scufl2.api.container.WorkflowBundle;
+import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
+import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
+
+/**
+ * @author alanrw
+ */
+public class ViewUtil {
+       private static Logger logger = getLogger(ViewUtil.class);
+
+       private static final String VERSION_DESCRIPTION_LABEL = "Component 
version description";
+       private static final String COMPONENT_DESCRIPTION_LABEL = "Component 
description";
+       private static final String FAMILY_DESCRIPTION_LABEL = "Family 
description";
+
+       private static final String plainFormat = "<tr><td><b>%1$s</b></td><td 
nowrap=\"wrap\" style=\"width:100px;\">%2$s</td></tr>";
+       private static final String headerFormat = 
"<tr><th>%1$s</th><th>%2$s</th></tr>";
+       private static final String rowFormat = 
"<tr><td><b>%1$s</b></td><td>%2$s</td></tr>";
+       private static final String rowLinkFormat = 
"<tr><td><b>%1$s</b></td><td><a href=\"%3$s\">%2$s</a></td></tr>";
+       private static final String descriptionFormat = "<tr><td 
colspan=\"2\"><b>%1$s</b></td></tr><tr><td colspan=\"2\" nowrap=\"wrap\" 
style=\"width:100px;\">%2$s</td></tr>";
+
+       private ComponentFactory factory;//FIXME beaninject
+
+       public void setComponentFactory(ComponentFactory factory) {
+               this.factory = factory;
+       }
+
+       public String getRawTablesHtml(Version.ID id) {
+               StringBuilder html = new StringBuilder();
+               getRawTablesHtml(id, html);
+               return html.toString();
+       }
+
+       public String getRawTablesHtml(Configuration config) throws 
MalformedURLException {
+               StringBuilder html = new StringBuilder();
+               getRawTablesHtml(
+                               new ComponentActivityConfigurationBean(
+                                               config.getJsonAsObjectNode(), 
factory), html);
+               return html.toString();
+       }
+
+       public void getRawTablesHtml(Version.ID id, StringBuilder html) {
+               URL registryBase = id.getRegistryBase();
+               String registryLink = null;
+               if (registryBase.getProtocol().startsWith("http"))
+                       registryLink = registryBase.toExternalForm();
+               /*
+                * \u200b is a zero-width space, so the HTML renderer can know 
to break
+                * lines.
+                */
+               String registryName = registryBase.toString().replaceAll("/", 
"\u200b/");
+               appendRow(html, "Component registry base", registryName, 
registryLink);
+
+               String familyName = id.getFamilyName();
+               appendRow(html, "Component family", familyName, null);
+               try {
+                       Family family = factory.getFamily(registryBase, 
familyName);
+                       if (family != null)
+                               appendDescriptionHtml(html, 
FAMILY_DESCRIPTION_LABEL,
+                                               family.getDescription());
+               } catch (Exception e) {
+                       logger.error("failed to get component family 
description", e);
+               }
+
+               String componentName = id.getComponentName();
+               String helpLink = null;
+               try {
+                       URL helpURL = factory.getVersion(id).getHelpURL();
+                       if (helpURL != null)
+                               helpLink = helpURL.toExternalForm();
+               } catch (Exception e) {
+                       logger.error(e);
+               }
+
+               appendRow(html, "Component name", componentName, helpLink);
+               try {
+                       Component component = factory.getComponent(registryBase,
+                                       familyName, componentName);
+                       if (component != null)
+                               appendDescriptionHtml(html, 
COMPONENT_DESCRIPTION_LABEL,
+                                               component.getDescription());
+               } catch (Exception e) {
+                       logger.error("failed to get component description", e);
+               }
+
+               Integer componentVersion = id.getComponentVersion();
+
+               if (componentVersion == null)
+                       appendRow(html, "Component version", "N/A", helpLink);
+               else {
+                       appendRow(html, "Component version", componentVersion, 
helpLink);
+                       try {
+                               Version version = 
factory.getVersion(registryBase,
+                                               familyName, componentName, 
componentVersion);
+                               if (version != null) {
+                                       appendDescriptionHtml(html, 
VERSION_DESCRIPTION_LABEL,
+                                                       
version.getDescription());
+                                       WorkflowBundle impl = 
version.getImplementation();
+                                       Set<InputWorkflowPort> inputs = 
impl.getMainWorkflow().getInputPorts();
+                                       if (!inputs.isEmpty()) {
+                                               appendHeaderRow(html, "Input 
Port Name", "Depth");
+                                               for (InputWorkflowPort input : 
inputs)
+                                                       appendPlainRow(html, 
input.getName(), input.getDepth());
+                                       }
+                                       Set<OutputWorkflowPort> outputs = 
impl.getMainWorkflow().getOutputPorts();
+                                       if (!outputs.isEmpty()) {
+                                               appendHeaderRow(html, "Output 
Port Name", "Depth");
+                                               for (OutputWorkflowPort output 
: outputs) {
+                                                       //FIXME get depth of 
output ports!
+                                                       appendPlainRow(html, 
output.getName(), -1 /*output.getDepth()*/);
+                                               }
+                                       }
+                               }
+                       } catch (Exception e) {
+                               logger.error("failed to get component version 
description", e);
+                       }
+               }
+       }
+
+       private static void appendRow(StringBuilder html, Object label,
+                       Object value, String link) {
+               if (link == null)
+                       html.append(format(rowFormat, label, value));
+               else
+                       html.append(format(rowLinkFormat, label, value, link));
+       }
+
+       private static void appendHeaderRow(StringBuilder html, Object label1,
+                       Object label2) {
+               html.append(format(headerFormat, label1, label2));
+       }
+
+       private static void appendPlainRow(StringBuilder html, Object value1,
+                       Object value2) {
+               html.append(format(plainFormat, value1, value2));
+       }
+
+       private static void appendDescriptionHtml(StringBuilder html,
+                       String header, String description) {
+               if ((description != null) && !description.isEmpty())
+                       html.append(format(descriptionFormat, header, 
description));
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentAction.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentAction.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentAction.java
deleted file mode 100644
index f359c9d..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui;
-
-import static java.awt.Color.RED;
-import static javax.swing.SwingUtilities.invokeLater;
-import static org.apache.log4j.Logger.getLogger;
-
-import javax.swing.AbstractAction;
-
-import org.apache.log4j.Logger;
-import 
io.github.taverna_extras.component.ui.serviceprovider.ComponentServiceIcon;
-
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.workbench.models.graph.GraphController;
-import org.apache.taverna.workbench.models.graph.svg.SVGGraph;
-import org.apache.taverna.workbench.views.graph.GraphViewComponent;
-
-@SuppressWarnings("serial")
-public abstract class ComponentAction extends AbstractAction {
-       private static Logger logger = getLogger(ComponentAction.class);
-
-       protected GraphViewComponent graphView;
-
-       protected ComponentAction(String title, GraphViewComponent graphView) {
-               this.graphView = graphView;
-       }
-
-       public void setIcon(ComponentServiceIcon icon) {
-        putValue(SMALL_ICON, icon.getIcon());
-       }
-
-       protected void markGraphAsBelongingToComponent(WorkflowBundle bundle) {
-               final GraphController gc = graphView.getGraphController(bundle
-                               .getMainWorkflow());
-               invokeLater(new Runnable() {
-                       @Override
-                       public void run() {
-                               try {
-                                       SVGGraph g = (SVGGraph) gc.getGraph();
-                                       g.setFillColor(RED);
-                                       gc.redraw();
-                               } catch (NullPointerException e) {
-                                       logger.error(e);
-                               }
-                       }
-               });
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentActivityConfigurationBean.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentActivityConfigurationBean.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentActivityConfigurationBean.java
deleted file mode 100644
index 26e673e..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentActivityConfigurationBean.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui;
-
-import static org.apache.log4j.Logger.getLogger;
-import static 
io.github.taverna_extras.component.api.config.ComponentPropertyNames.COMPONENT_NAME;
-import static 
io.github.taverna_extras.component.api.config.ComponentPropertyNames.COMPONENT_VERSION;
-import static 
io.github.taverna_extras.component.api.config.ComponentPropertyNames.FAMILY_NAME;
-import static 
io.github.taverna_extras.component.api.config.ComponentPropertyNames.REGISTRY_BASE;
-import static 
io.github.taverna_extras.component.ui.ComponentConstants.ACTIVITY_URI;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import io.github.taverna_extras.component.api.Component;
-import io.github.taverna_extras.component.api.ComponentException;
-import io.github.taverna_extras.component.api.ComponentFactory;
-import io.github.taverna_extras.component.api.Version;
-import io.github.taverna_extras.component.api.config.ComponentPropertyNames;
-import io.github.taverna_extras.component.api.profile.ExceptionHandling;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-import org.apache.taverna.scufl2.api.container.WorkflowBundle;
-import org.apache.taverna.scufl2.api.port.InputActivityPort;
-import org.apache.taverna.scufl2.api.port.InputWorkflowPort;
-import org.apache.taverna.scufl2.api.port.OutputActivityPort;
-import org.apache.taverna.scufl2.api.port.OutputWorkflowPort;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-/**
- * Component activity configuration bean.
- */
-public class ComponentActivityConfigurationBean extends Version.Identifier {
-       public static final String ERROR_CHANNEL = "error_channel";
-       public static final List<String> ignorableNames = Arrays
-                       .asList(ERROR_CHANNEL);
-       private static final long serialVersionUID = 5774901665863468058L;
-       private static final Logger logger = 
getLogger(ComponentActivityConfigurationBean.class);
-
-       private ActivityPortsDefinitionBean ports = null;
-       private ComponentFactory factory;
-       private ExceptionHandling eh;
-
-       public ComponentActivityConfigurationBean(Version.ID toBeCopied,
-                       ComponentFactory factory) {
-               super(toBeCopied.getRegistryBase(), toBeCopied.getFamilyName(),
-                               toBeCopied.getComponentName(), 
toBeCopied.getComponentVersion());
-               this.factory = factory;
-               try {
-                       getPorts();
-               } catch (ComponentException e) {
-                       logger.error("failed to get component realization", e);
-               }
-       }
-
-       public ComponentActivityConfigurationBean(JsonNode json,
-                       ComponentFactory factory) throws MalformedURLException {
-               super(getUrl(json), getFamily(json), getComponent(json),
-                               getVersion(json));
-               this.factory = factory;
-       }
-
-       public ComponentActivityConfigurationBean(Configuration configuration,
-                       ComponentFactory factory) throws MalformedURLException {
-               this(configuration.getJson(), factory);
-       }
-
-       private static URL getUrl(JsonNode json) throws MalformedURLException {
-               return new URL(json.get(REGISTRY_BASE).textValue());
-       }
-
-       private static String getFamily(JsonNode json) {
-               return json.get(FAMILY_NAME).textValue();
-       }
-
-       private static String getComponent(JsonNode json) {
-               return json.get(COMPONENT_NAME).textValue();
-       }
-
-       private static Integer getVersion(JsonNode json) {
-               JsonNode node = json.get(COMPONENT_VERSION);
-               if (node == null || !node.isInt())
-                       return null;
-               return node.intValue();
-       }
-
-       public Component getComponent() throws ComponentException {
-               return factory.getComponent(getRegistryBase(), getFamilyName(),
-                               getComponentName());
-       }
-
-       public Version getVersion() throws ComponentException {
-               return factory.getVersion(this);
-       }
-
-       private ActivityPortsDefinitionBean getPortsDefinition(WorkflowBundle 
w) {
-               ActivityPortsDefinitionBean result = new 
ActivityPortsDefinitionBean();
-
-               for (InputWorkflowPort iwp : 
w.getMainWorkflow().getInputPorts())
-                       result.inputs.add(makeInputDefinition(iwp));
-               for (OutputWorkflowPort owp : 
w.getMainWorkflow().getOutputPorts())
-                       result.outputs.add(makeOutputDefinition(getDepth(owp), 
owp.getName()));
-
-               try {
-                       eh = factory.getFamily(getRegistryBase(), 
getFamilyName())
-                                       
.getComponentProfile().getExceptionHandling();
-                       if (eh != null)
-                               result.outputs.add(makeOutputDefinition(1, 
ERROR_CHANNEL));
-               } catch 
(io.github.taverna_extras.component.api.ComponentException e) {
-                       logger.error("failed to get exception handling for 
family", e);
-               }
-               return result;
-       }
-
-       private int getDepth(OutputWorkflowPort owp) {
-               return 0; //FIXME How to get the depth of an output?
-       }
-
-       private InputActivityPort makeInputDefinition(InputWorkflowPort dip) {
-               InputActivityPort port = new InputActivityPort();
-               port.setName(dip.getName());
-               port.setDepth(dip.getDepth());
-               return port;
-       }
-
-       private OutputActivityPort makeOutputDefinition(int depth, String name) 
{
-               OutputActivityPort port = new OutputActivityPort();
-               port.setName(name);
-               port.setDepth(depth);
-               port.setGranularDepth(depth);
-               return port;
-       }
-
-       /**
-        * @return the ports
-        */
-       public ActivityPortsDefinitionBean getPorts() throws ComponentException 
{
-               if (ports == null)
-                       ports = 
getPortsDefinition(getVersion().getImplementation());
-               return ports;
-       }
-
-       public ExceptionHandling getExceptionHandling() {
-               return eh;
-       }
-
-       public void installConfiguration(Activity a) {
-               Configuration conf = a.createConfiguration(ACTIVITY_URI);
-               ObjectNode json = conf.getJsonAsObjectNode();
-               json.put(REGISTRY_BASE, getRegistryBase().toExternalForm());
-               json.put(FAMILY_NAME, getFamilyName());
-               json.put(COMPONENT_NAME, getComponentName());
-               json.put(COMPONENT_VERSION, getComponentVersion());
-       }
-
-       public static class ActivityPortsDefinitionBean {
-               public List<InputActivityPort> inputs = new ArrayList<>();
-               public List<OutputActivityPort> outputs = new ArrayList<>();
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentConstants.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentConstants.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentConstants.java
deleted file mode 100644
index baec10f..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/ComponentConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui;
-
-import static java.net.URI.create;
-
-import java.net.URI;
-
-public interface ComponentConstants {
-       URI ACTIVITY_URI = 
create("http://ns.taverna.org.uk/2010/activity/component";);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AbstractSemanticAnnotationContextualView.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AbstractSemanticAnnotationContextualView.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AbstractSemanticAnnotationContextualView.java
deleted file mode 100644
index 6cc48d0..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AbstractSemanticAnnotationContextualView.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static java.awt.GridBagConstraints.HORIZONTAL;
-import static java.awt.GridBagConstraints.NORTHWEST;
-import static java.lang.String.CASE_INSENSITIVE_ORDER;
-import static org.apache.log4j.Logger.getLogger;
-import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.createSemanticAnnotation;
-import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getDisplayName;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.ExecutionException;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-import javax.swing.SwingWorker;
-
-import org.apache.log4j.Logger;
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-
-import org.apache.taverna.scufl2.api.common.AbstractNamed;
-import org.apache.taverna.scufl2.api.common.Named;
-
-import org.apache.jena.ontology.OntProperty;
-import org.apache.jena.rdf.model.Model;
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Resource;
-import org.apache.jena.rdf.model.Statement;
-import org.apache.taverna.workbench.file.FileManager;
-import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
-
-/**
- * @author alanrw
- */
-public abstract class AbstractSemanticAnnotationContextualView extends
-               ContextualView {
-       private static final long serialVersionUID = 3567849347002793442L;
-       private static final Logger logger = 
getLogger(SemanticAnnotationContextualView.class);
-
-       private final FileManager fileManager;
-
-       public AbstractSemanticAnnotationContextualView(FileManager fileManager,
-                       boolean allowChange) {
-               super();
-               this.fileManager = fileManager;
-               this.allowChange = allowChange;
-       }
-
-       private final boolean allowChange;
-       private JPanel panel;
-       private AbstractNamed annotated;
-       private List<SemanticAnnotationProfile> semanticAnnotationProfiles;
-       private Model model;
-       private Resource subject;
-
-       private static Comparator<SemanticAnnotationProfile> comparator = new 
Comparator<SemanticAnnotationProfile>() {
-               @Override
-               public int compare(SemanticAnnotationProfile arg0,
-                               SemanticAnnotationProfile arg1) {
-                       String d0 = getDisplayName(arg0.getPredicate());
-                       String d1 = getDisplayName(arg1.getPredicate());
-                       return CASE_INSENSITIVE_ORDER.compare(d0, d1);
-               }
-       };
-
-       @Override
-       public JComponent getMainFrame() {
-               return panel;
-       }
-
-       @Override
-       public int getPreferredPosition() {
-               return 510;
-       }
-
-       protected final void initialise() {
-               populateModel();
-               if (panel == null)
-                       panel = new JPanel(new GridBagLayout());
-               else
-                       panel.removeAll();
-               populatePanel(panel);
-       }
-
-       public void removeStatement(Statement statement) {
-               model.remove(statement);
-               // populatePanel(panel);
-               updateSemanticAnnotation();
-       }
-
-       public void addStatement(Statement statement) {
-               model.add(statement);
-               // populatePanel(panel);
-               updateSemanticAnnotation();
-       }
-
-       public void changeStatement(Statement origStatement, OntProperty 
predicate,
-                       RDFNode node) {
-               if (predicate == null)
-                       return;
-               model.remove(origStatement);
-               model.add(subject, predicate, node);
-               // populatePanel(panel);
-               updateSemanticAnnotation();
-       }
-
-       public void addStatement(OntProperty predicate, RDFNode node) {
-               if (predicate == null)
-                       return;
-               model.add(subject, predicate, node);
-               // populatePanel(panel);
-               updateSemanticAnnotation();
-       }
-
-       @Override
-       public void refreshView() {
-               populatePanel(panel);
-       }
-
-       // public void addModel(Model model) {
-       // this.model.add(model);
-       // initialise();
-       // updateSemanticAnnotation();
-       // }
-
-       public void updateSemanticAnnotation() {
-               try {
-                       
createSemanticAnnotation(fileManager.getCurrentDataflow(),
-                                       annotated, model);
-               } catch (IOException e) {
-                       logger.error("failed to add semantic annotation", e);
-               }
-       }
-
-       public void setAnnotated(Named annotated) {
-               this.annotated = (AbstractNamed) annotated;
-       }
-
-       public void setSemanticAnnotationProfiles(
-                       List<SemanticAnnotationProfile> profiles) {
-               this.semanticAnnotationProfiles = profiles;
-       }
-
-       public Model getModel() {
-               return model;
-       }
-
-       private void populateModel() {
-               this.model = SemanticAnnotationUtils.populateModel(fileManager
-                               .getCurrentDataflow());
-               this.subject = 
model.createResource(annotated.getURI().toASCIIString());
-       }
-
-       public Named getAnnotated() {
-               return annotated;
-       }
-
-       private void populatePanel(JPanel panel) {
-               panel.removeAll();
-               GridBagConstraints gbc = new GridBagConstraints();
-               gbc.anchor = NORTHWEST;
-               gbc.fill = HORIZONTAL;
-               gbc.gridx = 0;
-               gbc.weightx = 1;
-               gbc.weighty = 0;
-               gbc.insets = new Insets(5, 5, 5, 5);
-               panel.add(new JLabel("Reading semantic annotations"), gbc);
-               revalidate();
-               initView();
-               new StatementsReader().execute();
-       }
-
-       private Set<Statement> listStatements(OntProperty predicate) {
-               if (predicate == null)
-                       return Collections.emptySet();
-               return model.listStatements(subject, predicate, (RDFNode) 
null).toSet();
-       }
-
-       private void populateViewWithPredicates(GridBagConstraints gbc,
-                       Map<SemanticAnnotationProfile, Set<Statement>> 
profileStatements,
-                       Set<Statement> statements,
-                       Set<SemanticAnnotationProfile> unresolvablePredicates) {
-               for (Entry<SemanticAnnotationProfile, Set<Statement>> entry : 
profileStatements
-                               .entrySet()) {
-                       panel.add(
-                                       new SemanticAnnotationPanel(this, 
entry.getKey(), entry
-                                                       .getValue(), 
allowChange), gbc);
-                       panel.add(new JSeparator(), gbc);
-               }
-               for (SemanticAnnotationProfile semanticAnnotationProfile : 
unresolvablePredicates) {
-                       panel.add(
-                                       new 
UnresolveablePredicatePanel(semanticAnnotationProfile),
-                                       gbc);
-                       panel.add(new JSeparator(), gbc);
-               }
-
-               if (semanticAnnotationProfiles.isEmpty())
-                       panel.add(new JLabel("No annotations possible"), gbc);
-               for (Statement s : statements)
-                       panel.add(new UnrecognizedStatementPanel(s), gbc);
-
-               gbc.weighty = 1;
-               panel.add(new JPanel(), gbc);
-       }
-
-       private class StatementsReader extends SwingWorker<Void, Object> {
-               private Map<SemanticAnnotationProfile, Set<Statement>> 
profileStatements = new TreeMap<>(
-                               comparator);
-               private Set<Statement> statements;
-               private Set<SemanticAnnotationProfile> unresolvablePredicates = 
new HashSet<>();
-
-               @Override
-               protected Void doInBackground() throws Exception {
-                       try {
-                               parseStatements();
-                       } catch (Exception e) {
-                               logger.error("failed to parse annotation 
statements", e);
-                               throw e;
-                       }
-                       return null;
-               }
-
-               private void parseStatements() {
-                       statements = listStatements(null);
-                       for (SemanticAnnotationProfile 
semanticAnnotationProfile : semanticAnnotationProfiles) {
-                               OntProperty predicate = 
semanticAnnotationProfile
-                                               .getPredicate();
-                               if (predicate == null) {
-                                       
unresolvablePredicates.add(semanticAnnotationProfile);
-                                       continue;
-                               }
-
-                               Set<Statement> statementsWithPredicate = 
listStatements(predicate);
-                               profileStatements.put(semanticAnnotationProfile,
-                                               statementsWithPredicate);
-                               statements.removeAll(statementsWithPredicate);
-                       }
-               }
-
-               @Override
-               protected void done() {
-                       panel.removeAll();
-                       GridBagConstraints gbc = new GridBagConstraints();
-                       gbc.anchor = NORTHWEST;
-                       gbc.fill = HORIZONTAL;
-                       gbc.gridx = 0;
-                       gbc.weightx = 1;
-                       gbc.weighty = 0;
-                       gbc.insets = new Insets(5, 5, 5, 5);
-
-                       try {
-                               get();
-                               populateViewWithPredicates(gbc, 
profileStatements, statements,
-                                               unresolvablePredicates);
-                       } catch (ExecutionException | InterruptedException e) {
-                               logger.error(e);
-                               panel.add(new JLabel("Unable to read semantic 
annotations"),
-                                               gbc);
-                       }
-
-                       revalidate();
-                       initView();
-               }
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotateSemanticsMenuAction.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotateSemanticsMenuAction.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotateSemanticsMenuAction.java
deleted file mode 100644
index 1543533..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotateSemanticsMenuAction.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static java.awt.BorderLayout.CENTER;
-import static java.awt.BorderLayout.SOUTH;
-import static java.awt.FlowLayout.TRAILING;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.net.URI;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import io.github.taverna_extras.component.api.ComponentFactory;
-import io.github.taverna_extras.component.api.Version;
-import org.apache.taverna.lang.ui.DeselectingButton;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.common.AbstractNamed;
-import org.apache.taverna.scufl2.api.port.ActivityPort;
-import org.apache.taverna.ui.menu.AbstractContextualMenuAction;
-import org.apache.taverna.workbench.file.FileManager;
-
-/**
- * @author alanrw
- */
-public class AnnotateSemanticsMenuAction extends AbstractContextualMenuAction {
-       private static final String ANNOTATE_SEMANTICS = "Annotate 
semantics...";
-       private static final URI configureSection = URI
-                       
.create("http://taverna.sf.net/2009/contextMenu/configure";);
-       private FileManager fileManager;
-       private ComponentFactory factory;
-
-       public AnnotateSemanticsMenuAction() {
-               super(configureSection, 45);
-       }
-
-       public void setComponentFactory(ComponentFactory factory) {
-               this.factory = factory;
-       }
-
-       public void setFileManager(FileManager fm) {
-               this.fileManager = fm;
-       }
-
-       @Override
-       public boolean isEnabled() {
-               Object selection = getContextualSelection().getSelection();
-               Object dataflowSource = 
fileManager.getDataflowSource(fileManager
-                               .getCurrentDataflow());
-               if (dataflowSource instanceof Version.ID)
-                       return (selection instanceof AbstractNamed)
-                                       && !(selection instanceof Activity || 
selection instanceof ActivityPort);
-               return false;
-       }
-
-       @SuppressWarnings("serial")
-       @Override
-       protected Action createAction() {
-               return new AbstractAction(ANNOTATE_SEMANTICS) {
-                       @Override
-                       public void actionPerformed(ActionEvent e) {
-                               showAnnotateSemanticsPanel();
-                       }
-               };
-       }
-
-       private void showAnnotateSemanticsPanel() {
-               SemanticAnnotationContextualView view = new 
SemanticAnnotationContextualView(
-                               fileManager, factory, (AbstractNamed) 
getContextualSelection()
-                                               .getSelection());
-
-               final JDialog dialog = new JDialog((Frame) null, "Annotate 
semantics");
-               dialog.setLayout(new BorderLayout());
-               dialog.add(new JScrollPane(view), CENTER);
-
-               JPanel buttonPanel = new JPanel(new FlowLayout(TRAILING));
-               buttonPanel.add(new DeselectingButton("OK", new 
ActionListener() {
-                       @Override
-                       public void actionPerformed(ActionEvent e) {
-                               dialog.setVisible(false);
-                       }
-               }));
-
-               dialog.add(buttonPanel, SOUTH);
-               dialog.setSize(new Dimension(400, 300));
-               dialog.setLocationRelativeTo(null);
-               dialog.setModal(true);
-               dialog.setVisible(true);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotationPropertyPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotationPropertyPanelFactory.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotationPropertyPanelFactory.java
deleted file mode 100644
index 0dfaf0a..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/AnnotationPropertyPanelFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static org.apache.jena.rdf.model.ResourceFactory.createTypedLiteral;
-import static java.lang.Integer.MIN_VALUE;
-import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getObjectName;
-
-import javax.swing.JComponent;
-import javax.swing.JTextArea;
-
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-
-import org.apache.jena.ontology.OntProperty;
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Statement;
-
-/**
- * 
- * 
- * @author Alan Williams
- */
-public class AnnotationPropertyPanelFactory extends PropertyPanelFactorySPI {
-       @Override
-       public JComponent getInputComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return getDefaultInputComponent(semanticAnnotationProfile, 
statement);
-       }
-
-       @Override
-       public RDFNode getNewTargetNode(Statement originalStatement,
-                       JComponent component) {
-               String newText = ((JTextArea) component).getText();
-               if ((originalStatement == null)
-                               || 
!getObjectName(originalStatement).equals(newText))
-                       return createTypedLiteral(newText);
-               return null;
-       }
-
-       @Override
-       public int getRatingForSemanticAnnotation(
-                       SemanticAnnotationProfile semanticAnnotationProfile) {
-               OntProperty property = semanticAnnotationProfile.getPredicate();
-               if ((property != null) && property.isAnnotationProperty())
-                       return 100;
-               return MIN_VALUE;
-       }
-
-       @Override
-       public JComponent getDisplayComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return getDefaultDisplayComponent(semanticAnnotationProfile, 
statement);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DatatypePropertyPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DatatypePropertyPanelFactory.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DatatypePropertyPanelFactory.java
deleted file mode 100644
index bd7ebcc..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DatatypePropertyPanelFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static org.apache.jena.rdf.model.ResourceFactory.createTypedLiteral;
-import static java.lang.Integer.MIN_VALUE;
-import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getObjectName;
-
-import javax.swing.JComponent;
-import javax.swing.JTextArea;
-
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-
-import org.apache.jena.ontology.OntProperty;
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Statement;
-
-/**
- * @author Alan Williams
- */
-public class DatatypePropertyPanelFactory extends PropertyPanelFactorySPI {
-       public DatatypePropertyPanelFactory() {
-               super();
-       }
-
-       @Override
-       public JComponent getInputComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return getDefaultInputComponent(semanticAnnotationProfile, 
statement);
-       }
-
-       @Override
-       public RDFNode getNewTargetNode(Statement originalStatement,
-                       JComponent component) {
-               JTextArea inputText = (JTextArea) component;
-               String newText = inputText.getText();
-               if ((originalStatement == null)
-                               || 
!getObjectName(originalStatement).equals(newText))
-                       return createTypedLiteral(newText);
-               return null;
-       }
-
-       @Override
-       public int getRatingForSemanticAnnotation(
-                       SemanticAnnotationProfile semanticAnnotationProfile) {
-               OntProperty property = semanticAnnotationProfile.getPredicate();
-               if ((property != null) && property.isDatatypeProperty())
-                       return 100;
-               return MIN_VALUE;
-       }
-
-       @Override
-       public JComponent getDisplayComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return getDefaultDisplayComponent(semanticAnnotationProfile, 
statement);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DateTimePropertyPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DateTimePropertyPanelFactory.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DateTimePropertyPanelFactory.java
deleted file mode 100644
index e9dbda7..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/DateTimePropertyPanelFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static org.apache.jena.datatypes.xsd.XSDDatatype.XSDdateTime;
-import static org.apache.jena.rdf.model.ResourceFactory.createTypedLiteral;
-import static java.lang.Integer.MIN_VALUE;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-
-import javax.swing.JComponent;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerDateModel;
-import javax.swing.text.DefaultCaret;
-
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-
-import org.apache.jena.datatypes.xsd.XSDDateTime;
-import org.apache.jena.ontology.OntProperty;
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Statement;
-
-/**
- * 
- * 
- * @author Alan Williams
- */
-public class DateTimePropertyPanelFactory extends PropertyPanelFactorySPI {
-
-       private static String DateTimeString = XSDdateTime.getURI();
-
-       public DateTimePropertyPanelFactory() {
-               super();
-       }
-
-       @Override
-       public JComponent getInputComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               Date now = new Date();
-               SpinnerDateModel dateModel = new SpinnerDateModel(now, null, 
now,
-                               Calendar.DAY_OF_MONTH);
-               JSpinner s = new JSpinner(dateModel);
-               JSpinner.DateEditor de = new JSpinner.DateEditor(s,
-                               "yyyy-MM-dd-HH-mm-ss");
-
-               /*
-                * Suggested hack from
-                * 
http://www.coderanch.com/t/345684/GUI/java/JSpinner-DateEditor-Set-default-focus
-                */
-
-               de.getTextField().setCaret(new DefaultCaret() {
-                       private static final long serialVersionUID = 
6779256780590610172L;
-                       private boolean diverted = false;
-
-                       @Override
-                       public void setDot(int dot) {
-                               diverted = (dot == 0);
-                               if (diverted)
-                                       dot = 
getComponent().getDocument().getLength();
-                               super.setDot(dot);
-                       }
-
-                       @Override
-                       public void moveDot(int dot) {
-                               if (diverted) {
-                                       super.setDot(0);
-                                       diverted = false;
-                               }
-                               super.moveDot(dot);
-                       }
-               });
-               s.setEditor(de);
-               if (statement != null) {
-                       Object o = statement.getObject().asLiteral().getValue();
-                       if (o instanceof XSDDateTime)
-                               dateModel.setValue(((XSDDateTime) 
o).asCalendar().getTime());
-               }
-               return s;
-       }
-
-       @Override
-       public RDFNode getNewTargetNode(Statement originalStatement,
-                       JComponent component) {
-               JSpinner spinner = (JSpinner) component;
-               Date d = (Date) spinner.getValue();
-               if ((originalStatement == null)
-                               || 
!originalStatement.getObject().asLiteral().getValue()
-                                               .equals(d)) {
-                       Calendar cal = GregorianCalendar.getInstance();
-                       cal.setTime(d);
-                       return createTypedLiteral(cal);
-               }
-               return null;
-       }
-
-       @Override
-       public int getRatingForSemanticAnnotation(
-                       SemanticAnnotationProfile semanticAnnotationProfile) {
-               OntProperty property = semanticAnnotationProfile.getPredicate();
-               if ((property != null) && property.isDatatypeProperty()
-                               && 
DateTimeString.equals(semanticAnnotationProfile
-                                               .getClassString()))
-                       return 200;
-               return MIN_VALUE;
-       }
-
-       @Override
-       public JComponent getDisplayComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               JComponent result = getInputComponent(semanticAnnotationProfile,
-                               statement);
-               result.setEnabled(false);
-               return result;
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/FallbackPropertyPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/FallbackPropertyPanelFactory.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/FallbackPropertyPanelFactory.java
deleted file mode 100644
index efc3b42..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/FallbackPropertyPanelFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Statement;
-
-/**
- * @author alanrw
- */
-public class FallbackPropertyPanelFactory extends PropertyPanelFactorySPI {
-       @Override
-       public JComponent getInputComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return new JLabel("Unable to handle "
-                               + 
semanticAnnotationProfile.getPredicateString());
-       }
-
-       @Override
-       public RDFNode getNewTargetNode(Statement originalStatement,
-                       JComponent component) {
-               return null;
-       }
-
-       @Override
-       public int getRatingForSemanticAnnotation(
-                       SemanticAnnotationProfile semanticAnnotationProfile) {
-               return 0;
-       }
-
-       @Override
-       public JComponent getDisplayComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return getDefaultDisplayComponent(semanticAnnotationProfile, 
statement);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/GreyBorder.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/GreyBorder.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/GreyBorder.java
deleted file mode 100644
index d5e4fbe..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/GreyBorder.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-
-import javax.swing.border.AbstractBorder;
-
-@SuppressWarnings("serial")
-class GreyBorder extends AbstractBorder {
-       @Override
-       public void paintBorder(Component c, Graphics g, int x, int y, int 
width,
-                       int height) {
-               g.setColor(Color.GRAY);
-               g.drawLine(x, y + height - 1, x + width - 1, y + height - 1);
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-component/blob/b7b61e71/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/ObjectPropertyWithIndividualsPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/ObjectPropertyWithIndividualsPanelFactory.java
 
b/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/ObjectPropertyWithIndividualsPanelFactory.java
deleted file mode 100644
index fefe5c0..0000000
--- 
a/taverna-component-activity-ui/src/main/java/org/apache/taverna/component/ui/annotation/ObjectPropertyWithIndividualsPanelFactory.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
-* 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 io.github.taverna_extras.component.ui.annotation;
-
-import static java.awt.FlowLayout.RIGHT;
-import static java.awt.GridBagConstraints.EAST;
-import static java.awt.GridBagConstraints.NORTHWEST;
-import static java.lang.Integer.MIN_VALUE;
-import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
-import static javax.swing.JOptionPane.OK_OPTION;
-import static javax.swing.JOptionPane.QUESTION_MESSAGE;
-import static javax.swing.JOptionPane.showConfirmDialog;
-import static javax.swing.JOptionPane.showInputDialog;
-import static 
io.github.taverna_extras.component.ui.annotation.SemanticAnnotationUtils.getDisplayName;
-
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.ListCellRenderer;
-
-import 
io.github.taverna_extras.component.api.profile.SemanticAnnotationProfile;
-import io.github.taverna_extras.component.ui.localworld.LocalWorld;
-
-import org.apache.jena.ontology.Individual;
-import org.apache.jena.ontology.OntClass;
-import org.apache.jena.ontology.OntModel;
-import org.apache.jena.ontology.OntProperty;
-import org.apache.jena.rdf.model.RDFNode;
-import org.apache.jena.rdf.model.Statement;
-import org.apache.taverna.lang.ui.DeselectingButton;
-
-/**
- * @author David Withers
- * @author Alan Williams
- */
-public class ObjectPropertyWithIndividualsPanelFactory extends
-               PropertyPanelFactorySPI {
-       /*
-        * TODO Consider what sort of sharing model is appropriate for the local
-        * world
-        */
-       private static LocalWorld localWorld = LocalWorld.getInstance();
-
-       @Override
-       public int getRatingForSemanticAnnotation(
-                       SemanticAnnotationProfile semanticAnnotationProfile) {
-               OntProperty property = semanticAnnotationProfile.getPredicate();
-               if ((property != null) && property.isObjectProperty()
-                               /*
-                                * && 
!semanticAnnotationProfile.getIndividuals().isEmpty()
-                                */)
-                       return 100;
-               return MIN_VALUE;
-       }
-
-       @Override
-       public JComponent getInputComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               return new ComboBoxWithAdd(semanticAnnotationProfile, 
statement);
-       }
-
-       @Override
-       public RDFNode getNewTargetNode(Statement originalStatement,
-                       JComponent component) {
-               ComboBoxWithAdd panel = (ComboBoxWithAdd) component;
-               RDFNode newNode = panel.getSelectedItem();
-               if ((originalStatement == null)
-                               || 
!originalStatement.getObject().equals(newNode))
-                       return newNode;
-               return null;
-       }
-
-
-       private static class ComboBoxWithAdd extends JPanel {
-               private static final long serialVersionUID = 
-9156213096428945270L;
-               private static DefaultListCellRenderer defaultRenderer = new 
DefaultListCellRenderer();
-               OntClass rangeClass = null;
-               JComboBox<Individual> resources;
-
-               public ComboBoxWithAdd(
-                               SemanticAnnotationProfile 
semanticAnnotationProfile,
-                               Statement statement) {
-                       super(new GridBagLayout());
-
-                       rangeClass = semanticAnnotationProfile.getRangeClass();
-
-                       GridBagConstraints gbc = new GridBagConstraints();
-                       gbc.gridx = 0;
-                       gbc.gridy = 0;
-                       gbc.anchor = NORTHWEST;
-                       List<Individual> individuals = semanticAnnotationProfile
-                                       .getIndividuals();
-                       if (rangeClass != null)
-                               individuals
-                                               
.addAll(localWorld.getIndividualsOfClass(rangeClass));
-
-                       resources = new JComboBox<Individual>(new 
Vector<>(individuals));
-                       resources.setRenderer(new 
ListCellRenderer<Individual>() {
-                               @Override
-                               public Component getListCellRendererComponent(
-                                               JList<? extends Individual> 
list, Individual value,
-                                               int index, boolean isSelected, 
boolean cellHasFocus) {
-                                       return 
defaultRenderer.getListCellRendererComponent(list,
-                                                       getDisplayName(value), 
index, isSelected,
-                                                       cellHasFocus);
-                               }
-                       });
-                       resources.setEditable(false);
-                       if (statement != null) {
-                               Object origResource = statement.getObject();
-                               if (origResource != null)
-                                       resources.setSelectedItem(origResource);
-                       }
-                       this.add(resources, gbc);
-
-                       gbc.gridy++;
-
-                       JPanel buttonPanel = new JPanel(new FlowLayout(RIGHT));
-                       buttonPanel.add(new DeselectingButton("Add external",
-                                       new ActionListener() {
-                                               @Override
-                                               public void 
actionPerformed(ActionEvent e) {
-                                                       addExternal();
-                                               }
-                                       }));
-                       buttonPanel.add(new DeselectingButton("Add local",
-                                       new ActionListener() {
-                                               @Override
-                                               public void 
actionPerformed(ActionEvent e) {
-                                                       addLocal();
-                                               }
-                                       }));
-                       gbc.anchor = EAST;
-                       this.add(buttonPanel, gbc);
-               }
-
-               private void addExternal() {
-                       String answer = showInputDialog("Please enter the URL 
for the resource");
-                       resources.addItem(localWorld.createIndividual(answer, 
rangeClass));
-               }
-
-               private void addLocal() {
-                       TurtleInputPanel turtlePanel = new 
TurtleInputPanel(rangeClass);
-                       if (showConfirmDialog(null, turtlePanel, "Turtle input",
-                                       OK_CANCEL_OPTION, QUESTION_MESSAGE) == 
OK_OPTION) {
-                               OntModel addedModel = 
turtlePanel.getContentAsModel();
-                               for (Individual i : 
addedModel.listIndividuals(rangeClass)
-                                               .toList())
-                                       resources.addItem(i);
-                               
localWorld.addModelFromString(turtlePanel.getContentAsString());
-                       }
-               }
-
-               public RDFNode getSelectedItem() {
-                       return (RDFNode) resources.getSelectedItem();
-               }
-       }
-
-       @Override
-       public JComponent getDisplayComponent(
-                       SemanticAnnotationProfile semanticAnnotationProfile,
-                       Statement statement) {
-               JComponent result = getDefaultDisplayComponent(
-                               semanticAnnotationProfile, statement);
-               return result;
-       }
-}

Reply via email to