/**
* <copyright>
*
* Copyright (c) 2002, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*
* </copyright>
*
* $Id: ResourceItemProvider.java,v 1.12 2007/06/14 18:32:42 emerks Exp $
*/
package net.enilink.komma.edit.provider.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import net.enilink.vocab.owl.OWL;
import net.enilink.vocab.rdfs.RDFS;
import net.enilink.komma.common.adapter.IAdapterFactory;
import net.enilink.komma.common.command.CommandResult;
import net.enilink.komma.common.command.ICommand;
import net.enilink.komma.common.command.SimpleCommand;
import net.enilink.komma.common.command.UnexecutableCommand;
import net.enilink.komma.common.util.ICollector;
import net.enilink.komma.common.util.IResourceLocator;
import net.enilink.komma.edit.KommaEditPlugin;
import net.enilink.komma.edit.command.CommandParameter;
import net.enilink.komma.edit.command.CreateChildCommand;
import net.enilink.komma.edit.command.ICommandActionDelegate;
import net.enilink.komma.edit.domain.IEditingDomain;
import net.enilink.komma.edit.provider.IEditingDomainItemProvider;
import net.enilink.komma.edit.provider.IItemLabelProvider;
import net.enilink.komma.edit.provider.IItemPropertyDescriptor;
import net.enilink.komma.edit.provider.IItemPropertySource;
import net.enilink.komma.edit.provider.IStructuredItemContentProvider;
import net.enilink.komma.edit.provider.ITreeItemContentProvider;
import net.enilink.komma.edit.provider.ItemProvider;
import net.enilink.komma.edit.provider.ItemProviderAdapter;
import net.enilink.komma.em.concepts.IClass;
import net.enilink.komma.em.concepts.IProperty;
import net.enilink.komma.em.util.ISparqlConstants;
import net.enilink.komma.model.IModel;
import net.enilink.komma.model.IModelAware;
import net.enilink.komma.model.IObject;
import net.enilink.komma.model.ModelUtil;
import net.enilink.komma.core.IEntity;
import net.enilink.komma.core.URI;
import net.enilink.komma.core.URIs;
/**
* This is the item provider adapter for a {@link IModel} object.
*/
public class ModelItemProvider extends ItemProviderAdapter implements
IEditingDomainItemProvider, IStructuredItemContentProvider,
ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
static String QUERY_PROPERTIES = ISparqlConstants.PREFIX
+ "SELECT DISTINCT ?r WHERE {" + "?r a rdf:Property "
+ "OPTIONAL {?r rdfs:subPropertyOf ?other "
+ "FILTER(!sameTerm(?r, ?other) && isIRI(?other))} "
+ "FILTER (!bound(?other) && isIRI(?r)) }";
class Instances extends ItemProvider implements IEditingDomainItemProvider,
IModelAware {
class CreateInstanceCommand extends SimpleCommand implements
ICommandActionDelegate {
IEditingDomain domain;
Object value;
Object child;
List<Object> affectedObjects = new ArrayList<Object>();
public CreateInstanceCommand(IEditingDomain domain, Object value) {
this.domain = domain;
this.value = value;
}
@Override
protected CommandResult doExecuteWithResult(
IProgressMonitor progressMonitor, IAdaptable info)
throws ExecutionException {
child = ModelItemProvider.this.createChild(getModel(), null,
value, info);
affectedObjects.add(child);
children.add(child);
return CommandResult.newOKCommandResult(child);
}
@Override
protected CommandResult doRedoWithResult(
IProgressMonitor progressMonitor, IAdaptable info)
throws ExecutionException {
affectedObjects.add(child);
children.add(child);
return super.doRedoWithResult(progressMonitor, info);
}
@Override
protected CommandResult doUndoWithResult(
IProgressMonitor progressMonitor, IAdaptable info)
throws ExecutionException {
affectedObjects.clear();
children.remove(child);
return super.doUndoWithResult(progressMonitor, info);
}
@Override
public Collection<?> getAffectedObjects() {
return affectedObjects;
}
@Override
public Object getImage() {
return null;
}
@Override
public String getText() {
return "Object";
}
@Override
public String getToolTipText() {
return "Create a new object.";
}
}
IModel model;
public Instances(IModel model, IAdapterFactory adapterFactory,
Object image, Collection<?> children) {
super(adapterFactory, "Instances", image, children);
this.model = model;
}
@Override
public void getNewChildDescriptors(Object object,
IEditingDomain editingDomain, Object sibling,
ICollector<Object> descriptors) {
if (!(object instanceof Instances)) {
return;
}
ChildDescriptor childDescription = new ChildDescriptor(null, true);
descriptors.add(createChildParameter(null, childDescription));
}
@Override
public ICommand createCommand(Object object,
IEditingDomain editingDomain,
Class<? extends ICommand> commandClass,
CommandParameter commandParameter) {
// Commands should operate on the values, not their wrappers. If the
// command's values needed to be unwrapped,
// we'll back get a new CommandParameter.
CommandParameter oldCommandParameter = commandParameter;
commandParameter = unwrapCommandValues(commandParameter,
commandClass);
ICommand result = UnexecutableCommand.INSTANCE;
if (commandClass == CreateChildCommand.class) {
CommandParameter newChildParameter = (CommandParameter) commandParameter
.getValue();
result = createCreateChildCommand(editingDomain,
newChildParameter.getValue());
}
// If necessary, get a command that replaces unwrapped values by
// their wrappers in the result and affected objects.
return wrapCommand(result, object, commandClass, commandParameter,
oldCommandParameter);
}
protected ICommand createCreateChildCommand(IEditingDomain domain,
Object value) {
return new CreateInstanceCommand(domain, value);
}
@Override
public IModel getModel() {
return model;
}
}
/**
* This constructs an instance from a factory and a notifier.
*/
public ModelItemProvider(IAdapterFactory adapterFactory) {
super(adapterFactory);
}
/**
* This returns the property descriptors for the adapted class.
*/
@Override
public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
return super.getPropertyDescriptors(object);
}
@Override
public Collection<?> getChildren(Object object) {
List<Object> children = new ArrayList<Object>();
if (object instanceof IModel) {
List<IObject> classes = Arrays.asList((IObject) ((IModel) object)
.getManager().find(RDFS.TYPE_RESOURCE));
children.add(new ItemProvider(getRootAdapterFactory(), "Classes",
URIs.createURI(getResourceLocator().getImage(
"full/obj16/Classes.png").toString()), classes));
// List<IObject> properties = (List<IObject>) ((IModel) object)
// .getManager().createQuery(QUERY_PROPERTIES).evaluate()
// .toList();
// children.add(new ItemProvider(getRootAdapterFactory(),
// "Properties", URIs.createURI(getResourceLocator()
// .getImage("full/obj16/Properties.png").toString()),
// properties));
}
// List<IObject> instances = (List<IObject>) ((IModel) object)
// .getManager().createQuery(QUERY_INSTANCES)
// .setIncludeInferred(true).evaluate().toList();
// children.add(new Instances((IModel) object, getRootAdapterFactory(),
// URIs.createURI(getResourceLocator().getImage(
// "full/obj16/Instances.png").toString()), instances));
return children;
}
@Override
public Object createChild(Object owner, Object property,
Object childDescription, IAdaptable info) {
return super.createChild(owner, property, childDescription, info);
}
@Override
protected void collectChildrenProperties(Object object,
Collection<IProperty> childrenProperties) {
}
/**
* This returns the parent of the Resource.
*/
@Override
public Object getParent(Object object) {
if (object instanceof IModel) {
return ((IModel) object).getModelSet();
}
return null;
}
/**
* This returns Resource.gif.
*/
@Override
public Object getImage(Object object) {
URI uri = (object instanceof IModel) ? ((IModel) object).getURI()
: ((IEntity) object).getURI();
Object image = URIs.createURI(getResourceLocator().getImage(
"full/obj16/Model").toString()
+ "#" + uri.fileExtension());
return image;
}
@Override
public boolean hasChildren(Object object) {
if (object instanceof IModel) {
return true;
}
return hasChildren(object, false);
}
/**
* This returns the label text for the adapted class.
*/
@Override
public String getText(Object object) {
return ModelUtil.getLabel(object);
}
/**
* This adds {@link net.enilink.komma.edit.command.CommandParameter}s
* describing the children that can be created under this object.
*/
@Override
protected void collectNewChildDescriptors(
ICollector<Object> newChildDescriptors, Object object) {
if (object instanceof Instances) {
newChildDescriptors.add(createChildParameter(
(IProperty) ((IEntity) object).getEntityManager().find(
RDFS.PROPERTY_SUBCLASSOF),
new ChildDescriptor(Arrays
.asList((IClass) ((IObject) object).getModel()
.resolve(OWL.TYPE_CLASS)), true)));
}
}
/**
* Return the resource locator for this item provider's resources.
*/
@Override
public IResourceLocator getResourceLocator() {
return KommaEditPlugin.INSTANCE;
}
}