1 package org.simantics.diagram.export;
\r
3 import java.util.Collection;
\r
4 import java.util.Deque;
\r
5 import java.util.HashMap;
\r
6 import java.util.LinkedList;
\r
7 import java.util.Map;
\r
9 import org.simantics.NameLabelMode;
\r
10 import org.simantics.NameLabelUtil;
\r
11 import org.simantics.db.ReadGraph;
\r
12 import org.simantics.db.Resource;
\r
13 import org.simantics.db.common.request.UniqueRead;
\r
14 import org.simantics.db.exception.AssumptionException;
\r
15 import org.simantics.db.exception.DatabaseException;
\r
16 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
\r
17 import org.simantics.db.exception.ServiceException;
\r
18 import org.simantics.db.exception.ValidationException;
\r
19 import org.simantics.db.layer0.request.PossibleModel;
\r
20 import org.simantics.db.request.Read;
\r
21 import org.simantics.export.core.ExportContext;
\r
22 import org.simantics.export.core.error.ExportException;
\r
23 import org.simantics.export.core.intf.ContentTypeAction;
\r
24 import org.simantics.layer0.Layer0;
\r
25 import org.simantics.simulation.ontology.SimulationResource;
\r
27 public class DiagramContentTypeAction implements ContentTypeAction {
\r
29 public static String getDiagramLabel(ReadGraph graph, Resource r) throws DatabaseException
\r
31 SimulationResource SIM = SimulationResource.getInstance(graph);
\r
33 NameLabelMode mode = NameLabelUtil.getNameLabelMode(graph);
\r
37 Resource model = graph.sync( new PossibleModel(r) );
\r
38 if ( model == null ) break labelFailed;
\r
39 Resource configuration = graph.getPossibleObject(model, SIM.HasConfiguration);
\r
40 if ( configuration == null ) break labelFailed;
\r
41 Deque<Resource> path = getPathTo(graph, r, model);
\r
42 if ( path == null) break labelFailed;
\r
43 path.remove(configuration);
\r
45 StringBuilder sb = new StringBuilder();
\r
46 for ( Resource node : path ) {
\r
47 if ( sb.length()>0 ) sb.append(" / ");
\r
48 String nodeLabel = NameLabelUtil.modalName(graph, node, mode);
\r
49 sb.append( nodeLabel );
\r
52 return sb.toString();
\r
53 } catch (AssumptionException e) {
\r
54 } catch (ValidationException e) {
\r
55 } catch (ServiceException e) {
\r
58 String uri = graph.getURI( r );
\r
59 int c = uri.lastIndexOf('/');
\r
61 String label = uri.substring(c+1);
\r
62 if ( !label.isEmpty() ) return label;
\r
69 public Map<String, String> getLabels(ExportContext ctx, final Collection<String> uris) throws ExportException {
\r
70 Read<Map<String, String>> req = new UniqueRead<Map<String, String>>() {
\r
72 public Map<String, String> perform(ReadGraph graph) throws DatabaseException {
\r
73 Map<String, String> result = new HashMap<String, String>();
\r
75 for ( String uri : uris ) {
\r
76 Resource r = graph.getResource( uri );
\r
77 String label = getDiagramLabel(graph, r);
\r
78 result.put(uri, label);
\r
86 return ctx.session.syncRequest( req );
\r
87 } catch (DatabaseException e) {
\r
88 throw new ExportException( e );
\r
93 * Get all resource between start and end by following PartOf relation.
\r
94 * If there is no path, returns null.
\r
95 * Start is included, end is excluded.
\r
100 * @return path from end to start
\r
101 * @throws ServiceException
\r
102 * @throws ManyObjectsForFunctionalRelationException
\r
104 static Deque<Resource> getPathTo(ReadGraph graph, Resource start, Resource end) throws DatabaseException {
\r
105 LinkedList<Resource> result = new LinkedList<Resource>();
\r
107 Layer0 L0 = Layer0.getInstance(graph);
\r
108 Resource pos = start;
\r
109 while ( !pos.equals(end) ) {
\r
110 result.add(0, pos);
\r
111 pos = graph.getPossibleObject(pos, L0.PartOf);
\r
112 if ( pos==null ) return null;
\r