1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.diagram.symbolcontribution;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.Comparator;
19 import org.simantics.databoard.Bindings;
20 import org.simantics.db.ReadGraph;
21 import org.simantics.db.Resource;
22 import org.simantics.db.common.request.BinaryRead;
23 import org.simantics.db.common.request.ObjectsWithSupertype;
24 import org.simantics.db.common.utils.NameUtils;
25 import org.simantics.db.exception.DatabaseException;
26 import org.simantics.diagram.stubs.DiagramResource;
27 import org.simantics.diagram.symbollibrary.ISymbolGroup;
28 import org.simantics.diagram.symbollibrary.ISymbolItem;
29 import org.simantics.layer0.Layer0;
30 import org.simantics.utils.strings.AlphanumComparator;
33 * A basic SymbolProviderFactory implementation for the graph database. It is
34 * capable of loading an ISymbolProvider from BasicSymbolContribution instances
38 * _ : DIA.BasicSymbolContribution
39 * DIA.BasicSymbolContributionHasSymbolLibrary
44 * @author Tuukka Lehtonen
46 public class BasicSymbolProviderFactory implements SymbolProviderFactory {
48 Resource contribution;
51 public BasicSymbolProviderFactory(Resource contribution, Resource diagram) {
52 this.contribution = contribution;
53 this.diagram = diagram;
57 public int hashCode() {
60 result = prime * result + ((contribution == null) ? 0 : contribution.hashCode());
61 result = prime * result + ((diagram == null) ? 0 : diagram.hashCode());
66 public boolean equals(Object obj) {
71 if (getClass() != obj.getClass())
73 BasicSymbolProviderFactory other = (BasicSymbolProviderFactory) obj;
74 if (contribution == null) {
75 if (other.contribution != null)
77 } else if (!contribution.equals(other.contribution))
79 if (diagram == null) {
80 if (other.diagram != null)
82 } else if (!diagram.equals(other.diagram))
88 public ISymbolProvider create(ReadGraph g) throws DatabaseException {
89 return g.syncRequest(new LoadRequest(contribution, diagram));
93 * Note: this cannot be ResourceRead since it must never be
94 * classified as immutable because of possible dynamic filters
96 static class LoadRequest extends BinaryRead<Resource, Resource, ISymbolProvider> {
97 public LoadRequest(Resource contribution, Resource diagram) {
98 super(contribution, diagram);
101 public ISymbolProvider perform(ReadGraph graph) throws DatabaseException {
102 Layer0 l0 = Layer0.getInstance(graph);
103 DiagramResource dr = DiagramResource.getInstance(graph);
105 if (!SymbolProviderFactories.accept(graph, dr, parameter, parameter2))
106 return new SymbolProvider(Collections.<ISymbolGroup>emptyList());
108 Collection<Resource> libraries = graph.getObjects(parameter, dr.BasicSymbolContributionHasSymbolLibrary);
109 Collection<ISymbolGroup> groups = new ArrayList<ISymbolGroup>(libraries.size());
111 for (Resource library : libraries) {
112 if (SymbolProviderFactories.accept(graph, dr, library, parameter2)) {
113 groups.add(createGroup(graph, library, l0.DependsOn, parameter2));
117 return new SymbolProvider(groups);
122 static class SymbolProvider extends AbstractSymbolProvider {
123 public SymbolProvider(Collection<ISymbolGroup> groups) {
125 setSymbolGroup(groups);
130 static SymbolGroup createGroup(ReadGraph graph, Resource library, Resource relation, Resource diagram) throws DatabaseException {
131 Layer0 l0 = Layer0.getInstance(graph);
132 DiagramResource dr = DiagramResource.getInstance(graph);
134 String name = safeName(graph, library);
135 String description = graph.getPossibleRelatedValue2(library, l0.HasDescription, Bindings.STRING);
136 if (description == null)
138 ModifiableSymbolGroup group = new ModifiableSymbolGroup(library, name, description);
140 ArrayList<ISymbolItem> items = new ArrayList<ISymbolItem>();
141 for (Resource item : graph.syncRequest(new ObjectsWithSupertype(library, relation, dr.Element))) {
142 if (!SymbolProviderFactories.accept(graph, dr, item, diagram)) {
146 String itemName = safeName(graph, item);
147 String itemDescription = graph.getPossibleRelatedValue2(item, l0.HasDescription, Bindings.STRING);
148 if (itemDescription == null || itemDescription.isEmpty())
149 itemDescription = itemName;
150 items.add( new ElementSymbolItem(item, itemName, itemDescription, group) );
153 Collections.sort(items, new Comparator<ISymbolItem>() {
155 public int compare(ISymbolItem o1, ISymbolItem o2) {
156 return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(o1.getName(), o2.getName());
160 group.setItems(items.toArray(new ISymbolItem[items.size()]));
165 private static String safeName(ReadGraph graph, Resource r) throws DatabaseException {
166 Layer0 L0 = Layer0.getInstance(graph);
167 String name = graph.getPossibleRelatedValue2(r, L0.HasLabel, Bindings.STRING);
168 if (name == null || name.isEmpty())
169 name = graph.getPossibleRelatedValue(r, L0.HasName, Bindings.STRING);
171 name = NameUtils.getSafeName(graph, r);