/*******************************************************************************
* Copyright (c) 2007, 2010 Association for Decentralized Information Management
* in Industry THTH ry.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VTT Technical Research Centre of Finland - initial API and implementation
*******************************************************************************/
package org.simantics.modeling.requests;
import java.util.ArrayDeque;
import java.util.Deque;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.simantics.NameLabelUtil;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.common.request.ReadRequest;
import org.simantics.db.common.request.ResourceRead;
import org.simantics.db.common.utils.NameUtils;
import org.simantics.db.exception.AdaptionException;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.request.Read;
import org.simantics.diagram.query.DiagramRequests;
import org.simantics.diagram.stubs.DiagramResource;
import org.simantics.layer0.Layer0;
import org.simantics.modeling.ModelingResources;
import org.simantics.modeling.internal.Plugin;
import org.simantics.simulation.ontology.SimulationResource;
import org.simantics.structural.stubs.StructuralResource2;
import org.simantics.utils.page.PageDesc;
/**
* If the specified progress monitor indicates cancellation, the request will
* return null
.
*
* @author Tuukka Lehtonen
*/
public class CollectionRequest implements Read {
private static final boolean DEBUG = false;
IProgressMonitor monitor;
PageDesc defaultPageDesc;
Resource[] input;
ReadGraph g;
Layer0 l0;
StructuralResource2 sr;
DiagramResource dr;
ModelingResources mr;
SimulationResource SIMU;
public CollectionRequest(IProgressMonitor monitor, PageDesc defaultPageDesc, Resource... input) {
this.monitor = monitor != null ? monitor : new NullProgressMonitor();
this.defaultPageDesc = defaultPageDesc;
this.input = input;
}
String safeGetName(Resource r) throws DatabaseException {
return g.syncRequest(new GetName(r));
}
// Collection getPartOfGroups(Resource diagram) throws DatabaseException {
// Resource r = diagram;
// Deque result = new ArrayDeque();
// loop:
// while (true) {
// for (Resource partOf : g.getObjects(r, b.PartOf)) {
// if (g.isInstanceOf(partOf, dr.DiagramLibrary)) {
// result.addFirst(safeGetName(partOf));
// r = partOf;
// continue loop;
// }
// }
// return result;
// }
// }
@Override
public CollectionResult perform(ReadGraph g) throws DatabaseException {
this.g = g;
l0 = Layer0.getInstance(g);
dr = DiagramResource.getInstance(g);
sr = StructuralResource2.getInstance(g);
mr = ModelingResources.getInstance(g);
SIMU = SimulationResource.getInstance(g);
final CollectionResult result = new CollectionResult();
final Deque roots = new ArrayDeque();
// 1. Based on input, look for the proper nodes to start browsing for diagrams.
for (Resource r : input) {
/*if (g.isInstanceOf(r, SIMU.Model)) {
// Complete models
Resource composite = g.getPossibleObject(r, SIMU.HasConfiguration);
Resource diagram = composite != null ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;
if (DEBUG)
System.out.println("Model root");
if (composite != null) {
Node node = new Node(null, safeGetName(r), diagram, composite, r);
roots.add(node);
result.roots.add(roots.peekLast());
}
} else*/ if (g.isInstanceOf(r, l0.IndexRoot)) {
// for(Resource type : ModelingUtils.searchByTypeShallow(g, r, sr.ComponentType)) {
// Resource composite = g.getPossibleObject(type, sr.IsDefinedBy);
// Resource diagram = composite != null ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;
// if(composite != null) {
// Node node = new Node(null, safeGetName(r), diagram, composite, r);
// roots.add(node);
// result.roots.add(roots.peekLast());
// }
// }
Node node = new Node(null, safeGetName(r), null, r);
roots.add(node);
result.roots.add(roots.peekLast());
} else if (g.isInstanceOf(r, sr.Composite)) {
// The contents of components
String name = null;
Resource model = g.getPossibleObject(r, SIMU.IsConfigurationOf);
//Resource componentType = g.getPossibleObject(r, sr.Defines);
if (model != null) {
name = safeGetName(model);
if (DEBUG)
System.out.println("Configuration root: " + name);
// } else if (componentType != null) {
// Resource singleInstance = componentType != null ? g.getPossibleObject(componentType, b.HasSingleInstance) : null;
// name = singleInstance != null ? safeGetName(singleInstance) : safeGetName(componentType);
// System.out.println("Composite of component type root: " + name);
} else {
name = safeGetName(r);
if (DEBUG)
System.out.println("Composite root: " + name);
}
Resource diagram = g.getPossibleObject(r, mr.CompositeToDiagram);
diagram = (diagram != null && g.isInstanceOf(diagram, dr.Composite)) ? diagram : null;
{
Node node = new Node(null, name, diagram, r);
roots.add(node);
result.roots.add(roots.peekLast());
}
// } else if (g.isInstanceOf(r, sr.Component)) {
// // Complete components themselves
// Resource componentType = g.getSingleType(r, sr.Component);
// Resource composite = g.getPossibleObject(componentType, sr.IsDefinedBy);
// Resource diagram = (composite != null && g.isInstanceOf(composite, sr.Composite)) ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;
// String name = safeGetName(r);
// System.out.println("Component root: " + name);
// roots.add(new Node(null, name, diagram, composite, r));
// result.roots.add(roots.peekLast());
} else if (g.isInheritedFrom(r, dr.DefinedElement)) {
// Symbols
Resource composite = g.getPossibleObject(r, sr.IsDefinedBy);
composite = (composite != null && g.isInstanceOf(composite, dr.Composite)) ? composite : null;
if (composite != null) {
Resource componentType = g.getPossibleObject(r, mr.SymbolToComponentType);
String name = safeGetName(componentType);
name += " Symbol";
if (DEBUG)
System.out.println("Symbol root: " + name);
{
Node node = new Node(null, name, composite, r);
roots.add(node);
result.roots.add(roots.peekLast());
}
}
// } else if (g.isInheritedFrom(r, sr.Component)) {
// // Reusable component types
// Resource composite = g.getPossibleObject(r, sr.IsDefinedBy);
// Resource diagram = (composite != null && g.isInstanceOf(composite, sr.Composite)) ? g.getPossibleObject(composite, mr.CompositeToDiagram) : null;
// String name = safeGetName(r);
// System.out.println("Component type root: " + name);
// roots.add(new Node(null, name, diagram, r, composite));
// result.roots.add(roots.peekLast());
}
}
final SubMonitor mon = SubMonitor.convert(monitor);
g.syncRequest(new ReadRequest() {
@Override
public void run(ReadGraph graph) throws DatabaseException {
for (Node node : roots) {
loadComposites(graph, node);
}
}
private void loadComposites(ReadGraph graph, final Node node) throws DatabaseException {
Resource diagram = node.getDiagramResource();
//System.out.println("loadComposites(" + diagram + ", " + node + ")");
if (diagram != null) {
result.addDiagram(diagram, node);
// node.setPartOfGroups(getPartOfGroups(diagram));
}
mon.setWorkRemaining(1000);
for(Resource r : graph.getObjects(node.getDefiningResources().resources[0], l0.ConsistsOf)) {
if(graph.isInstanceOf(r, sr.Composite)) {
String compositeName = graph.syncRequest(new GetName(r));
Resource definingDiagram = graph.getPossibleObject(r, mr.CompositeToDiagram);
Node n = new Node(node, compositeName, definingDiagram, r);
loadComposites(graph, n);
mon.worked(1);
} else if (graph.isInstanceOf(r, l0.Library)) {
String compositeName = graph.syncRequest(new GetName(r));
Node n = new Node(node, compositeName, null, r);
loadComposites(graph, n);
mon.worked(1);
} else if (graph.isInheritedFrom(r, sr.Component)) {
String name = safeGetName(r);
Node n = new Node(node, name, null, r);
loadComposites(graph, n);
mon.worked(1);
}
}
}
});
ILog log = Platform.getLog(Platform.getBundle(Plugin.PLUGIN_ID));
// Assign a page size description for each node.
for (Node node : result.diagramList) {
if (monitor.isCanceled())
return null;
mon.setWorkRemaining(10000);
try {
PageDesc realPageDesc = g.syncRequest(DiagramRequests.getPageDesc(node.getDiagramResource(), defaultPageDesc));
node.setPageDesc(realPageDesc);
} catch (DatabaseException e) {
log.log(new Status(IStatus.WARNING, Plugin.PLUGIN_ID,
"Broken page description in diagram "
+ NameUtils.getURIOrSafeNameInternal(g, node.getDiagramResource())
+ ". Reopen the diagram to fix it.", e));
}
mon.worked(1);
}
if (monitor.isCanceled())
return null;
return result;
}
static class GetName extends ResourceRead {
public GetName(Resource resource) {
super(resource);
}
@Override
public String perform(ReadGraph graph) throws DatabaseException {
try {
return NameLabelUtil.modalName(graph, resource);
} catch (AdaptionException e) {
return NameUtils.getSafeName(graph, resource);
}
}
}
}