package org.simantics.selectionview; import java.lang.reflect.Array; import java.util.Collection; import java.util.Objects; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.utils.Functions; import org.simantics.db.exception.DatabaseException; import org.simantics.layer0.Layer0; public abstract class AbstractTabContribution implements TabContribution { protected final Resource configuration; protected final String uri; public AbstractTabContribution(ReadGraph graph, Resource configuration) throws DatabaseException { this.configuration = Objects.requireNonNull(configuration); this.uri = graph.getURI(configuration); } @Override public boolean accept(ReadGraph graph, Object input) throws DatabaseException { SelectionViewResources SEL = SelectionViewResources.getInstance(graph); // Lets see if multi or single support Boolean multi = graph.getRelatedValue2(configuration, SEL.TabContribution_Multi, Bindings.BOOLEAN); if (input instanceof Collection) { Collection inputs = (Collection) input; if (inputs.isEmpty()) return false; if (inputs.size() > 1 && !multi) return false; } else if (input.getClass().isArray()) { int arrayLength = Array.getLength(input); if (arrayLength == 0) return false; if (arrayLength > 1 && !multi) return false; } // HasTest seems to be deprecated but lets support it just for fun for(Resource r : graph.getObjects(configuration, SEL.TabContribution_HasTest)) { Boolean pass = Functions.exec(graph, r, graph, input); if(!pass) return false; } return true; } public abstract void getContributors(ReadGraph graph, T input, Integer priority, String label, Collection result) throws DatabaseException; @Override public final void contribute(ReadGraph graph, T input, Collection result) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); SelectionViewResources SEL = SelectionViewResources.getInstance(graph); Integer priority = graph.getPossibleRelatedValue(configuration, SEL.TabContribution_HasPriority, Bindings.INTEGER); String label = graph.getPossibleRelatedValue(configuration, L0.HasLabel); getContributors(graph, input, priority, label, result); } @Override public String toString() { return getClass().getSimpleName() + "[" + uri + "]"; } }