From 32c804755176db2bb20f46f6a69a418c46d458f5 Mon Sep 17 00:00:00 2001 From: Antti Villberg Date: Mon, 27 Mar 2017 11:17:25 +0300 Subject: [PATCH] Support tg discovery in export/import refs #7103 Change-Id: I471f9f0d5fa2b1bb1b825d7fde69eabc57422799 --- .../db/layer0/migration/MigrationUtils.java | 52 ++++++++++++------ .../db/layer0/util/ExternalDownloadBean.java | 20 +++++++ .../util/ModelTransferableGraphSource.java | 8 +++ bundles/org.simantics.layer0/graph.tg | Bin 54010 -> 54173 bytes .../org.simantics.layer0/graph/Layer0.pgraph | 3 +- .../src/org/simantics/layer0/Layer0.java | 6 ++ .../org/simantics/modeling/ModelingUtils.java | 6 ++ 7 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExternalDownloadBean.java diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java index 052bc6e6f..7af76baf3 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/MigrationUtils.java @@ -11,24 +11,32 @@ *******************************************************************************/ package org.simantics.db.layer0.migration; +import java.io.DataInputStream; import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.simantics.databoard.Bindings; +import org.simantics.databoard.adapter.AdaptException; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.container.DataContainer; +import org.simantics.databoard.container.DataContainers; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.WriteGraph; import org.simantics.db.WriteOnlyGraph; import org.simantics.db.common.CommentMetadata; +import org.simantics.db.common.primitiverequest.PossibleResource; import org.simantics.db.common.request.BinaryRead; import org.simantics.db.common.request.FreshEscapedName; import org.simantics.db.common.request.UnaryRead; @@ -42,6 +50,7 @@ import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler; import org.simantics.db.layer0.adapter.impl.SharedOntologyImportAdvisor; import org.simantics.db.layer0.adapter.impl.TrashBinRemover; import org.simantics.db.layer0.internal.SimanticsInternal; +import org.simantics.db.layer0.util.ExternalDownloadBean; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.layer0.util.TGTransferableGraphSource; import org.simantics.db.service.XSupport; @@ -307,32 +316,39 @@ public class MigrationUtils { if(monitor == null) monitor = new NullProgressMonitor(); + Variant edbVariant = tg.extensions.get(ExternalDownloadBean.EXTENSION_KEY); + if(edbVariant != null) { + try { + ExternalDownloadBean edb = (ExternalDownloadBean)edbVariant.getValue(ExternalDownloadBean.BINDING); + for(Map.Entry entry : edb.downloads.entrySet()) { + String uri = entry.getKey(); + Resource existing = session.syncRequest(new PossibleResource(uri)); + if(existing == null) { + String download = entry.getValue(); + URL url = new URL(download); + DataContainer container = DataContainers.readFile(new DataInputStream(url.openStream())); + TransferableGraph1 dependencyTg = (TransferableGraph1) container.content.getValue(TransferableGraph1.BINDING); + importSharedOntology(monitor, session, dependencyTg, true); + } + } + } catch (AdaptException e) { + throw new DatabaseException(e); + } catch (MalformedURLException e) { + throw new DatabaseException(e); + } catch (IOException e) { + throw new DatabaseException(e); + } + + } + Collection roots = TransferableGraphUtils.getRoots(tg); if(roots.size() == 1) { -// Identity id = roots.iterator().next(); -// final Root root = (Root)id.definition; -// Resource rootResource = session.syncRequest(new WriteResultRequest() { -// @Override -// public Resource perform(WriteGraph graph) throws DatabaseException { -// Resource type = graph.getResource(root.type); -// Resource existing = graph.getPossibleResource(root.name); -// if(existing != null) throw new DatabaseException("Shared library " + root.name + " exists already."); -// return Layer0Utils.applySCL("Simantics/SharedOntologies", "createSharedOntology", graph, root.name, type); -// } -// }); try { TGTransferableGraphSource tgSource = new TGTransferableGraphSource(tg); SharedOntologyImportAdvisor advisor = new SharedOntologyImportAdvisor(published); -// TransferableGraphs.importGraph1(session, tgSource, advisor); - -// if (advisor.getRoots().size() == 1) { -// return advisor.getRoots().iterator().next(); -// } - //TransferableGraphs.importGraph1(session, tg, new SharedOntologyImportAdvisor(), null); MigrationState state = newState(); - //state.setProperty(MigrationStateKeys.BASE_URI, AprosBuiltins.URIs.Migration); state.setProperty(MigrationStateKeys.UPDATE_DEPENDENCIES, false); state.setProperty(MigrationStateKeys.CURRENT_TGS, tgSource); state.setProperty(MigrationStateKeys.SESSION, session); diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExternalDownloadBean.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExternalDownloadBean.java new file mode 100644 index 000000000..6dd2b84ac --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ExternalDownloadBean.java @@ -0,0 +1,20 @@ +package org.simantics.db.layer0.util; + +import java.util.TreeMap; + +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.Binding; + +public class ExternalDownloadBean { + + public static final String EXTENSION_KEY = ExternalDownloadBean.class.getSimpleName(); + + public static final Binding BINDING = Bindings.getBindingUnchecked(ExternalDownloadBean.class); + + public TreeMap downloads = new TreeMap<>(); + + public ExternalDownloadBean(TreeMap downloads) { + this.downloads = downloads; + } + +} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelTransferableGraphSource.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelTransferableGraphSource.java index 8602da827..cbd3130ee 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelTransferableGraphSource.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelTransferableGraphSource.java @@ -52,6 +52,7 @@ public class ModelTransferableGraphSource implements TransferableGraphSource { TIntArrayList externalParents = new TIntArrayList(); ArrayList externalNames = new ArrayList(); + TreeMap downloads = new TreeMap(); public ModelTransferableGraphSource(final ReadGraph graph, TransferableGraphConfiguration2 configuration, final DomainProcessorState state, File ... fs) throws DatabaseException { @@ -118,6 +119,8 @@ public class ModelTransferableGraphSource implements TransferableGraphSource { this.resourceCount = state.id; + state.extensions.put(ExternalDownloadBean.EXTENSION_KEY, new Variant(ExternalDownloadBean.BINDING, new ExternalDownloadBean(downloads))); + } int indent = 0; @@ -200,6 +203,11 @@ public class ModelTransferableGraphSource implements TransferableGraphSource { state.ids.put(r, state.id); // Ensure that this resource is included into the set of externals to maintain the total number of externals state.externals.add(r); + String download = graph.getPossibleRelatedValue(res, L0.Ontology_download, Bindings.STRING); + if(download != null) { + String uri = graph.getURI(res); + downloads.put(uri, download); + } return state.id++; } } diff --git a/bundles/org.simantics.layer0/graph.tg b/bundles/org.simantics.layer0/graph.tg index 931d67ed3fa59d49198af25f0c2b807b5612a2fe..37fc6470b1af1b90d96da5365c07f1787a10ea5d 100644 GIT binary patch literal 54173 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 literal 54010 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 diff --git a/bundles/org.simantics.layer0/graph/Layer0.pgraph b/bundles/org.simantics.layer0/graph/Layer0.pgraph index 41f13c301..93d348f05 100644 --- a/bundles/org.simantics.layer0/graph/Layer0.pgraph +++ b/bundles/org.simantics.layer0/graph/Layer0.pgraph @@ -107,7 +107,8 @@ L0.Ontology -- L0.Ontology.global L0.Boolean - + >-- L0.Ontology.download --> L0.String -- L0.SharedOntology.treatAsSystemOntology --> L0.Boolean