package net.enilink.komma.owl.editor.instances; import java.util.List; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import net.enilink.commons.iterator.IExtendedIterator; import net.enilink.komma.common.adapter.IAdapterFactory; import net.enilink.komma.edit.provider.ISearchableItemProvider; import net.enilink.komma.edit.provider.SparqlSearchableItemProvider; import net.enilink.komma.edit.ui.provider.LazyAdapterFactoryContentProvider; import net.enilink.komma.em.concepts.IClass; import net.enilink.komma.em.util.ISparqlConstants; import net.enilink.komma.model.IObject; import net.enilink.vocab.rdf.RDF; public class InstanceTreePart extends InstancesPart { class ContentProvider extends LazyAdapterFactoryContentProvider implements ISearchableItemProvider { public ContentProvider(IAdapterFactory adapterFactory) { super(adapterFactory); } public IExtendedIterator<?> find(Object expression, Object parent, int limit) { SparqlSearchableItemProvider searchableProvider = new SparqlSearchableItemProvider() { @Override protected String getQueryFindPatterns(Object parent) { if (RDF.TYPE_PROPERTY.equals(currentInput) || currentInput.getRdfsSubClassOf().contains( RDF.TYPE_PROPERTY)) { return "?s rdfs:subPropertyOf [ a ?parent ] . "; } return "[ a ?parent; komma:child* ?s ] . "; } }; return searchableProvider.find(expression, currentInput, 20); } } protected IClass currentInput; @Override protected StructuredViewer createViewer(Composite parent) { Tree tree = getWidgetFactory().createTree(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL | SWT.MULTI); TreeViewer viewer = new TreeViewer(tree); viewer.setUseHashlookup(true); return viewer; } @Override protected void adapterFactoryChanged() { super.adapterFactoryChanged(); getViewer() .setContentProvider(new ContentProvider(getAdapterFactory())); } protected String instancesQuery() { StringBuilder sb = new StringBuilder(ISparqlConstants.PREFIX) .append("SELECT DISTINCT ?r WHERE { ?r a [ rdfs:subClassOf* ?c ] FILTER NOT EXISTS { "); if (RDF.TYPE_PROPERTY.equals(currentInput) || currentInput.getRdfsSubClassOf().contains(RDF.TYPE_PROPERTY)) { sb.append("?other a ?c . ?r rdfs:subPropertyOf ?other FILTER (?r != ?other)"); } else { sb.append("?other a [ rdfs:subClassOf* ?c ]; komma:child ?r FILTER (?r != ?other)"); } sb.append(" }} ORDER BY ?r"); return sb.toString(); } @Override protected void setInputToViewer(StructuredViewer viewer, IClass input) { currentInput = input; if (input == null) { viewer.setInput(null); } else { List<IObject> instances = input.getEntityManager() .createQuery(instancesQuery()).setParameter("c", input) .evaluateRestricted(IObject.class).toList(); viewer.setInput(instances.toArray()); } } }