1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.symbolcontribution;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.Collections;
\r
17 import java.util.Comparator;
\r
19 import org.simantics.databoard.Bindings;
\r
20 import org.simantics.db.ReadGraph;
\r
21 import org.simantics.db.Resource;
\r
22 import org.simantics.db.common.request.BinaryRead;
\r
23 import org.simantics.db.common.request.ObjectsWithSupertype;
\r
24 import org.simantics.db.common.utils.NameUtils;
\r
25 import org.simantics.db.exception.DatabaseException;
\r
26 import org.simantics.diagram.stubs.DiagramResource;
\r
27 import org.simantics.diagram.symbollibrary.ISymbolGroup;
\r
28 import org.simantics.diagram.symbollibrary.ISymbolItem;
\r
29 import org.simantics.layer0.Layer0;
\r
32 * A basic SymbolProviderFactory implementation for the graph database. It is
\r
33 * capable of loading an ISymbolProvider from BasicSymbolContribution instances
\r
34 * like the following:
\r
37 * _ : DIA.BasicSymbolContribution
\r
38 * DIA.BasicSymbolContributionHasSymbolLibrary
\r
43 * @author Tuukka Lehtonen
\r
45 public class BasicSymbolProviderFactory implements SymbolProviderFactory {
\r
47 Resource contribution;
\r
50 public BasicSymbolProviderFactory(Resource contribution, Resource diagram) {
\r
51 this.contribution = contribution;
\r
52 this.diagram = diagram;
\r
56 public int hashCode() {
\r
57 final int prime = 31;
\r
59 result = prime * result + ((contribution == null) ? 0 : contribution.hashCode());
\r
60 result = prime * result + ((diagram == null) ? 0 : diagram.hashCode());
\r
65 public boolean equals(Object obj) {
\r
70 if (getClass() != obj.getClass())
\r
72 BasicSymbolProviderFactory other = (BasicSymbolProviderFactory) obj;
\r
73 if (contribution == null) {
\r
74 if (other.contribution != null)
\r
76 } else if (!contribution.equals(other.contribution))
\r
78 if (diagram == null) {
\r
79 if (other.diagram != null)
\r
81 } else if (!diagram.equals(other.diagram))
\r
87 public ISymbolProvider create(ReadGraph g) throws DatabaseException {
\r
88 return g.syncRequest(new LoadRequest(contribution, diagram));
\r
92 * Note: this cannot be ResourceRead since it must never be
\r
93 * classified as immutable because of possible dynamic filters
\r
95 static class LoadRequest extends BinaryRead<Resource, Resource, ISymbolProvider> {
\r
96 public LoadRequest(Resource contribution, Resource diagram) {
\r
97 super(contribution, diagram);
\r
100 public ISymbolProvider perform(ReadGraph graph) throws DatabaseException {
\r
101 Layer0 l0 = Layer0.getInstance(graph);
\r
102 DiagramResource dr = DiagramResource.getInstance(graph);
\r
104 if (!SymbolProviderFactories.accept(graph, dr, parameter, parameter2))
\r
105 return new SymbolProvider(Collections.<ISymbolGroup>emptyList());
\r
107 Collection<Resource> libraries = graph.getObjects(parameter, dr.BasicSymbolContributionHasSymbolLibrary);
\r
108 Collection<ISymbolGroup> groups = new ArrayList<ISymbolGroup>(libraries.size());
\r
110 for (Resource library : libraries) {
\r
111 if (SymbolProviderFactories.accept(graph, dr, library, parameter2)) {
\r
112 groups.add(createGroup(graph, library, l0.DependsOn, parameter2));
\r
116 return new SymbolProvider(groups);
\r
121 static class SymbolProvider extends AbstractSymbolProvider {
\r
122 public SymbolProvider(Collection<ISymbolGroup> groups) {
\r
124 setSymbolGroup(groups);
\r
129 static SymbolGroup createGroup(ReadGraph graph, Resource library, Resource relation, Resource diagram) throws DatabaseException {
\r
130 Layer0 l0 = Layer0.getInstance(graph);
\r
131 DiagramResource dr = DiagramResource.getInstance(graph);
\r
133 String name = safeName(graph, library);
\r
134 String description = graph.getPossibleRelatedValue2(library, l0.HasDescription, Bindings.STRING);
\r
135 if (description == null)
\r
136 description = name;
\r
137 ModifiableSymbolGroup group = new ModifiableSymbolGroup(library, name, description);
\r
139 ArrayList<ISymbolItem> items = new ArrayList<ISymbolItem>();
\r
140 for (Resource item : graph.syncRequest(new ObjectsWithSupertype(library, relation, dr.Element))) {
\r
141 if (!SymbolProviderFactories.accept(graph, dr, item, diagram)) {
\r
145 String itemName = safeName(graph, item);
\r
146 String itemDescription = graph.getPossibleRelatedValue2(item, l0.HasDescription, Bindings.STRING);
\r
147 if (itemDescription == null || itemDescription.isEmpty())
\r
148 itemDescription = itemName;
\r
149 items.add( new ElementSymbolItem(item, itemName, itemDescription, group) );
\r
152 Collections.sort(items, new Comparator<ISymbolItem>() {
\r
154 public int compare(ISymbolItem o1, ISymbolItem o2) {
\r
155 return o1.getName().compareToIgnoreCase(o2.getName());
\r
159 group.setItems(items.toArray(new ISymbolItem[items.size()]));
\r
164 private static String safeName(ReadGraph graph, Resource r) throws DatabaseException {
\r
165 Layer0 L0 = Layer0.getInstance(graph);
\r
166 String name = graph.getPossibleRelatedValue2(r, L0.HasLabel, Bindings.STRING);
\r
167 if (name == null || name.isEmpty())
\r
168 name = graph.getPossibleRelatedValue(r, L0.HasName, Bindings.STRING);
\r
170 name = NameUtils.getSafeName(graph, r);
\r