From: Hannu Niemistö Date: Tue, 6 Mar 2018 07:15:30 +0000 (+0200) Subject: Merge "Tried to improve the implementation of getPossibleDomainProperty" X-Git-Tag: v1.43.0~136^2~563 X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=commitdiff_plain;h=1251d640abb698a4018ef1ea212f8cdf78befaaf;hp=85c1daf4b3d4a48613e0c61c359cb8aac2157f01 Merge "Tried to improve the implementation of getPossibleDomainProperty" --- diff --git a/bundles/hdf.hdf5lib/.classpath b/bundles/hdf.hdf5lib/.classpath new file mode 100644 index 000000000..3d5627760 --- /dev/null +++ b/bundles/hdf.hdf5lib/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/bundles/hdf.hdf5lib/.project b/bundles/hdf.hdf5lib/.project new file mode 100644 index 000000000..6e3c1da76 --- /dev/null +++ b/bundles/hdf.hdf5lib/.project @@ -0,0 +1,28 @@ + + + hdf.hdf5lib + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/hdf.hdf5lib/.settings/org.eclipse.jdt.core.prefs b/bundles/hdf.hdf5lib/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..295926d96 --- /dev/null +++ b/bundles/hdf.hdf5lib/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bundles/hdf.hdf5lib/COPYING b/bundles/hdf.hdf5lib/COPYING new file mode 100644 index 000000000..08bc324bf --- /dev/null +++ b/bundles/hdf.hdf5lib/COPYING @@ -0,0 +1,98 @@ + +Copyright Notice and License Terms for +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +----------------------------------------------------------------------------- + +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 2006-2016 by The HDF Group. + +NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 1998-2006 by the Board of Trustees of the University of Illinois. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted for any purpose (including commercial purposes) +provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or materials provided with the distribution. + +3. In addition, redistributions of modified forms of the source or binary + code must carry prominent notices stating that the original code was + changed and the date of the change. + +4. All publications or advertising materials mentioning features or use of + this software are asked, but not required, to acknowledge that it was + developed by The HDF Group and by the National Center for Supercomputing + Applications at the University of Illinois at Urbana-Champaign and + credit the contributors. + +5. Neither the name of The HDF Group, the name of the University, nor the + name of any Contributor may be used to endorse or promote products derived + from this software without specific prior written permission from + The HDF Group, the University, or the Contributor, respectively. + +DISCLAIMER: +THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS +"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. In no +event shall The HDF Group or the Contributors be liable for any damages +suffered by the users arising out of the use of this software, even if +advised of the possibility of such damage. + +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- + +Contributors: National Center for Supercomputing Applications (NCSA) at +the University of Illinois, Fortner Software, Unidata Program Center (netCDF), +The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), +and Digital Equipment Corporation (DEC). + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the Lawrence Berkeley +National Laboratory (LBNL) and the United States Department of Energy +under Prime Contract No. DE-AC02-05CH11231. + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the University of +California, Lawrence Livermore National Laboratory (UC LLNL). +The following statement applies to those portions of the product and must +be retained in any redistribution of source code, binaries, documentation, +and/or accompanying materials: + + This work was partially produced at the University of California, + Lawrence Livermore National Laboratory (UC LLNL) under contract + no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy + (DOE) and The Regents of the University of California (University) + for the operation of UC LLNL. + + DISCLAIMER: + This work was prepared as an account of work sponsored by an agency of + the United States Government. Neither the United States Government nor + the University of California nor any of their employees, makes any + warranty, express or implied, or assumes any liability or responsibility + for the accuracy, completeness, or usefulness of any information, + apparatus, product, or process disclosed, or represents that its use + would not infringe privately- owned rights. Reference herein to any + specific commercial products, process, or service by trade name, + trademark, manufacturer, or otherwise, does not necessarily constitute + or imply its endorsement, recommendation, or favoring by the United + States Government or the University of California. The views and + opinions of authors expressed herein do not necessarily state or reflect + those of the United States Government or the University of California, + and shall not be used for advertising or product endorsement purposes. + +----------------------------------------------------------------------------- + +HDF5 is available with the SZIP compression library but SZIP is not part +of HDF5 and has separate copyright and license terms. See “Szip Compression +in HDF Products” (www.hdfgroup.org/doc_resource/SZIP/) for further details. + +----------------------------------------------------------------------------- + diff --git a/bundles/hdf.hdf5lib/META-INF/MANIFEST.MF b/bundles/hdf.hdf5lib/META-INF/MANIFEST.MF new file mode 100644 index 000000000..c7ef8a4da --- /dev/null +++ b/bundles/hdf.hdf5lib/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Java HDF5 Interface (JHI5) +Bundle-SymbolicName: hdf.hdf5lib +Bundle-Version: 1.10.0.patch1 +Bundle-Vendor: Semantum Oy +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ClassPath: ., + jarhdf5-1.10.0.jar +Export-Package: hdf.hdf5lib, + hdf.hdf5lib.callbacks, + hdf.hdf5lib.exceptions, + hdf.hdf5lib.structs +Bundle-NativeCode: hdf5_java.dll; processor=x86_64; osname=win32 +Require-Bundle: org.slf4j.api;bundle-version="1.7.2" diff --git a/bundles/hdf.hdf5lib/README.md b/bundles/hdf.hdf5lib/README.md new file mode 100644 index 000000000..ea6445a44 --- /dev/null +++ b/bundles/hdf.hdf5lib/README.md @@ -0,0 +1,4 @@ +The Java HDF5 interface library and the accompanying hdf5_java.dll JNI library +are built without both separately licensed ZLIB and SZIP open source libraries. +The native library (DLL) has been compiled with Visual Studio 2015 and dynamic +linking. \ No newline at end of file diff --git a/bundles/hdf.hdf5lib/about.html b/bundles/hdf.hdf5lib/about.html new file mode 100644 index 000000000..80b486768 --- /dev/null +++ b/bundles/hdf.hdf5lib/about.html @@ -0,0 +1,22 @@ + + + + +About + + +

About This Content

+ +

August 29th, 2016

+

License

+ +

Third Party Content

+

The Content includes items that have been sourced from third parties as set out below.

+

+ Java HDF5 Interface (JHI5), version 1.10.0-patch1

+ This library has been obtained from the HDF Group + (https://www.hdfgroup.org/HDF5/release/obtain5110.html) unmodified. + See file COPYING for more information on the license. +

+ + \ No newline at end of file diff --git a/bundles/hdf.hdf5lib/build.properties b/bundles/hdf.hdf5lib/build.properties new file mode 100644 index 000000000..4a873ef6e --- /dev/null +++ b/bundles/hdf.hdf5lib/build.properties @@ -0,0 +1,10 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + jarhdf5-1.10.0.jar,\ + hdf5_java.dll,\ + COPYING,\ + README.md,\ + about.html +src.includes = COPYING diff --git a/bundles/hdf.hdf5lib/hdf5_java.dll b/bundles/hdf.hdf5lib/hdf5_java.dll new file mode 100644 index 000000000..aed8a7705 Binary files /dev/null and b/bundles/hdf.hdf5lib/hdf5_java.dll differ diff --git a/bundles/hdf.hdf5lib/jarhdf5-1.10.0.jar b/bundles/hdf.hdf5lib/jarhdf5-1.10.0.jar new file mode 100644 index 000000000..1fcdb3261 Binary files /dev/null and b/bundles/hdf.hdf5lib/jarhdf5-1.10.0.jar differ diff --git a/bundles/hdf.hdf5lib/pom.xml b/bundles/hdf.hdf5lib/pom.xml new file mode 100644 index 000000000..5c00b7ab1 --- /dev/null +++ b/bundles/hdf.hdf5lib/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + hdf.hdf5lib + eclipse-plugin + 1.10.0.patch1 + + + org.simantics + org.simantics.root.bundles + 1.0.0-SNAPSHOT + .. + + + + + + org.eclipse.tycho + target-platform-configuration + + + + win32 + x86_64 + + + + + + + + \ No newline at end of file diff --git a/bundles/hdf.hdf5lib/src/.keep b/bundles/hdf.hdf5lib/src/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterChange2.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterChange2.java deleted file mode 100644 index 472b4d7b7..000000000 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterChange2.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.simantics.acorn.internal; - - -public class ClusterChange2 { - public static final int VERSION = 2; - public static final byte SET_IMMUTABLE_OPERATION = 1; // - public static final byte UNDO_VALUE_OPERATION = 2; // - private static final int INCREMENT = 1<<10; -// private boolean dirty = false; -// private byte[] bytes; -// private int byteIndex; -// private ClusterUID clusterUID; -// private ClusterImpl cluster; -// ClusterChange2(ClusterUID clusterUID, ClusterImpl cluster) { -// this.clusterUID = clusterUID; -// this.cluster = cluster; -// init(); -// } -// void init() { -//// System.err.println("clusterChange2 dirty " + cluster.clusterId); -// dirty = false; -// bytes = new byte[INCREMENT]; -// byteIndex = 0; -// addInt(0); // Size of byte vector. Set by flush. -// addInt(VERSION); -// byteIndex = clusterUID.toByte(bytes, 8); -// } -// boolean isDirty() { -// return dirty; -// } -// void flush(GraphSession graphSession) { -//// System.err.println("flush2 clusterChange2 " + dirty + this); -// if (!dirty) -// return; -// Bytes.writeLE(bytes, 0, byteIndex - 4); -// byte[] ops = Arrays.copyOf(bytes, byteIndex); -//// System.err.println("flush2 clusterChange2 " + cluster.clusterId + " " + ops.length + " bytes."); -// graphSession.updateCluster(new UpdateClusterFunction(ops)); -// init(); -// } -// void setImmutable(boolean immutable) { -// dirty = true; -// addByte(SET_IMMUTABLE_OPERATION); -// addByte((byte)(immutable ? -1 : 0)); -// } -// void undoValueEx(int resourceIndex) { -// dirty = true; -// addByte(UNDO_VALUE_OPERATION); -// addInt(resourceIndex); -// } -// private final void checkSpace(int len) { -// if (bytes.length - byteIndex > len) -// return; -// bytes = Arrays.copyOf(bytes, bytes.length + len + INCREMENT); -// } -// private final void addByte(byte value) { -// checkSpace(1); -// bytes[byteIndex++] = value; -// } -// private final void addInt(int value) { -// checkSpace(4); -// Bytes.writeLE(bytes, byteIndex, value); -// byteIndex += 4; -// } -//// private void addLong(long value) { -//// checkSpace(8); -//// Bytes.writeLE(bytes, byteIndex, value); -//// byteIndex += 8; -//// } -} diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor.java index d4381aeca..2885338c7 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor.java @@ -76,11 +76,16 @@ public class ClusterUpdateProcessor extends ClusterUpdateProcessorBase { } + @Override + void setImmutable(boolean value) { + cluster.setImmutable(value, support); + } + public ClusterImpl process(ClusterImpl cluster) throws IllegalAcornStateException { this.cluster = cluster; process(); info.finish(); return this.cluster; } - + } diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor2.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor2.java deleted file mode 100644 index 61a8a8a9d..000000000 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessor2.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.simantics.acorn.internal; - -import org.simantics.acorn.cluster.ClusterImpl; -import org.simantics.acorn.exception.IllegalAcornStateException; -import org.simantics.acorn.lru.ClusterUpdateOperation; -import org.simantics.db.impl.ClusterSupport; - -public class ClusterUpdateProcessor2 extends ClusterUpdateProcessorBase2 { - - final ClusterSupport support; - final ClusterUpdateOperation info; - private ClusterImpl cluster; - - public ClusterUpdateProcessor2(ClusterSupport support, byte[] operations, ClusterUpdateOperation info) { - super(operations); - this.support = support; - this.info = info; - } - - public void process(ClusterImpl cluster) throws IllegalAcornStateException { - this.cluster = cluster; - process(); - info.finish(); - } - - @Override - void setImmutable(boolean value) { - cluster.setImmutable(value, support); - } - -} diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase.java index cd8130d9c..507db1721 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase.java @@ -12,9 +12,15 @@ import org.simantics.acorn.internal.ClusterStream.StmEnum; import org.simantics.db.exception.DatabaseException; import org.simantics.db.service.Bytes; import org.simantics.db.service.ClusterUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import fi.vtt.simantics.procore.internal.ClusterChange2; abstract public class ClusterUpdateProcessorBase { - + + private static final Logger LOGGER = LoggerFactory.getLogger(ClusterUpdateProcessorBase.class); + public final static boolean DEBUG = false; final protected ClusterManager manager; @@ -24,9 +30,9 @@ abstract public class ClusterUpdateProcessorBase { final private ClusterUID uid; final private int clusterKey; final public int version; - - final Map clusterKeyCache = new HashMap(); - + + final Map clusterKeyCache = new HashMap<>(); + public int getResourceKey(ClusterUID uid, int index) throws IllegalAcornStateException { Integer match = clusterKeyCache.get(uid); if(match != null) return match+index; @@ -40,7 +46,7 @@ abstract public class ClusterUpdateProcessorBase { this.manager = client; this.bytes = operations; this.len = Bytes.readLE4(bytes, 0)+4; // whatta? - version = Bytes.readLE4(bytes, 4); + this.version = Bytes.readLE4(bytes, 4); long cuid1 = Bytes.readLE8(bytes, 8); long cuid2 = Bytes.readLE8(bytes, 16); uid = ClusterUID.make(cuid1, cuid2); @@ -66,24 +72,21 @@ abstract public class ClusterUpdateProcessorBase { try { create(); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("resource create failed", e); } - } - + private void processDelete() { - int ri = Bytes.readLE2(bytes, pos); pos += 2; - + if(DEBUG) System.err.println("DEBUG: Delete " + ri); - + try { delete(ri); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("resource {} value delete failed", ri, e); } - } private void processModify(int op) { @@ -110,7 +113,8 @@ abstract public class ClusterUpdateProcessorBase { try { modify(clusterKey + ri, offset, size, bytes, pos); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("resource value modify(clusterKey: {}, ri: {}, offset: {}, size: {}, pos: {}) failed", + clusterKey, ri, offset, size, pos, e); } pos += size; @@ -134,7 +138,8 @@ abstract public class ClusterUpdateProcessorBase { try { set(clusterKey+r, valueBuffer, length); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("resource value set(clusterKey: {}, r: {}, length: {}) failed", + clusterKey, r, length, e); } } @@ -160,7 +165,8 @@ abstract public class ClusterUpdateProcessorBase { try { set(clusterKey+r, valueBuffer, length); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("resource value setShort(clusterKey: {}, r: {}, length: {}) failed", + clusterKey, r, length, e); } } @@ -288,7 +294,8 @@ abstract public class ClusterUpdateProcessorBase { try { claim(clusterKey+ri, predicateKey, objectKey, puid, ouid); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("statement add(clusterKey: {}, ri: {}, predicateKey: {}, objectKey: {}, puid: {}, ouid: {}) failed", + clusterKey, ri, predicateKey, objectKey, puid.toString(), ouid.toString(), e); } } else { @@ -301,7 +308,8 @@ abstract public class ClusterUpdateProcessorBase { try { deny(clusterKey+ri, predicateKey, objectKey, puid, ouid); } catch (DatabaseException e) { - e.printStackTrace(); + LOGGER.error("statement deny(clusterKey: {}, ri: {}, predicateKey: {}, objectKey: {}, puid: {}, ouid: {}) failed", + clusterKey, ri, predicateKey, objectKey, puid.toString(), ouid.toString(), e); } } @@ -309,6 +317,14 @@ abstract public class ClusterUpdateProcessorBase { } public void process() throws IllegalAcornStateException { + if (version == ClusterChange.VERSION) { + process1(); + } else if (version == ClusterChange2.VERSION) { + process2(); + } + } + + private void process1() throws IllegalAcornStateException { foreignPos = 0; @@ -463,14 +479,50 @@ abstract public class ClusterUpdateProcessorBase { } } - - + + private void process2() throws IllegalAcornStateException { + + while(pos < len) { + + int op = bytes[pos++]&0xff; + + switch(op) { + + case ClusterChange2.SET_IMMUTABLE_OPERATION: + processSetImmutable(op); + break; + case ClusterChange2.UNDO_VALUE_OPERATION: + processUndoValue(op); + break; + case ClusterChange2.SET_DELETED_OPERATION: + // TODO: implement? + break; + default: + throw new IllegalAcornStateException("Can not process operation " + op + " for cluster " + uid); + + } + } + + } + + private void processSetImmutable(int op) { + int value = bytes[pos++]&0xff; + setImmutable(value > 0); + } + + private void processUndoValue(int op) { + Bytes.readLE4(bytes, pos); + pos+=4; + } + abstract void create() throws DatabaseException; abstract void delete(int resourceIndex) throws DatabaseException; abstract void modify(int resourceKey, long offset, int size, byte[] bytes, int pos) throws DatabaseException; abstract void set(int resourceKey, byte[] bytes, int length) throws DatabaseException; - + abstract void claim(int resourceKey, int predicateKey, int objectKey, ClusterUID puid, ClusterUID ouid) throws DatabaseException; abstract void deny(int resourceKey, int predicateKey, int objectKey, ClusterUID puid, ClusterUID ouid) throws DatabaseException; - + + abstract void setImmutable(boolean value); + } diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase2.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase2.java deleted file mode 100644 index 502729c0b..000000000 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/ClusterUpdateProcessorBase2.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.simantics.acorn.internal; - -import org.simantics.acorn.exception.IllegalAcornStateException; -import org.simantics.db.service.Bytes; -import org.simantics.db.service.ClusterUID; - -public abstract class ClusterUpdateProcessorBase2 { - - final private byte[] bytes; - private int pos = 0; - final private int len; - final private ClusterUID uid; - - public ClusterUpdateProcessorBase2(byte[] operations) { - this.bytes = operations; - this.len = Bytes.readLE4(bytes, 0) + 4; // whatta? - int version = Bytes.readLE4(bytes, 4); - assert(version == ClusterChange2.VERSION); - long cuid1 = Bytes.readLE8(bytes, 8); - long cuid2 = Bytes.readLE8(bytes, 16); - pos = 24; - uid = ClusterUID.make(cuid1, cuid2); - } - - public ClusterUID getClusterUID() { - return uid; - } - - private void processSetImmutable(int op) { - int value = bytes[pos++]&0xff; - setImmutable(value > 0); - } - - private void processUndoValue(int op) { - Bytes.readLE4(bytes, pos); - pos+=4; - } - - public void process() throws IllegalAcornStateException { - - while(pos < len) { - - int op = bytes[pos++]&0xff; - - switch(op) { - - case ClusterChange2.SET_IMMUTABLE_OPERATION: - processSetImmutable(op); - break; - case ClusterChange2.UNDO_VALUE_OPERATION: - processUndoValue(op); - break; - default: - throw new IllegalAcornStateException("Can not process cluster " + uid); - - } - } - } - - abstract void setImmutable(boolean value); - -} diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/UndoClusterUpdateProcessor.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/UndoClusterUpdateProcessor.java index 8b3e4f066..e75e2e0ce 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/UndoClusterUpdateProcessor.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/UndoClusterUpdateProcessor.java @@ -13,17 +13,21 @@ import org.simantics.acorn.lru.ClusterChangeSet.Entry; import org.simantics.acorn.lru.ClusterChangeSet.Type; import org.simantics.db.exception.DatabaseException; import org.simantics.db.service.ClusterUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class UndoClusterUpdateProcessor extends ClusterUpdateProcessorBase { - + + private static final Logger LOGGER = LoggerFactory.getLogger(UndoClusterUpdateProcessor.class); + public final static boolean DEBUG = false; final private ClusterChangeSet ccs; - + private int oldValuesIndex = 0; private int statementMaskIndex = 0; - - final public List entries = new ArrayList(); + + final public List entries = new ArrayList<>(); public UndoClusterUpdateProcessor(ClusterManager client, ClusterStreamChunk chunk, ClusterChangeSet ccs) throws DatabaseException { super(client, readOperation(client, chunk, ccs)); @@ -31,27 +35,8 @@ public class UndoClusterUpdateProcessor extends ClusterUpdateProcessorBase { } private static byte[] readOperation(ClusterManager manager, ClusterStreamChunk chunk, ClusterChangeSet ccs) throws AcornAccessVerificationException, IllegalAcornStateException { - -// ClusterStreamChunk chunk; -// manager.streamLRU.acquireMutex(); -// try { -// chunk = ccs.getChunk(manager); -// } catch (Throwable t) { -// throw new IllegalStateException(t); -// } finally { -// manager.streamLRU.releaseMutex(); -// } -// -// chunk.acquireMutex(); -// try { -// chunk.ve - chunk.makeResident(); - return chunk.getOperation(ccs.chunkOffset); -// } catch (Throwable t) { -// throw new IllegalStateException(t); -// } finally { -// chunk.releaseMutex(); -// } + chunk.makeResident(); + return chunk.getOperation(ccs.chunkOffset); } @Override @@ -110,5 +95,10 @@ public class UndoClusterUpdateProcessor extends ClusterUpdateProcessorBase { } } - + + @Override + void setImmutable(boolean value) { + LOGGER.error("Attempted to undo `setImmutable({})` cluster operation for cluster {} which is not supported.", value, ccs.cuid); + } + } diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterStreamChunk.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterStreamChunk.java index 12d4d55b8..767746eb0 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterStreamChunk.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterStreamChunk.java @@ -9,7 +9,6 @@ import org.simantics.acorn.ClusterManager; import org.simantics.acorn.Persistable; import org.simantics.acorn.exception.AcornAccessVerificationException; import org.simantics.acorn.exception.IllegalAcornStateException; -import org.simantics.acorn.internal.ClusterChange; import org.simantics.acorn.internal.UndoClusterUpdateProcessor; import org.simantics.compressions.CompressionCodec; import org.simantics.compressions.Compressions; @@ -60,8 +59,6 @@ public class ClusterStreamChunk extends LRUObject im if(op.ccs == null) throw new IllegalAcornStateException("Cluster ChangeSet " + ccsId + " was not found."); UndoClusterUpdateProcessor proc = new UndoClusterUpdateProcessor(clusters, this, op.ccs); - if(proc.version != ClusterChange.VERSION) - return null; // This cluster and CCS can still be under preparation => wait clusters.clusterLRU.ensureUpdates(proc.getClusterUID()); diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterUpdateOperation.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterUpdateOperation.java index c23821b79..254fbf55c 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterUpdateOperation.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterUpdateOperation.java @@ -4,10 +4,7 @@ import org.simantics.acorn.ClusterManager; import org.simantics.acorn.cluster.ClusterImpl; import org.simantics.acorn.exception.AcornAccessVerificationException; import org.simantics.acorn.exception.IllegalAcornStateException; -import org.simantics.acorn.internal.ClusterChange; -import org.simantics.acorn.internal.ClusterChange2; import org.simantics.acorn.internal.ClusterUpdateProcessor; -import org.simantics.acorn.internal.ClusterUpdateProcessor2; import org.simantics.db.service.Bytes; import org.simantics.db.service.ClusterUID; @@ -59,22 +56,11 @@ final public class ClusterUpdateOperation { } public void runWithData(byte[] data) throws IllegalAcornStateException, AcornAccessVerificationException { - try { - int version = Bytes.readLE4(data, 4); - if(version == ClusterChange.VERSION) { - ClusterUpdateProcessor processor = new ClusterUpdateProcessor(manager, manager.support, data, this); - ClusterImpl cluster = info.getForUpdate(); - cluster = processor.process(cluster); - manager.update(uid, cluster); - } else if (version == ClusterChange2.VERSION) { - ClusterUpdateProcessor2 processor = new ClusterUpdateProcessor2(manager.support, data, this); - ClusterImpl cluster = info.getForUpdate(); - processor.process(cluster); - manager.update(uid, cluster); - } else { - throw new IllegalAcornStateException("unsupported clusterChange version " + version); - } + ClusterUpdateProcessor processor = new ClusterUpdateProcessor(manager, manager.support, data, this); + ClusterImpl cluster = info.getForUpdate(); + cluster = processor.process(cluster); + manager.update(uid, cluster); } catch (IllegalAcornStateException | AcornAccessVerificationException e) { throw e; } catch (Throwable t) { diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardEngine.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardEngine.java deleted file mode 100644 index 31e73877d..000000000 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardEngine.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.simantics.db.layer0; - -import java.util.Map; - -import org.simantics.simulator.variable.exceptions.NodeManagerException; - -public interface StandardEngine { - - Object getValue(Node node) throws NodeManagerException; - void setValue(Node node, Object value) throws NodeManagerException; - String getName(Node node); - Map getChildren(Node node); - Map getProperties(Node node); - -} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNode.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNode.java deleted file mode 100644 index c29dc8f65..000000000 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNode.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.simantics.db.layer0; - -public interface StandardNode { - -} diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChange2.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChange2.java index 57bbd4404..cebcdcf42 100644 --- a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChange2.java +++ b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChange2.java @@ -6,7 +6,7 @@ import org.simantics.db.procore.cluster.ClusterImpl; import org.simantics.db.service.Bytes; import org.simantics.db.service.ClusterUID; -class ClusterChange2 { +public class ClusterChange2 { public static final int VERSION = 2; public static final byte SET_IMMUTABLE_OPERATION = 1; // public static final byte UNDO_VALUE_OPERATION = 2; // diff --git a/bundles/org.simantics.logging.ui/.classpath b/bundles/org.simantics.logging.ui/.classpath new file mode 100644 index 000000000..eca7bdba8 --- /dev/null +++ b/bundles/org.simantics.logging.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.logging.ui/.project b/bundles/org.simantics.logging.ui/.project new file mode 100644 index 000000000..e5853c591 --- /dev/null +++ b/bundles/org.simantics.logging.ui/.project @@ -0,0 +1,28 @@ + + + org.simantics.logging.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.simantics.logging.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.simantics.logging.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..0c68a61dc --- /dev/null +++ b/bundles/org.simantics.logging.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bundles/org.simantics.logging.ui/META-INF/MANIFEST.MF b/bundles/org.simantics.logging.ui/META-INF/MANIFEST.MF new file mode 100644 index 000000000..3f910c8e4 --- /dev/null +++ b/bundles/org.simantics.logging.ui/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Ui +Bundle-SymbolicName: org.simantics.logging.ui;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.simantics.logging.ui.Activator +Require-Bundle: javax.inject, + org.eclipse.osgi, + org.eclipse.jface, + org.eclipse.e4.ui.services, + org.eclipse.e4.core.di.annotations, + org.eclipse.core.runtime, + org.eclipse.ui.ide, + org.slf4j.api, + org.simantics.logging, + org.simantics.utils, + org.simantics.utils.ui +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Import-Package: javax.annotation;version="1.2.0" +Bundle-ActivationPolicy: lazy diff --git a/bundles/org.simantics.logging.ui/build.properties b/bundles/org.simantics.logging.ui/build.properties new file mode 100644 index 000000000..7af290f32 --- /dev/null +++ b/bundles/org.simantics.logging.ui/build.properties @@ -0,0 +1,7 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + icons/,\ + fragment.e4xmi diff --git a/bundles/org.simantics.logging.ui/fragment.e4xmi b/bundles/org.simantics.logging.ui/fragment.e4xmi new file mode 100644 index 000000000..cc14bb5f8 --- /dev/null +++ b/bundles/org.simantics.logging.ui/fragment.e4xmi @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.simantics.logging.ui/icons/bug.png b/bundles/org.simantics.logging.ui/icons/bug.png new file mode 100644 index 000000000..2d5fb90ec Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/bug.png differ diff --git a/bundles/org.simantics.logging.ui/icons/error.png b/bundles/org.simantics.logging.ui/icons/error.png new file mode 100644 index 000000000..c37bd062e Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/error.png differ diff --git a/bundles/org.simantics.logging.ui/icons/information.png b/bundles/org.simantics.logging.ui/icons/information.png new file mode 100644 index 000000000..12cd1aef9 Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/information.png differ diff --git a/bundles/org.simantics.logging.ui/icons/page.png b/bundles/org.simantics.logging.ui/icons/page.png new file mode 100644 index 000000000..03ddd799f Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/page.png differ diff --git a/bundles/org.simantics.logging.ui/icons/page_white_compressed.png b/bundles/org.simantics.logging.ui/icons/page_white_compressed.png new file mode 100644 index 000000000..2b6b1007f Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/page_white_compressed.png differ diff --git a/bundles/org.simantics.logging.ui/icons/page_white_edit.png b/bundles/org.simantics.logging.ui/icons/page_white_edit.png new file mode 100644 index 000000000..b93e77600 Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/page_white_edit.png differ diff --git a/bundles/org.simantics.logging.ui/icons/text_align_left.png b/bundles/org.simantics.logging.ui/icons/text_align_left.png new file mode 100644 index 000000000..6c8fcc116 Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/text_align_left.png differ diff --git a/bundles/org.simantics.logging.ui/icons/warning.png b/bundles/org.simantics.logging.ui/icons/warning.png new file mode 100644 index 000000000..628cf2dae Binary files /dev/null and b/bundles/org.simantics.logging.ui/icons/warning.png differ diff --git a/bundles/org.simantics.logging.ui/plugin.xml b/bundles/org.simantics.logging.ui/plugin.xml new file mode 100644 index 000000000..f57c8897e --- /dev/null +++ b/bundles/org.simantics.logging.ui/plugin.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/Activator.java b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/Activator.java new file mode 100644 index 000000000..942a88ba2 --- /dev/null +++ b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/Activator.java @@ -0,0 +1,30 @@ +package org.simantics.logging.ui; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Activator implements BundleActivator { + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} diff --git a/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java new file mode 100644 index 000000000..7d7983f59 --- /dev/null +++ b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SaveLogFilesHandler.java @@ -0,0 +1,93 @@ +package org.simantics.logging.ui.handlers; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.inject.Named; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Shell; +import org.simantics.logging.LogCollector; +import org.simantics.utils.FileUtils; +import org.simantics.utils.ui.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SaveLogFilesHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(SaveLogFilesHandler.class); + + private static final String[] FILTER_NAMES = { "ZIP-archive", "AllFiles (*:*)" }; + private static final String[] FILTER_EXTENSIONS = { "*.zip", "*.*" }; + private static final String USER_HOME = System.getProperty("user.home"); + + @Execute + public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) { + + FileDialog dialog = new FileDialog(shell, SWT.SAVE); + dialog.setFilterNames(FILTER_NAMES); + dialog.setFilterExtensions(FILTER_EXTENSIONS); + if (USER_HOME != null) { + if (Files.exists(Paths.get(USER_HOME))) { + dialog.setFilterPath(USER_HOME); + } + } + StringBuilder fileName = new StringBuilder(); + String productName = Platform.getProduct().getName(); + if (productName != null) + fileName.append(productName.replaceAll(" ", "_")).append("-"); + + fileName.append("logs-").append(currentLocalDateTimeStamp()); + String actualFileName = fileName.toString(); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Resolved log files name {}", actualFileName); + dialog.setFileName(actualFileName); + + String destination = dialog.open(); + if (destination != null) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Destination for saving log files is {}", destination); + + try { + Path tempDir = Files.createTempDirectory(actualFileName); + Map> allLogs = LogCollector.allLogs(); + for (Entry> logEntry : allLogs.entrySet()) { + Path subFolder = tempDir.resolve(logEntry.getKey()); + Files.createDirectory(subFolder); + for (Path p : logEntry.getValue()) { + try { + Files.copy(p, subFolder.resolve(p.getFileName())); + } catch (IOException e) { + LOGGER.error("Could not copy {}", p.toAbsolutePath(), e); + } + } + } + FileUtils.compressZip(tempDir.toAbsolutePath().toString(), destination); + FileUtils.delete(tempDir); + } catch (Throwable t) { + LOGGER.error("Could not save log files to ZIP", t); + ExceptionUtils.logAndShowError("Could not save log files to ZIP", t); + } + } else { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("No destination selected for saving logs"); + } + } + } + + private static String currentLocalDateTimeStamp() { + return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmm")); + } + +} diff --git a/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SelectLoggingLevelHandler.java b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SelectLoggingLevelHandler.java new file mode 100644 index 000000000..27473f182 --- /dev/null +++ b/bundles/org.simantics.logging.ui/src/org/simantics/logging/ui/handlers/SelectLoggingLevelHandler.java @@ -0,0 +1,21 @@ +package org.simantics.logging.ui.handlers; + +import javax.inject.Named; + +import org.eclipse.e4.core.di.annotations.Execute; +import org.simantics.logging.LogConfigurator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SelectLoggingLevelHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(SelectLoggingLevelHandler.class); + + @Execute + public void execute(@Named("org.simantics.logging.ui.commandparameter.selectLoggingLevel") String level) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Setting logging level to {}", level); + LogConfigurator.setLoggingLevel(level); + } + +} diff --git a/bundles/org.simantics.logging/.classpath b/bundles/org.simantics.logging/.classpath new file mode 100644 index 000000000..eca7bdba8 --- /dev/null +++ b/bundles/org.simantics.logging/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.logging/.project b/bundles/org.simantics.logging/.project new file mode 100644 index 000000000..9f60062cf --- /dev/null +++ b/bundles/org.simantics.logging/.project @@ -0,0 +1,33 @@ + + + org.simantics.logging + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.simantics.logging/.settings/org.eclipse.jdt.core.prefs b/bundles/org.simantics.logging/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..0c68a61dc --- /dev/null +++ b/bundles/org.simantics.logging/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bundles/org.simantics.logging/META-INF/MANIFEST.MF b/bundles/org.simantics.logging/META-INF/MANIFEST.MF new file mode 100644 index 000000000..115019a65 --- /dev/null +++ b/bundles/org.simantics.logging/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Simantics Logging Core +Bundle-SymbolicName: org.simantics.logging +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.simantics.logging.internal.Activator +Bundle-Vendor: Semantum Oy +Require-Bundle: org.eclipse.core.runtime, + org.slf4j.api, + ch.qos.logback.classic, + ch.qos.logback.core +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Service-Component: logbackLogProvider.xml, + dbAndMetadataLogProvider.xml +Export-Package: org.simantics.logging diff --git a/bundles/org.simantics.logging/build.properties b/bundles/org.simantics.logging/build.properties new file mode 100644 index 000000000..c5cc5f8a3 --- /dev/null +++ b/bundles/org.simantics.logging/build.properties @@ -0,0 +1,7 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + scl/,\ + logbackLogProvider.xml,\ + dbAndMetadataLogProvider.xml +source.. = src/ diff --git a/bundles/org.simantics.logging/dbAndMetadataLogProvider.xml b/bundles/org.simantics.logging/dbAndMetadataLogProvider.xml new file mode 100644 index 000000000..aa4678fe7 --- /dev/null +++ b/bundles/org.simantics.logging/dbAndMetadataLogProvider.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.logging/logbackLogProvider.xml b/bundles/org.simantics.logging/logbackLogProvider.xml new file mode 100644 index 000000000..9e9e6db1a --- /dev/null +++ b/bundles/org.simantics.logging/logbackLogProvider.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.logging/scl/LoggingUtils.scl b/bundles/org.simantics.logging/scl/LoggingUtils.scl new file mode 100644 index 000000000..500ba1b83 --- /dev/null +++ b/bundles/org.simantics.logging/scl/LoggingUtils.scl @@ -0,0 +1,9 @@ +import "Files" +import "Map" as Map + +importJava "org.simantics.logging.LogConfigurator" where + setLoggingLevel :: String -> () + setLoggingLevelForLogger :: String -> String -> () + +importJava "org.simantics.logging.LogCollector" where + allLogs :: Map.T String [Path] \ No newline at end of file diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/DBAndMetadataLogProvider.java b/bundles/org.simantics.logging/src/org/simantics/logging/DBAndMetadataLogProvider.java new file mode 100644 index 000000000..79e10dbef --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/DBAndMetadataLogProvider.java @@ -0,0 +1,60 @@ +package org.simantics.logging; + +import java.lang.reflect.Field; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.Platform; +import org.osgi.framework.Bundle; +import org.slf4j.LoggerFactory; + +public class DBAndMetadataLogProvider implements LogProvider { + + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DBAndMetadataLogProvider.class); + + @Override + public List get() { + List logs = new ArrayList<>(); + Path dbClientLog = getDBClientLogLocation(); + if (dbClientLog != null) + logs.add(dbClientLog); + Path metadataLogLocation = getMetadataLogLocation(); + if (metadataLogLocation != null) + logs.add(metadataLogLocation); + return logs; + } + + private static Path getDBClientLogLocation() { + Bundle bundle = Platform.getBundle("org.simantics.db.common"); + try { + Class forName = bundle.loadClass("org.simantics.db.common.internal.config.InternalClientConfig"); + Field field = forName.getField("DB_CLIENT_LOG_FILE"); + String value = (String) field.get(null); + return Paths.get(value); + } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + LOGGER.error("Could not read db-client.log location", e); + } + return null; + } + + private static Path getMetadataLogLocation() { + String prop = System.getProperty("osgi.instance.area", null); + if (prop != null) { + try { + URL url = new URL(prop); + if ("file".equals(url .getProtocol())) { + Path path = Paths.get(url.toURI()); + return path.resolve(".metadata").resolve(".log"); + } else { + LOGGER.warn("Unsupported protocol {}", url); + } + } catch (Throwable t) { + LOGGER.error("Could not get .metadata/.log", t); + } + } + return null; + } +} diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java b/bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java new file mode 100644 index 000000000..4d98e2767 --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java @@ -0,0 +1,65 @@ +package org.simantics.logging; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.simantics.logging.internal.Activator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class LogCollector { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogCollector.class); + + public static Map> allLogs() { + Map> results = new HashMap<>(); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Collecting all logs from declarative services"); + + Collection logProviders = getLogProviders(); + for (LogProvider logProvider : logProviders) { + List logs = logProvider.get(); + String key = logProvider.getClass().getSimpleName(); + Collection existing = results.get(key); + if (existing != null) { + LOGGER.info("Duplicate log providers with name {} exist, merging logs", key); + logs.addAll(existing); + } + results.put(key, logs); + } + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Found logs from {} providers", results.keySet()); + return results; + } + + private static List getLogProviders() { + ServiceReference[] serviceReferences = new ServiceReference[0]; + String key = LogProvider.class.getName(); + try { + serviceReferences = Activator.getContext().getAllServiceReferences(key, null); + } catch (InvalidSyntaxException e) { + LOGGER.error("Could not get service references for {}!", key, e); + } + if (serviceReferences.length == 0) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("No service references found for {}", key); + return Collections.emptyList(); + } + + List logProviders = new ArrayList<>(serviceReferences.length); + for (ServiceReference reference : serviceReferences) { + LogProvider logProvider = (LogProvider) Activator.getContext().getService(reference); + logProviders.add(logProvider); + } + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Found {} log providers", logProviders); + return logProviders; + } +} diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/LogConfigurator.java b/bundles/org.simantics.logging/src/org/simantics/logging/LogConfigurator.java new file mode 100644 index 000000000..047bac8b6 --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/LogConfigurator.java @@ -0,0 +1,54 @@ +package org.simantics.logging; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; + +/** + * Class for modifying the active logging configuration + * + * @author Jani Simomaa + * + */ +public final class LogConfigurator { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogConfigurator.class); + + private LogConfigurator() { + } + + /** + * Sets logging level to represent the given argument + * + * @param level ERROR WARN INFO DEBUG TRACE + */ + public static void setLoggingLevel(String level) { + if (LOGGER.isInfoEnabled()) + LOGGER.info("Setting logger level to {}", level); + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + Level ll = getLoggerLevel(level); + List loggerList = context.getLoggerList(); + loggerList.forEach(l -> l.setLevel(ll)); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Loggers installed {}", loggerList); + } + + public static void setLoggingLevelForLogger(String logger, String level) { + if (LOGGER.isInfoEnabled()) + LOGGER.info("Setting logger level to {} for loggers {}", level, logger); + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + Level ll = getLoggerLevel(level); + ch.qos.logback.classic.Logger loggerList = context.getLogger(logger); + loggerList.setLevel(ll); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Loggers installed {}", loggerList); + } + + private static Level getLoggerLevel(String level) { + return Level.valueOf(level); + } +} diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/LogProvider.java b/bundles/org.simantics.logging/src/org/simantics/logging/LogProvider.java new file mode 100644 index 000000000..7f7a8278c --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/LogProvider.java @@ -0,0 +1,9 @@ +package org.simantics.logging; + +import java.nio.file.Path; +import java.util.List; +import java.util.function.Supplier; + +public interface LogProvider extends Supplier> { + +} diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/LogbackLogProvider.java b/bundles/org.simantics.logging/src/org/simantics/logging/LogbackLogProvider.java new file mode 100644 index 000000000..3c88cd542 --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/LogbackLogProvider.java @@ -0,0 +1,83 @@ +package org.simantics.logging; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.FileAppender; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.spi.AppenderAttachable; + +public class LogbackLogProvider implements LogProvider { + + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LogbackLogProvider.class); + + @Override + public List get() { + List logs = new ArrayList<>(); + try { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME); + Iterator> appenderIter = logger.iteratorForAppenders(); + while (appenderIter.hasNext()) { + FileAppender appender = findFileAppender(appenderIter.next()); + if (appender != null) { + String logFile = ((FileAppender)appender).getFile(); + Path log = Paths.get(logFile).toAbsolutePath(); + if (appender instanceof RollingFileAppender) { + // Collect all logs + Path parent = log.getParent(); + List newLogs = Files.walk(parent).collect(Collectors.toList()); + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Found {} from {}", newLogs, appender); + logs.addAll(newLogs); + } else { + logs.add(log); + } + } else { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Appender is not {} but is {} instead", FileAppender.class.getName(), appender != null ? appender.getClass().getName() : "null"); + } + } + } + } catch (ClassCastException e) { + // Okay, we are not using logback here + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Seems like we are not using logback but {} instead", LoggerFactory.getILoggerFactory(), e); + } catch (Throwable t) { + LOGGER.error("Could not collect logs", t); + } + if (LOGGER.isDebugEnabled()) + LOGGER.debug("Found {} log files : {}", logs.size(), logs); + return logs; + } + + private static FileAppender findFileAppender(Appender appender) { + if (appender instanceof AppenderAttachable) { + // Ok, has child appender + Iterator> children = ((AppenderAttachable) appender).iteratorForAppenders(); + while (children.hasNext()) { + FileAppender app = findFileAppender(children.next()); + // TODO: returns only first FileAppender that it founds but not a collection + if (app != null) + return app; + } + return null; + } else if (appender instanceof FileAppender) { + return (FileAppender) appender; + } else { + return null; + } + } + +} diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/internal/Activator.java b/bundles/org.simantics.logging/src/org/simantics/logging/internal/Activator.java new file mode 100644 index 000000000..abedac6ea --- /dev/null +++ b/bundles/org.simantics.logging/src/org/simantics/logging/internal/Activator.java @@ -0,0 +1,30 @@ +package org.simantics.logging.internal; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Activator implements BundleActivator { + + private static BundleContext context; + + public static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/AbstractDatasource.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/AbstractDatasource.java index 4a15cba52..7b6e791da 100644 --- a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/AbstractDatasource.java +++ b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/AbstractDatasource.java @@ -20,7 +20,7 @@ import org.simantics.utils.datastructures.ListenerList; */ public abstract class AbstractDatasource implements Datasource { - protected ListenerList listeners = new ListenerList(DatasourceListener.class); + protected ListenerList listeners = new ListenerList<>(DatasourceListener.class); protected Lock readLock, writeLock; public AbstractDatasource() { @@ -40,20 +40,20 @@ public abstract class AbstractDatasource implements Datasource { listeners.remove(listener); } - protected void notifyStep() { - for (final DatasourceListener l : listeners.getListeners()) { + protected void notifyStep(Datasource source) { + for (DatasourceListener l : listeners.getListeners()) { if (l.getExecutor() == null) { - l.onStep( AbstractDatasource.this ); + l.onStep( source ); } else { - l.getExecutor().execute(new Runnable() { - public void run() { - l.onStep(AbstractDatasource.this); - } - }); + l.getExecutor().execute(() -> l.onStep(source)); } } } + protected void notifyStep() { + notifyStep(AbstractDatasource.this); + } + @Override public Lock readLock() { return readLock; diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/DatasourceAdapter.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/DatasourceAdapter.java index 1b6f9b6f8..1ee543f4c 100644 --- a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/DatasourceAdapter.java +++ b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/DatasourceAdapter.java @@ -169,7 +169,7 @@ public class DatasourceAdapter implements DatasourceListener { Object value = null; if (handle != null) { try { - value = handle.getValue(); + value = handle.getValue(source); } catch (AccessorException e) { if (failedIds.add(key)) logger.log(Level.SEVERE, e.toString(), e); diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/PseudoSolver.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/PseudoSolver.java index 9a5be411b..fd3e08a2b 100644 --- a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/PseudoSolver.java +++ b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/PseudoSolver.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Random; import org.simantics.databoard.Datatypes; +import org.simantics.databoard.accessor.error.AccessorException; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.NumberBinding; import org.simantics.databoard.binding.error.BindingException; @@ -160,6 +161,11 @@ public class PseudoSolver extends AbstractDatasource { public Object getValue() { return PseudoSolver.this.getValue(key, b); } + + @Override + public Object getValue(Datasource datasource) throws AccessorException { + return PseudoSolver.this.getValue(key, b); + } @Override public void dispose() { diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/VariableHandle.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/VariableHandle.java index d501dbecd..360ea96fc 100644 --- a/bundles/org.simantics.simulation/src/org/simantics/simulation/data/VariableHandle.java +++ b/bundles/org.simantics.simulation/src/org/simantics/simulation/data/VariableHandle.java @@ -36,6 +36,12 @@ public interface VariableHandle { */ Object getValue() throws AccessorException; + /** + * @return current value associated with this handle within the given Datasource + * @throws AccessorException if value cannot be retrieved + */ + Object getValue(Datasource datasource) throws AccessorException; + /** * Frees any resource related to this handle. */ diff --git a/bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/ExperimentState.java b/bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/ExperimentState.java index 66ec2d3cb..d724e8804 100644 --- a/bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/ExperimentState.java +++ b/bundles/org.simantics.simulation/src/org/simantics/simulation/experiment/ExperimentState.java @@ -12,5 +12,5 @@ package org.simantics.simulation.experiment; public enum ExperimentState { - INITIALIZING, RUNNING, STOPPED, DISPOSED + INITIALIZING, RUNNING, STOPPED, TO_BE_DISPOSED, DISPOSED } diff --git a/bundles/org.simantics.simulator.toolkit.db/.classpath b/bundles/org.simantics.simulator.toolkit.db/.classpath new file mode 100644 index 000000000..b862a296d --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.simulator.toolkit.db/.project b/bundles/org.simantics.simulator.toolkit.db/.project new file mode 100644 index 000000000..6684705c5 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/.project @@ -0,0 +1,28 @@ + + + org.simantics.simulator.toolkit.db + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.simantics.simulator.toolkit.db/META-INF/MANIFEST.MF b/bundles/org.simantics.simulator.toolkit.db/META-INF/MANIFEST.MF new file mode 100644 index 000000000..ea7f97e6d --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Simulator Toolkit for DB +Bundle-SymbolicName: org.simantics.simulator.toolkit.db +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.simantics.simulator.toolkit;bundle-version="1.0.0";visibility:=reexport, + org.simantics.db.layer0;bundle-version="1.1.0" +Export-Package: org.simantics.simulator.toolkit.db +Bundle-Vendor: Semantum Oy diff --git a/bundles/org.simantics.simulator.toolkit.db/build.properties b/bundles/org.simantics.simulator.toolkit.db/build.properties new file mode 100644 index 000000000..41eb6ade2 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/ExperimentStateExternalRead.java b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/ExperimentStateExternalRead.java new file mode 100644 index 000000000..ad2b2c4c8 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/ExperimentStateExternalRead.java @@ -0,0 +1,42 @@ +package org.simantics.simulator.toolkit.db; + +import org.simantics.db.ReadGraph; +import org.simantics.db.common.request.ParametrizedPrimitiveRead; +import org.simantics.db.exception.RuntimeDatabaseException; +import org.simantics.db.procedure.Listener; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +public class ExperimentStateExternalRead extends ParametrizedPrimitiveRead { + + private int value = 0; + private Listener listener = null; + + public ExperimentStateExternalRead(Object experiment) { + super(experiment); + } + + @Override + public void register(ReadGraph graph, Listener procedure) { + procedure.execute(value); + if (procedure.isDisposed()) + return; + if (listener != null) + throw new RuntimeDatabaseException("Internal error"); + listener = procedure; + } + + @Override + public void unregistered() { + listener = null; + } + + public void fire() { + value++; + if (listener != null) + listener.execute(value); + } + +} \ No newline at end of file diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardSessionManager.java b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java similarity index 85% rename from bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardSessionManager.java rename to bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java index cdd8e074c..62389597a 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardSessionManager.java +++ b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java @@ -1,4 +1,4 @@ -package org.simantics.db.layer0; +package org.simantics.simulator.toolkit.db; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; @@ -9,12 +9,14 @@ import org.simantics.db.common.request.ParametrizedPrimitiveRead; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.NodeSupport; import org.simantics.db.procedure.Listener; +import org.simantics.simulator.toolkit.StandardNodeManagerSupport; +import org.simantics.simulator.toolkit.StandardRealm; -abstract public class StandardSessionManager> { +public abstract class StandardSessionManager> { private ConcurrentHashMap>> realmListeners = new ConcurrentHashMap<>(); - private ConcurrentHashMap> REALMS = new ConcurrentHashMap>(); - private ConcurrentHashMap> SUPPORTS = new ConcurrentHashMap>(); + private ConcurrentHashMap> REALMS = new ConcurrentHashMap<>(); + private ConcurrentHashMap> SUPPORTS = new ConcurrentHashMap<>(); // Accessing Realms should be done over ParametrizedPrimitveRead for the // case if a realm is destroyed and new one is created with the same id than @@ -28,7 +30,6 @@ abstract public class StandardSessionManager> procedure) { - StandardRealm realm = REALMS.get(parameter); if (realm == null) { try { @@ -37,12 +38,12 @@ abstract public class StandardSessionManager> existing = getOrDisposeListener(parameter); assert(existing == null); realmListeners.put(parameter, procedure); @@ -56,10 +57,10 @@ abstract public class StandardSessionManager> getOrDisposeListener(String key) { Listener> listener = realmListeners.get(key); if(listener != null) { @@ -71,7 +72,7 @@ abstract public class StandardSessionManager realm) { if(realm != null) { REALMS.put(key, realm); @@ -88,25 +89,25 @@ abstract public class StandardSessionManager getOrCreateNodeSupport(ReadGraph graph, String id) throws DatabaseException { synchronized(SUPPORTS) { - NodeSupport result = SUPPORTS.get(id); - if(result == null) { - StandardRealm realm = getOrCreateRealm(graph, id); - result = new NodeSupport(realm.getNodeManager()); - SUPPORTS.put(id, result); - } - return result; + NodeSupport result = SUPPORTS.get(id); + if(result == null) { + StandardRealm realm = getOrCreateRealm(graph, id); + result = new NodeSupport(realm.getNodeManager()); + SUPPORTS.put(id, result); + } + return result; } } - + public StandardRealm getOrCreateRealm(ReadGraph graph, String id) throws DatabaseException { synchronized(REALMS) { return graph.syncRequest(new RealmRequest(id)); } } - + protected abstract Engine createEngine(ReadGraph graph, String id) throws DatabaseException; protected abstract StandardRealm createRealm(Engine engine, String id); - + public void removeRealm(WriteGraph graph, String id) throws DatabaseException { modifyRealms(id, null); // remove listeners from this realm @@ -116,7 +117,7 @@ abstract public class StandardSessionManager getRealms() { return REALMS.keySet(); } diff --git a/bundles/org.simantics.simulator.toolkit/.classpath b/bundles/org.simantics.simulator.toolkit/.classpath new file mode 100644 index 000000000..b862a296d --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.simulator.toolkit/.project b/bundles/org.simantics.simulator.toolkit/.project new file mode 100644 index 000000000..f04117506 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/.project @@ -0,0 +1,28 @@ + + + org.simantics.simulator.toolkit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.simantics.simulator.toolkit/META-INF/MANIFEST.MF b/bundles/org.simantics.simulator.toolkit/META-INF/MANIFEST.MF new file mode 100644 index 000000000..99f251c47 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Local Simulator Toolkit +Bundle-SymbolicName: org.simantics.simulator.toolkit +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.simantics.simulator.variable;bundle-version="1.0.0";visibility:=reexport, + org.simantics.simulator;bundle-version="1.0.0";visibility:=reexport, + gnu.trove3;bundle-version="3.0.3", + org.slf4j.api;bundle-version="1.7.25", + org.simantics.simulation.sequences;bundle-version="1.0.0", + org.eclipse.core.runtime, + org.simantics.databoard;bundle-version="0.6.6", + org.simantics.scl.osgi;bundle-version="1.0.4" +Export-Package: org.simantics.simulator.toolkit diff --git a/bundles/org.simantics.simulator.toolkit/build.properties b/bundles/org.simantics.simulator.toolkit/build.properties new file mode 100644 index 000000000..41eb6ade2 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentActionContext.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentActionContext.java new file mode 100644 index 000000000..cdf478f3a --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentActionContext.java @@ -0,0 +1,29 @@ +package org.simantics.simulator.toolkit; + +import org.simantics.databoard.binding.Binding; +import org.simantics.simulation.sequences.action.AbstractActionContext; +import org.simantics.simulator.IDynamicExperimentLocal; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DynamicExperimentActionContext extends AbstractActionContext { + + private static final Logger LOGGER = LoggerFactory.getLogger(DynamicExperimentActionContext.class); + + final private IDynamicExperimentLocal experiment; + + public DynamicExperimentActionContext(IDynamicExperimentLocal experiment) { + this.experiment = experiment; + } + + @Override + public Object get(String variableName, Binding binding) { + return experiment.getVariableValueById(variableName); + } + + @Override + public void set(String variableName, Object value, Binding binding) { + experiment.setVariableValueById(variableName, value, binding); + } + +} diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThread.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThread.java new file mode 100644 index 000000000..66cec38a4 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThread.java @@ -0,0 +1,298 @@ +package org.simantics.simulator.toolkit; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.concurrent.Callable; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Semaphore; + +import org.simantics.simulator.ExperimentState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +abstract public class DynamicExperimentThread extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(DynamicExperimentThread.class); + + private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + + private ExperimentState state = StandardExperimentStates.CREATED; + + private long runStart = 0; + + private double desiredRealtimeRatio = 1000.0; + private double obtainedRealtimeRatio = 1.0; + + private long runTimeNs = 0; + private long endTimeNs = 0; + protected long simulationStepNs = 0; + protected double stepInSeconds = 1.0; + + public DynamicExperimentThread() { + } + + private void updateTimes() { + long time = System.nanoTime(); + long elapsed = time-runStart; + + obtainedRealtimeRatio = longToDoubleDivision(runTimeNs, elapsed); + } + + private long rt; + private long rt_l; + + protected double longToDoubleDivision(long l1, long l2) { + rt = l1 / l2; + rt_l = l1 % l2; + double d = ((double)rt_l)/((double)l2); + d += (double)rt; + return d; + } + + protected ArrayList tasks = new ArrayList<>(); + + abstract public void step(double stepLengthNanoSeconds); + + public boolean inState(Class state) { + return state.isInstance(this.state); + } + + public void initialize() throws Exception { + } + + public void deinitialize() throws Exception { + } + + long stepTime = 0; + long taskTime = 0; + + @Override + public void run() { + + try { + + try { + + initialize(); + + try { + runReally(); + } catch (Exception e) { + LOGGER.error("Unhandled exception while running simulation thread", e); + } + + } catch (Exception e) { + LOGGER.error("Unhandled exception while initializing simulation thread", e); + } + + } finally { + + try { + deinitialize(); + } catch (Exception e) { + LOGGER.error("Error while deinitializing simulation thread", e); + } + + } + + } + + protected boolean inActiveState() { + return !( + inState(StandardExperimentStates.Disposed.class) + || inState(StandardExperimentStates.Disposing.class) + //|| inState(StandardExperimentStates.Failure.class) + || inState(StandardExperimentStates.ToBeDisposed.class) + ); + } + + private void runReally() { + + while(inActiveState()) { + + if(inState(StandardExperimentStates.Running.class)) { + + long asd = System.nanoTime(); + step(simulationStepNs); + stepTime += System.nanoTime() - asd; + runTimeNs += simulationStepNs; + updateTimes(); + long asd2 = System.nanoTime(); + runTasks(); + taskTime += System.nanoTime() - asd2; + + System.err.println(" st = " + 1e-9*stepTime + " tt = " + 1e-9*taskTime); + + while(obtainedRealtimeRatio > desiredRealtimeRatio) { + int ran = runTasks(); + if(ran == 0) { + long elapsed = System.nanoTime()-runStart; + long deltaNs = BigDecimal.valueOf(runTimeNs).divide(BigDecimal.valueOf(desiredRealtimeRatio)).longValue() - elapsed; + + long deltaMs = deltaNs / 1000000; + int deltaNsRem = (int)(deltaNs % 1000000); + + if(deltaNs > 0) { + synchronized(tasks) { + try { + tasks.wait(deltaMs, deltaNsRem); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + updateTimes(); + } + + } else { + + while(!inState(StandardExperimentStates.Running.class) && inActiveState()) { + + synchronized(tasks) { + int ran = runTasks(); + if(ran == 0) { + try { + tasks.wait(Integer.MAX_VALUE); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + } + + } + + if(runTimeNs >= endTimeNs && inActiveState()) + changeState(StandardExperimentStates.STOPPED); + + } + + } + + Thread executorThread = this; + + Semaphore beginSyncExec = new Semaphore(0); + Semaphore endSyncExec = new Semaphore(0); + + Runnable scheduleSyncExec = () -> { + beginSyncExec.release(); + try { + endSyncExec.acquire(); + } catch (InterruptedException e) { + } + }; + + public int runTasks() { + ArrayList todo = new ArrayList<>(); + synchronized(tasks) { + todo.addAll(tasks); + tasks.clear(); + } + todo.forEach(Runnable::run); + return todo.size(); + } + + public void queue(Runnable runnable) { + synchronized(tasks) { + tasks.add(runnable); + tasks.notify(); + } + } + + public T syncExec(Callable callable) throws InterruptedException { + + if(executorThread == Thread.currentThread()) { + try { + return callable.call(); + } catch (Throwable t) { + LOGGER.error("syncExec in current thread failed", t); + return null; + } finally { + } + } + + queue(scheduleSyncExec); + + beginSyncExec.acquire(); + Thread oldThread = executorThread; + executorThread = Thread.currentThread(); + try { + return callable.call(); + } catch (Throwable t) { + LOGGER.error("syncExec failed", t); + return null; + } finally { + executorThread = oldThread; + endSyncExec.release(); + } + + } + + public void asyncExec(Runnable runnable) { + + if(executorThread == Thread.currentThread()) { + try { + runnable.run(); + } catch (Throwable t) { + LOGGER.error("asyncExec failed", t); + } finally { + } + return; + } + + queue(runnable); + + } + + public void setSimulationStepNs(long ns) { + simulationStepNs = ns; + stepInSeconds = BigDecimal.valueOf(simulationStepNs).multiply(BigDecimal.valueOf(1e-9)).doubleValue(); + } + + public void runDuration(long ns) { + runStart = System.nanoTime(); + runTimeNs = 0; + endTimeNs = ns; + synchronized(tasks) { + changeState(StandardExperimentStates.RUNNING); + tasks.notify(); + } + } + + public ExperimentState getExperimentState() { + return state; + } + + public void changeState(ExperimentState state) { + this.state = state; + fireStateChanged(state); + } + + public void addListener(DynamicExperimentThreadListener listener) { + if(!listeners.contains(listener)) + listeners.add(listener); + } + + public void removeListener(DynamicExperimentThreadListener listener) { + listeners.remove(listener); + } + + protected void fireAfterStep() { + listeners.forEach(DynamicExperimentThreadListener::afterStep); + } + + protected void fireBeforeStep() { + listeners.forEach(DynamicExperimentThreadListener::beforeStep); + } + + protected void fireStateChanged(ExperimentState newState) { + listeners.forEach(l -> l.stateChanged(newState)); + } + +} \ No newline at end of file diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadListener.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadListener.java new file mode 100644 index 000000000..18080790f --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadListener.java @@ -0,0 +1,13 @@ +package org.simantics.simulator.toolkit; + +import org.simantics.simulator.ExperimentState; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +public interface DynamicExperimentThreadListener { + default void beforeStep() {} + default void afterStep() {} + default void stateChanged(ExperimentState newState) {} +} \ No newline at end of file diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java new file mode 100644 index 000000000..2143e5a33 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java @@ -0,0 +1,72 @@ +package org.simantics.simulator.toolkit; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.simantics.scl.runtime.SCLContext; +import org.simantics.scl.runtime.function.Function; +import org.simantics.simulator.IDynamicExperimentLocal; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +public class DynamicExperimentThreadSequenceRunner { + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static DynamicExperimentActionContext runAction(IDynamicExperimentLocal experiment, DynamicExperimentThread thread, Function action, final boolean simulateAndWaitCompletion) { + final DynamicExperimentActionContext context = new DynamicExperimentActionContext(experiment); + context.scheduleNextStep(action); + final Object sync = new Object(); + final SCLContext sclContext = SCLContext.getCurrent(); + + thread.addListener(new DynamicExperimentThreadListener() { + + @Override + public void beforeStep() { + if(!context.isStopped()) { + SCLContext.push(sclContext); + context.handleStep(experiment.getSimulationTime()); + SCLContext.pop(); + } + removeIfStopped(); + } + + public void removeIfStopped() { + if(context.isStopped()) { + thread.removeListener(this); + if(simulateAndWaitCompletion) { + experiment.simulate(false); + synchronized(sync) { + sync.notify(); + } + } + experiment.shutdown(new NullProgressMonitor()); + } + } + + }); + + if(simulateAndWaitCompletion) { + experiment.simulate(true); + + try { + synchronized(sync) { + while(!context.isStopped()) + sync.wait(1000L); + } + } catch(InterruptedException e) { + context.stop(); + } + + if (context.exceptions != null && !context.exceptions.isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append("Action failures:"); + for (Exception e : context.exceptions) { + builder.append("\n"); + builder.append(e.getMessage()); + } + + throw new RuntimeException(builder.toString()); + } + } + return context; + } +} diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardExperimentStates.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardExperimentStates.java new file mode 100644 index 000000000..c314643db --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardExperimentStates.java @@ -0,0 +1,124 @@ +package org.simantics.simulator.toolkit; + +import org.simantics.simulator.ExperimentState; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +public class StandardExperimentStates implements ExperimentState { + + /** + * The experiment context has been created. + * + *

+ * Allowed successor states: {@link Instantiated}, {@link ToBeDisposed} + */ + public interface Created extends ExperimentState {} + + /** + * The experiment context has been instantiated, i.e. underlying experimentation + * resources have been acquired. Some experiment setup (e.g. setting certain + * values) can be done in this state that cannot be touched once the experiment + * is initialized. + * + *

+ * Allowed successor states: {@link Initializing}, {@link ToBeDisposed} + */ + public interface Instantiated extends ExperimentState {} + + /** + * The experiment context is in the process of being initialized. This means + * that any initial conditions or related data is being loaded into the + * simulator/solver/what ever system that runs the experiment. + * + * If the initialization fails due to an irrecoverable system error, the + * experiment shall move to {@link Failure} state. If the initialization fails + * due to a recoverable error in user input, the experiment shall move to + * {@link Instantiated} state. + * + *

+ * Allowed successor states: {@link Initialized}, {@link Instantiated}, + * {@link Failure} + */ + public interface Initializing extends ExperimentState {} + + /** + * The experiment context has been initialized, i.e. the underlying + * experimentation resources have been both acquired and initialized with a + * specific state. + * + *

+ * Allowed successor states: {@link Stopped}, {@link Running}, + * {@link ToBeDisposed} + */ + public interface Initialized extends ExperimentState {} + + /** + * The experiment shall be ran until it reaches an objective such as + * steady-state or running for a duration or until the state changes to + * {@link Stopped}. + * + *

+ * Allowed successor states: {@link Stopped}, {@link ToBeDisposed} + */ + public interface Running extends ExperimentState {} + + /** + * The experiment shall remain stopped. Everything in the experiment context + * should remain constant while in this state. + * + *

+ * Allowed successor states: {@link Running}, {@link ToBeDisposed} + */ + public interface Stopped extends ExperimentState {} + + /** + * Moving into this state marks the beginning of the disposal of this + * experiment. The imminent disposal is irreversible and cannot be vetoed + * or interrupted. + * + *

+ * Allowed successor states: {@link Disposing} + */ + public interface ToBeDisposed extends ExperimentState {} + + /** + * The experiment context is being disposed, i.e. underlying experimentation + * resources are being freed and disposed of accordingly. + * + *

+ * Allowed successor states: {@link Disposing} + */ + public interface Disposing extends ExperimentState {} + + /** + * The experiment has been completely disposed and cannot any longer be used for + * anything. + * + *

+ * Allowed successor states: none, this is a final state + */ + public interface Disposed extends ExperimentState {} + + /** + * The experiment implementation has ran into a fatal failure. The experiment + * context can still be accessed at this point but the experiment can only move + * into {@link Disposed} state. + * + *

+ * Allowed successor states: {@link Disposed} + */ + public interface Failure extends ExperimentState {} + + public static final ExperimentState CREATED = new Created() {}; + public static final ExperimentState INSTANTIATED = new Instantiated() {}; + public static final ExperimentState INITIALIZING = new Initializing() {}; + public static final ExperimentState INITIALIZED = new Initialized() {}; + public static final ExperimentState RUNNING = new Running() {}; + public static final ExperimentState STOPPED = new Stopped() {}; + public static final ExperimentState TO_BE_DISPOSED = new ToBeDisposed() {}; + public static final ExperimentState DISPOSING = new Disposing() {}; + public static final ExperimentState DISPOSED = new Disposed() {}; + +} \ No newline at end of file diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNode.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNode.java new file mode 100644 index 000000000..6d6878a2f --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNode.java @@ -0,0 +1,14 @@ +package org.simantics.simulator.toolkit; + +/** + * Standard simulator variable node interface used with {@link StandardNodeManagerSupport} + * and {@link StandardNodeManager}. + * + * This used to exist in org.simantics.db.layer0 in earlier versions but was + * moved here to make it DB-independent. + * + * @author Antti Villberg + * @since 1.34.0 + */ +public interface StandardNode { +} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNodeManager.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java similarity index 52% rename from bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNodeManager.java rename to bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java index c48c3f9d1..87ae4f32f 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardNodeManager.java +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java @@ -10,7 +10,7 @@ * VTT Technical Research Centre of Finland - initial API and implementation * Semantum Oy - initial API and implementation *******************************************************************************/ -package org.simantics.db.layer0; +package org.simantics.simulator.toolkit; import java.util.ArrayList; import java.util.List; @@ -19,19 +19,22 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.simantics.databoard.Bindings; +import org.simantics.databoard.adapter.AdaptException; +import org.simantics.databoard.adapter.Adapter; +import org.simantics.databoard.adapter.AdapterConstructionException; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.VariantBinding; -import org.simantics.databoard.binding.error.BindingConstructionException; import org.simantics.databoard.binding.error.BindingException; import org.simantics.databoard.binding.error.RuntimeBindingConstructionException; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.type.Datatype; -import org.simantics.db.exception.DatabaseException; import org.simantics.simulator.variable.NodeManager; import org.simantics.simulator.variable.Realm; import org.simantics.simulator.variable.exceptions.NoSuchNodeException; import org.simantics.simulator.variable.exceptions.NodeManagerException; import org.simantics.simulator.variable.exceptions.NotInRealmException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import gnu.trove.map.hash.THashMap; import gnu.trove.procedure.TObjectProcedure; @@ -43,12 +46,14 @@ import gnu.trove.set.hash.THashSet; * * @author Antti Villberg */ -public abstract class StandardNodeManager> implements NodeManager { - - final private Node root; - final private StandardRealm realm; +public abstract class StandardNodeManager> implements NodeManager { - final static Binding NO_BINDING = new VariantBinding() { + private static final Logger LOGGER = LoggerFactory.getLogger(StandardNodeManager.class); + + private final Node root; + private final StandardRealm realm; + + static final Binding NO_BINDING = new VariantBinding() { @Override public Object getContent(Object variant, Binding contentBinding) throws BindingException { @@ -89,149 +94,135 @@ public abstract class StandardNodeManager validInstances) throws BindingException { throw new Error(); } - + @Override public int compare(Object o1, Object o2) throws org.simantics.databoard.binding.error.RuntimeBindingException { - if(o1 == null) { - if(o2 == null) { - return 0; - } else { - return - System.identityHashCode(o2); - } - } else { - if(o2 == null) { - return System.identityHashCode(o1); - } else { - if(o1.equals(o2)) return 0; - return System.identityHashCode(o1) - System.identityHashCode(o2); - } - } + if(o1 == null) { + if(o2 == null) { + return 0; + } else { + return - System.identityHashCode(o2); + } + } else { + if(o2 == null) { + return System.identityHashCode(o1); + } else { + if(o1.equals(o2)) return 0; + return System.identityHashCode(o1) - System.identityHashCode(o2); + } + } } }; - - THashMap valueCache = new THashMap(); - protected THashMap> listeners = new THashMap>(); - + + THashMap valueCache = new THashMap<>(); + protected THashMap> listeners = new THashMap<>(); + AtomicBoolean fireNodeListenersScheduled = new AtomicBoolean(false); Runnable fireNodeListeners = new Runnable() { @Override public void run() { fireNodeListenersScheduled.set(false); - final TObjectProcedure procedure = new TObjectProcedure() { - @Override - public boolean execute(Runnable object) { - object.run(); - return true; - } + TObjectProcedure procedure = r -> { + r.run(); + return true; }; synchronized(listeners) { - listeners.forEachValue(new TObjectProcedure>() { - @Override - public boolean execute(THashSet object) { - object.forEach(procedure); - return true; - } + listeners.forEachValue(set -> { + set.forEach(procedure); + return true; }); } } }; - - Runnable clearValueCache = new Runnable() { - @Override - public void run() { - valueCache.clear(); - } - }; - + + Runnable clearValueCache = () -> valueCache.clear(); + public StandardNodeManager(StandardRealm realm, Node root) { - this.realm = realm; - this.root = root; - } - - @Override - public List getChildNames(Node node) throws NodeManagerException { - List children = getChildren(node); - ArrayList names = new ArrayList(children.size()); - for(Node child : children) - names.add(getName(child)); - return names; - } - - @Override - public List getPropertyNames(Node node) throws NodeManagerException { - List properties = getProperties(node); - ArrayList names = new ArrayList(properties.size()); - for(Node property : properties) - names.add(getName(property)); - return names; - } - - @Override - public Object getValue(Node node, String propertyName, Binding binding) - throws NodeManagerException, BindingException { - Node property = getProperty(node, propertyName); - if(property == null) - throw new NoSuchNodeException("Didn't find a property " + propertyName); - return getValue(property, binding); - } - - @Override - public void setValue(Node node, String propertyName, Object value, - Binding binding) throws NodeManagerException, BindingException { - Node property = getProperty(node, propertyName); - if(property == null) - throw new NoSuchNodeException("Didn't find a property " + propertyName); - setValue(property, value, binding); - } - - @Override - public Variant getValue(Node node) throws NodeManagerException { - Object value = getEngineValueOrCached(node); - if (value instanceof Variant) - return (Variant) value; + assert(realm != null); + assert(root != null); + this.realm = realm; + this.root = root; + } + + @Override + public List getChildNames(Node node) throws NodeManagerException { + List children = getChildren(node); + ArrayList names = new ArrayList<>(children.size()); + for(Node child : children) + names.add(getName(child)); + return names; + } + + @Override + public List getPropertyNames(Node node) throws NodeManagerException { + List properties = getProperties(node); + ArrayList names = new ArrayList<>(properties.size()); + for(Node property : properties) + names.add(getName(property)); + return names; + } + + @Override + public Object getValue(Node node, String propertyName, Binding binding) + throws NodeManagerException, BindingException { + Node property = getProperty(node, propertyName); + if(property == null) + throw new NoSuchNodeException("Didn't find a property " + propertyName); + return getValue(property, binding); + } + + @Override + public void setValue(Node node, String propertyName, Object value, + Binding binding) throws NodeManagerException, BindingException { + Node property = getProperty(node, propertyName); + if(property == null) + throw new NoSuchNodeException("Didn't find a property " + propertyName); + setValue(property, value, binding); + } + + @Override + public Variant getValue(Node node, String propertyName) + throws NodeManagerException { + Node property = getProperty(node, propertyName); + if(property == null) + throw new NoSuchNodeException("Didn't find a property " + propertyName); + return getValue(property); + } + + @Override + public Object getValue(Node node, Binding binding) throws NodeManagerException, BindingException { try { - Binding binding = Bindings.getBinding(value.getClass()); - return new Variant(binding, value); - } catch (BindingConstructionException e) { - e.printStackTrace(); - return null; + return getValue(node).getValue(binding); + } catch (AdaptException e) { + throw new BindingException(e); } - } - - @Override - public Variant getValue(Node node, String propertyName) - throws NodeManagerException { - Node property = getProperty(node, propertyName); - if(property == null) - throw new NoSuchNodeException("Didn't find a property " + propertyName); - return getValue(property); - } - + } + @Override public String getPropertyURI(Node parent, Node property) { return null; } - + @Override public Realm getRealm() { - return realm; + return realm; } - + public StandardRealm getStandardRealm() { - return realm; + return realm; } - + protected String getRealmId() { - return realm.getId(); + return realm.getId(); } - + public Node getRoot() { - return root; + return root; } - + protected boolean isRoot(Node node) { - return root.equals(node); + return root.equals(node); } @Override @@ -239,7 +230,7 @@ public abstract class StandardNodeManager l = listeners.get(node); if(l == null) { - l = new THashSet(); + l = new THashSet<>(); listeners.put(node, l); } l.add(listener); @@ -258,18 +249,18 @@ public abstract class StandardNodeManager map = realm.getEngine().getChildren(node); - return map.get(name); + Map map = realm.getEngine().getChildren(node); + return map.get(name); } @Override public Node getProperty(Node node, String name) throws NodeManagerException { - checkThreadAccess(); - Map map = realm.getEngine().getProperties(node); - return map.get(name); + checkThreadAccess(); + Map map = realm.getEngine().getProperties(node); + return map.get(name); } @Override @@ -373,10 +379,10 @@ public abstract class StandardNodeManager + */ +public interface StandardNodeManagerSupport { + + Object getEngineValue(Node node) throws NodeManagerException; + Binding getEngineBinding(Node node) throws NodeManagerException; + void setEngineValue(Node node, Object value) throws NodeManagerException; + String getName(Node node); + Map getChildren(Node node); + Map getProperties(Node node); + +} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardRealm.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardRealm.java similarity index 87% rename from bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardRealm.java rename to bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardRealm.java index 68d002458..e228b603d 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/StandardRealm.java +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardRealm.java @@ -1,7 +1,6 @@ -package org.simantics.db.layer0; +package org.simantics.simulator.toolkit; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.Semaphore; import java.util.concurrent.ThreadFactory; @@ -9,24 +8,27 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import org.simantics.db.common.utils.Logger; import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.tuple.Tuple0; import org.simantics.simulator.variable.Realm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -abstract public class StandardRealm> implements Realm { +abstract public class StandardRealm> implements Realm { + + private static final Logger LOGGER = LoggerFactory.getLogger(StandardRealm.class); private String id; - private Thread executorThread; + protected Thread executorThread; private StandardRealmThreadFactory factory = new StandardRealmThreadFactory(this); private ThreadPoolExecutor executor = new ThreadPoolExecutor(0, 1, 60, TimeUnit.SECONDS, - new LinkedBlockingQueue(), factory); + new LinkedBlockingQueue<>(), factory); private Semaphore beginSyncExec = new Semaphore(0); private Semaphore endSyncExec = new Semaphore(0); - + private Engine engine; - private StandardNodeManager nodeManager; - + protected StandardNodeManager nodeManager; + private Runnable scheduleSyncExec = new Runnable() { @Override public void run() { @@ -37,7 +39,7 @@ abstract public class StandardRealm> i } } }; - + protected StandardRealm(Engine engine, String id) { this.engine = engine; this.id = id; @@ -45,15 +47,15 @@ abstract public class StandardRealm> i } abstract protected StandardNodeManager createManager(); - + protected String getSCLContextKey() { - return getClass().getSimpleName(); + return getClass().getSimpleName(); } public String getId() { return id; } - + public Engine getEngine() { return engine; } @@ -61,14 +63,13 @@ abstract public class StandardRealm> i public Thread getThread() { return executorThread; } - + @SuppressWarnings({ "rawtypes", "unchecked" }) public Object syncExec(Function fun) throws InterruptedException { - executor.execute(scheduleSyncExec); SCLContext context = SCLContext.getCurrent(); Engine oldConnection = (Engine)context.put(getSCLContextKey(), engine); - + try { beginSyncExec.acquire(); Thread oldThread = executorThread; @@ -83,7 +84,7 @@ abstract public class StandardRealm> i context.put(getSCLContextKey(), oldConnection); } } - + @SuppressWarnings("rawtypes") public void asyncExec(final Function fun) { executor.execute(new Runnable() { @@ -99,26 +100,25 @@ abstract public class StandardRealm> i @Override public void syncExec(Runnable runnable) throws InterruptedException { - if(executorThread == Thread.currentThread()) { try { runnable.run(); } catch (Throwable t) { - Logger.defaultLogError(t); + LOGGER.error("Error executing runnable in realm", t); } finally { } return; } - executor.execute(scheduleSyncExec); - + executor.execute(scheduleSyncExec); + beginSyncExec.acquire(); Thread oldThread = executorThread; executorThread = Thread.currentThread(); try { runnable.run(); } catch (Throwable t) { - Logger.defaultLogError(t); + LOGGER.error("Error executing runnable in realm", t); } finally { executorThread = oldThread; endSyncExec.release(); @@ -127,20 +127,19 @@ abstract public class StandardRealm> i @Override public void asyncExec(Runnable runnable) { - - if(executorThread == Thread.currentThread()) { + if(executorThread == Thread.currentThread()) { try { runnable.run(); } catch (Throwable t) { - Logger.defaultLogError(t); + LOGGER.error("Error executing runnable in realm", t); } finally { } return; } - + executor.execute(runnable); } - + public void close() { executor.shutdown(); try { @@ -153,7 +152,7 @@ abstract public class StandardRealm> i } catch (InterruptedException e) { getLogger().info("Could not shutdown executor " + executor + " for realm " + this, e); } - + factory.clear(); factory = null; // Should never be true @@ -161,7 +160,7 @@ abstract public class StandardRealm> i executorThread.interrupt(); executorThread = null; executor = null; - + // Clear nodeManager nodeManager.clear(); nodeManager = null; @@ -178,22 +177,23 @@ abstract public class StandardRealm> i } private static class StandardRealmThreadFactory implements ThreadFactory { - + private StandardRealm realm; public StandardRealmThreadFactory(StandardRealm realm) { this.realm = realm; } - + @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); realm.setExecutorThread(t); return t; } - + void clear() { realm = null; } } -} + +} \ No newline at end of file diff --git a/bundles/org.simantics.simulator/.classpath b/bundles/org.simantics.simulator/.classpath new file mode 100644 index 000000000..b862a296d --- /dev/null +++ b/bundles/org.simantics.simulator/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.simantics.simulator/.project b/bundles/org.simantics.simulator/.project new file mode 100644 index 000000000..2487735c0 --- /dev/null +++ b/bundles/org.simantics.simulator/.project @@ -0,0 +1,28 @@ + + + org.simantics.simulator + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.simantics.simulator/META-INF/MANIFEST.MF b/bundles/org.simantics.simulator/META-INF/MANIFEST.MF new file mode 100644 index 000000000..fb5601090 --- /dev/null +++ b/bundles/org.simantics.simulator/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Simulator +Bundle-SymbolicName: org.simantics.simulator +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.slf4j.api;bundle-version="1.7.25", + org.eclipse.core.runtime, + org.simantics.databoard;bundle-version="0.6.6" +Export-Package: org.simantics.simulator diff --git a/bundles/org.simantics.simulator/build.properties b/bundles/org.simantics.simulator/build.properties new file mode 100644 index 000000000..41eb6ade2 --- /dev/null +++ b/bundles/org.simantics.simulator/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/bundles/org.simantics.simulator/src/org/simantics/simulator/ExperimentState.java b/bundles/org.simantics.simulator/src/org/simantics/simulator/ExperimentState.java new file mode 100644 index 000000000..6f041538d --- /dev/null +++ b/bundles/org.simantics.simulator/src/org/simantics/simulator/ExperimentState.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2018 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: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.simulator; + +/** + * An abstract representation of the state of an experiment. + * + *

+ * A standard set of states can be found in + * org.simantics.simulator.toolkit.StandardExperimentStates. + * + * @author Antti Villberg + * @since 1.34.0 + */ +public interface ExperimentState { +} \ No newline at end of file diff --git a/bundles/org.simantics.simulator/src/org/simantics/simulator/IDynamicExperimentLocal.java b/bundles/org.simantics.simulator/src/org/simantics/simulator/IDynamicExperimentLocal.java new file mode 100644 index 000000000..2d3002db2 --- /dev/null +++ b/bundles/org.simantics.simulator/src/org/simantics/simulator/IDynamicExperimentLocal.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2018 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: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.simulator; + +import org.simantics.databoard.binding.Binding; + +public interface IDynamicExperimentLocal extends IExperimentLocal { + + /** + * Starts or stops simulation depending on the + * parameter. + */ + public void simulate(boolean enabled); + + /** + * Simulates the experiment at lest the given period of time. + * Giving 0 as parameter simulates the experiment one 'step'. + * After the duration, the simulation is stopped. + */ + public void simulateDuration(double duration); + + void setVariableValueById(String id, Object value, Binding binding); + Object getVariableValueById(String id); + + double getSimulationTime(); + +} diff --git a/bundles/org.simantics.simulator/src/org/simantics/simulator/IExperimentLocal.java b/bundles/org.simantics.simulator/src/org/simantics/simulator/IExperimentLocal.java new file mode 100644 index 000000000..addfbcf6b --- /dev/null +++ b/bundles/org.simantics.simulator/src/org/simantics/simulator/IExperimentLocal.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2018 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: + * Semantum Oy - initial API and implementation + *******************************************************************************/ +package org.simantics.simulator; + +import org.eclipse.core.runtime.IProgressMonitor; + +public interface IExperimentLocal { + + T getService(Class clazz); + + String getIdentifier(); + + /** + * @param monitor + * the progress monitor to use for reporting progress to the user + * during the operation. It is the caller's responsibility to + * call done() on the given monitor. Accepts null, indicating + * that no progress should be reported and that the operation + * cannot be cancelled. + */ + void shutdown(IProgressMonitor monitor); + + ExperimentState getStateL(); + void changeStateL(ExperimentState state); + +} diff --git a/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF b/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF index 8ecef199d..cb7afb74d 100644 --- a/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.spreadsheet.graph/META-INF/MANIFEST.MF @@ -29,7 +29,9 @@ Require-Bundle: org.simantics.layer0.utils, org.eclipse.e4.core.contexts, org.eclipse.e4.ui.di, org.simantics.browsing.ui.swt, - org.slf4j.api;bundle-version="1.7.20" + org.slf4j.api;bundle-version="1.7.20", + org.simantics.simulator.toolkit;bundle-version="1.0.0", + org.simantics.simulator.toolkit.db;bundle-version="1.0.0" Export-Package: org.apache.commons.math3.stat.regression, org.simantics.spreadsheet.graph, org.simantics.spreadsheet.graph.adapter, diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java index 5850eb847..607661163 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/GraphUI.java @@ -45,7 +45,6 @@ import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.request.WriteResultRequest; import org.simantics.db.common.session.SessionEventListenerAdapter; import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.StandardRealm; import org.simantics.db.layer0.request.PossibleURIVariable; import org.simantics.db.layer0.request.VariableName; import org.simantics.db.layer0.request.VariableRead; @@ -56,6 +55,7 @@ import org.simantics.db.procedure.SyncListener; import org.simantics.db.request.Write; import org.simantics.db.service.SessionEventSupport; import org.simantics.layer0.Layer0; +import org.simantics.simulator.toolkit.StandardRealm; import org.simantics.spreadsheet.Adaptable; import org.simantics.spreadsheet.CellEditor; import org.simantics.spreadsheet.ClientModel; diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetBook.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetBook.java index 277b10cb0..f87ce4d06 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetBook.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetBook.java @@ -10,9 +10,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.StandardEngine; +import org.simantics.simulator.toolkit.StandardNodeManagerSupport; +import org.simantics.simulator.variable.exceptions.NodeManagerException; import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment; import org.simantics.spreadsheet.graph.synchronization.LineNodeUpdater; import org.simantics.spreadsheet.graph.synchronization.LineUpdater; @@ -33,7 +36,7 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.LongArraySet; import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet; -public class SpreadsheetBook implements SpreadsheetElement, StandardEngine, Serializable, SheetNode, Solver, SolverNameUtil, ComponentFactory, ModuleUpdaterFactoryBase { +public class SpreadsheetBook implements StandardNodeManagerSupport, SpreadsheetElement, Serializable, SheetNode, Solver, SolverNameUtil, ComponentFactory, ModuleUpdaterFactoryBase { private static final long serialVersionUID = 7417208688311691396L; @@ -90,7 +93,17 @@ public class SpreadsheetBook implements SpreadsheetElement { - + public SpreadsheetNodeManager(SpreadsheetRealm realm) { super(realm, realm.getEngine()); } static final Set COMPONENT_CLASS = Collections.singleton(StructuralResource2.URIs.Component); - + @Override public Set getClassifications(SheetNode node) throws NodeManagerException { checkThreadAccess(); @@ -26,22 +26,22 @@ public class SpreadsheetNodeManager extends StandardNodeManager { private static final Logger LOGGER = LoggerFactory.getLogger(SpreadsheetRealm.class); - + SpreadsheetRealm(SpreadsheetBook book, String id) { super(book, id); } diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java index d90fe3106..19c994806 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetSessionManager.java @@ -15,11 +15,11 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.StandardRealm; -import org.simantics.db.layer0.StandardSessionManager; import org.simantics.db.layer0.variable.ProxyVariables; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.Variables; +import org.simantics.simulator.toolkit.StandardRealm; +import org.simantics.simulator.toolkit.db.StandardSessionManager; import org.simantics.spreadsheet.graph.formula.SpreadsheetEvaluationEnvironment; import org.simantics.spreadsheet.graph.synchronization.SpreadsheetSynchronizationEventHandler; import org.simantics.spreadsheet.resource.SpreadsheetResource; diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/function/All.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/function/All.java index 0affbc1c5..1439a941d 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/function/All.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/function/All.java @@ -29,7 +29,6 @@ import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.utils.Logger; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.StandardRealm; import org.simantics.db.layer0.exception.MissingVariableException; import org.simantics.db.layer0.function.StandardChildDomainChildren; import org.simantics.db.layer0.request.PossibleActiveRun; @@ -50,6 +49,7 @@ import org.simantics.document.server.io.IFont; import org.simantics.document.server.io.ITableCell; import org.simantics.layer0.Layer0; import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.simulator.toolkit.StandardRealm; import org.simantics.simulator.variable.exceptions.NodeManagerException; import org.simantics.spreadsheet.CellEditor; import org.simantics.spreadsheet.ClientModel; diff --git a/bundles/pom.xml b/bundles/pom.xml index 43a6f72ab..6bcbd6657 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -52,6 +52,7 @@ com.famfamfam.silk + hdf.hdf5lib org.simantics org.simantics.acorn org.simantics.action.ontology @@ -155,6 +156,8 @@ org.simantics.layer0.utils org.simantics.layer0x.ontology org.simantics.logback.configuration + org.simantics.logging + org.simantics.logging.ui org.simantics.ltk org.simantics.ltk.antlr org.simantics.lz4 @@ -201,6 +204,9 @@ org.simantics.simulation.ontology org.simantics.simulation.sequences org.simantics.simulation.ui + org.simantics.simulator + org.simantics.simulator.toolkit + org.simantics.simulator.toolkit.db org.simantics.simulator.variable org.simantics.softwareconfiguration.ontology org.simantics.spreadsheet diff --git a/features/hdf.hdf5.feature/.project b/features/hdf.hdf5.feature/.project new file mode 100644 index 000000000..eb65297d9 --- /dev/null +++ b/features/hdf.hdf5.feature/.project @@ -0,0 +1,17 @@ + + + hdf.hdf5.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/hdf.hdf5.feature/HDF5.license.txt b/features/hdf.hdf5.feature/HDF5.license.txt new file mode 100644 index 000000000..08bc324bf --- /dev/null +++ b/features/hdf.hdf5.feature/HDF5.license.txt @@ -0,0 +1,98 @@ + +Copyright Notice and License Terms for +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +----------------------------------------------------------------------------- + +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 2006-2016 by The HDF Group. + +NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 1998-2006 by the Board of Trustees of the University of Illinois. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted for any purpose (including commercial purposes) +provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or materials provided with the distribution. + +3. In addition, redistributions of modified forms of the source or binary + code must carry prominent notices stating that the original code was + changed and the date of the change. + +4. All publications or advertising materials mentioning features or use of + this software are asked, but not required, to acknowledge that it was + developed by The HDF Group and by the National Center for Supercomputing + Applications at the University of Illinois at Urbana-Champaign and + credit the contributors. + +5. Neither the name of The HDF Group, the name of the University, nor the + name of any Contributor may be used to endorse or promote products derived + from this software without specific prior written permission from + The HDF Group, the University, or the Contributor, respectively. + +DISCLAIMER: +THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS +"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. In no +event shall The HDF Group or the Contributors be liable for any damages +suffered by the users arising out of the use of this software, even if +advised of the possibility of such damage. + +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- + +Contributors: National Center for Supercomputing Applications (NCSA) at +the University of Illinois, Fortner Software, Unidata Program Center (netCDF), +The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), +and Digital Equipment Corporation (DEC). + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the Lawrence Berkeley +National Laboratory (LBNL) and the United States Department of Energy +under Prime Contract No. DE-AC02-05CH11231. + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the University of +California, Lawrence Livermore National Laboratory (UC LLNL). +The following statement applies to those portions of the product and must +be retained in any redistribution of source code, binaries, documentation, +and/or accompanying materials: + + This work was partially produced at the University of California, + Lawrence Livermore National Laboratory (UC LLNL) under contract + no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy + (DOE) and The Regents of the University of California (University) + for the operation of UC LLNL. + + DISCLAIMER: + This work was prepared as an account of work sponsored by an agency of + the United States Government. Neither the United States Government nor + the University of California nor any of their employees, makes any + warranty, express or implied, or assumes any liability or responsibility + for the accuracy, completeness, or usefulness of any information, + apparatus, product, or process disclosed, or represents that its use + would not infringe privately- owned rights. Reference herein to any + specific commercial products, process, or service by trade name, + trademark, manufacturer, or otherwise, does not necessarily constitute + or imply its endorsement, recommendation, or favoring by the United + States Government or the University of California. The views and + opinions of authors expressed herein do not necessarily state or reflect + those of the United States Government or the University of California, + and shall not be used for advertising or product endorsement purposes. + +----------------------------------------------------------------------------- + +HDF5 is available with the SZIP compression library but SZIP is not part +of HDF5 and has separate copyright and license terms. See “Szip Compression +in HDF Products” (www.hdfgroup.org/doc_resource/SZIP/) for further details. + +----------------------------------------------------------------------------- + diff --git a/features/hdf.hdf5.feature/build.properties b/features/hdf.hdf5.feature/build.properties new file mode 100644 index 000000000..2c7d8610e --- /dev/null +++ b/features/hdf.hdf5.feature/build.properties @@ -0,0 +1,2 @@ +bin.includes = feature.xml,\ + HDF5.license.txt diff --git a/features/hdf.hdf5.feature/feature.xml b/features/hdf.hdf5.feature/feature.xml new file mode 100644 index 000000000..d0cd9a1d5 --- /dev/null +++ b/features/hdf.hdf5.feature/feature.xml @@ -0,0 +1,128 @@ + + + + + This feature bundles together the Java HDF5 Interface library +(hdf.hdf5lib) and its dependencies. + + + + Copyright Notice and License Terms for +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +----------------------------------------------------------------------------- + +HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 2006-2016 by The HDF Group. + +NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities +Copyright 1998-2006 by the Board of Trustees of the University of Illinois. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted for any purpose (including commercial purposes) +provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or materials provided with the distribution. + +3. In addition, redistributions of modified forms of the source or binary + code must carry prominent notices stating that the original code was + changed and the date of the change. + +4. All publications or advertising materials mentioning features or use of + this software are asked, but not required, to acknowledge that it was + developed by The HDF Group and by the National Center for Supercomputing + Applications at the University of Illinois at Urbana-Champaign and + credit the contributors. + +5. Neither the name of The HDF Group, the name of the University, nor the + name of any Contributor may be used to endorse or promote products derived + from this software without specific prior written permission from + The HDF Group, the University, or the Contributor, respectively. + +DISCLAIMER: +THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS +"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. In no +event shall The HDF Group or the Contributors be liable for any damages +suffered by the users arising out of the use of this software, even if +advised of the possibility of such damage. + +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- + +Contributors: National Center for Supercomputing Applications (NCSA) at +the University of Illinois, Fortner Software, Unidata Program Center (netCDF), +The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), +and Digital Equipment Corporation (DEC). + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the Lawrence Berkeley +National Laboratory (LBNL) and the United States Department of Energy +under Prime Contract No. DE-AC02-05CH11231. + +----------------------------------------------------------------------------- + +Portions of HDF5 were developed with support from the University of +California, Lawrence Livermore National Laboratory (UC LLNL). +The following statement applies to those portions of the product and must +be retained in any redistribution of source code, binaries, documentation, +and/or accompanying materials: + + This work was partially produced at the University of California, + Lawrence Livermore National Laboratory (UC LLNL) under contract + no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy + (DOE) and The Regents of the University of California (University) + for the operation of UC LLNL. + + DISCLAIMER: + This work was prepared as an account of work sponsored by an agency of + the United States Government. Neither the United States Government nor + the University of California nor any of their employees, makes any + warranty, express or implied, or assumes any liability or responsibility + for the accuracy, completeness, or usefulness of any information, + apparatus, product, or process disclosed, or represents that its use + would not infringe privately- owned rights. Reference herein to any + specific commercial products, process, or service by trade name, + trademark, manufacturer, or otherwise, does not necessarily constitute + or imply its endorsement, recommendation, or favoring by the United + States Government or the University of California. The views and + opinions of authors expressed herein do not necessarily state or reflect + those of the United States Government or the University of California, + and shall not be used for advertising or product endorsement purposes. + +----------------------------------------------------------------------------- + +HDF5 is available with the SZIP compression library but SZIP is not part +of HDF5 and has separate copyright and license terms. See “Szip Compression +in HDF Products” (www.hdfgroup.org/doc_resource/SZIP/) for further details. + +----------------------------------------------------------------------------- + + + + + + + diff --git a/features/org.simantics.logging.feature/.project b/features/org.simantics.logging.feature/.project new file mode 100644 index 000000000..3ba00777a --- /dev/null +++ b/features/org.simantics.logging.feature/.project @@ -0,0 +1,17 @@ + + + org.simantics.logging.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/org.simantics.logging.feature/build.properties b/features/org.simantics.logging.feature/build.properties new file mode 100644 index 000000000..64f93a9f0 --- /dev/null +++ b/features/org.simantics.logging.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/org.simantics.logging.feature/feature.xml b/features/org.simantics.logging.feature/feature.xml new file mode 100644 index 000000000..3f4e57318 --- /dev/null +++ b/features/org.simantics.logging.feature/feature.xml @@ -0,0 +1,27 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + diff --git a/features/org.simantics.logging.ui.feature/.project b/features/org.simantics.logging.ui.feature/.project new file mode 100644 index 000000000..e4640469e --- /dev/null +++ b/features/org.simantics.logging.ui.feature/.project @@ -0,0 +1,17 @@ + + + org.simantics.logging.ui.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/org.simantics.logging.ui.feature/build.properties b/features/org.simantics.logging.ui.feature/build.properties new file mode 100644 index 000000000..64f93a9f0 --- /dev/null +++ b/features/org.simantics.logging.ui.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/org.simantics.logging.ui.feature/feature.xml b/features/org.simantics.logging.ui.feature/feature.xml new file mode 100644 index 000000000..6f94a0ef0 --- /dev/null +++ b/features/org.simantics.logging.ui.feature/feature.xml @@ -0,0 +1,31 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + diff --git a/features/org.simantics.sdk.feature/feature.xml b/features/org.simantics.sdk.feature/feature.xml index 5aeb671c8..b7dc9adee 100644 --- a/features/org.simantics.sdk.feature/feature.xml +++ b/features/org.simantics.sdk.feature/feature.xml @@ -204,6 +204,26 @@ id="org.simantics.scl.ui.feature" version="0.0.0"/> + + + + + + + + + + + + org.simantics.simulator.toolkit.db.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/org.simantics.simulator.toolkit.db.feature/build.properties b/features/org.simantics.simulator.toolkit.db.feature/build.properties new file mode 100644 index 000000000..82ab19c62 --- /dev/null +++ b/features/org.simantics.simulator.toolkit.db.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/org.simantics.simulator.toolkit.db.feature/feature.xml b/features/org.simantics.simulator.toolkit.db.feature/feature.xml new file mode 100644 index 000000000..875116394 --- /dev/null +++ b/features/org.simantics.simulator.toolkit.db.feature/feature.xml @@ -0,0 +1,31 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + diff --git a/features/org.simantics.simulator.toolkit.feature/.project b/features/org.simantics.simulator.toolkit.feature/.project new file mode 100644 index 000000000..241fafebd --- /dev/null +++ b/features/org.simantics.simulator.toolkit.feature/.project @@ -0,0 +1,17 @@ + + + org.simantics.simulator.toolkit.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/org.simantics.simulator.toolkit.feature/build.properties b/features/org.simantics.simulator.toolkit.feature/build.properties new file mode 100644 index 000000000..82ab19c62 --- /dev/null +++ b/features/org.simantics.simulator.toolkit.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/org.simantics.simulator.toolkit.feature/feature.xml b/features/org.simantics.simulator.toolkit.feature/feature.xml new file mode 100644 index 000000000..79c4b2cd3 --- /dev/null +++ b/features/org.simantics.simulator.toolkit.feature/feature.xml @@ -0,0 +1,62 @@ + + + + + [Enter Feature Description here.] + + + + [Enter Copyright Description here.] + + + + [Enter License Description here.] + + + + + + + + + + + + + + + diff --git a/features/org.simantics.spreadsheet.ui.feature/feature.xml b/features/org.simantics.spreadsheet.ui.feature/feature.xml index b81d38a3b..33385bcaa 100644 --- a/features/org.simantics.spreadsheet.ui.feature/feature.xml +++ b/features/org.simantics.spreadsheet.ui.feature/feature.xml @@ -25,6 +25,10 @@ id="org.simantics.scl" version="0.0.0"/> + + com.lowagie.text.feature + hdf.hdf5.feature org.apache.lucene4.feature org.jfree.feature org.simantics.acorn.feature @@ -112,6 +113,8 @@ org.simantics.issues.feature org.simantics.issues.ui.feature org.simantics.layer0.feature + org.simantics.logging.feature + org.simantics.logging.ui.feature org.simantics.message.feature org.simantics.migration.feature org.simantics.modeling.feature @@ -126,6 +129,8 @@ org.simantics.sdk.feature org.simantics.selectionview.feature org.simantics.simulation.feature + org.simantics.simulator.toolkit.feature + org.simantics.simulator.toolkit.db.feature org.simantics.spreadsheet.feature org.simantics.spreadsheet.ui.feature org.simantics.structural.feature diff --git a/license.html b/license.html index a06eb203e..35990493b 100644 --- a/license.html +++ b/license.html @@ -28,6 +28,7 @@

  • 11 LGPL
  • 12 MIT License
  • 13 Mozilla Public License 2.0
  • +
  • 14 HDF5 (Hierarchical Data Format 5) License
  • @@ -545,7 +546,15 @@ Copyright (c) 2011-2016, Yann Collet CDDL 1.1 + GPLv2 with classpath exception 2.0.1 - + + + HDF5 Software Library + + HDF5 License (BSD-style Open Source) + +1.10.0-patch1 + + @@ -2700,6 +2709,109 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice defined by the Mozilla Public License, v. 2.0. +

    HDF5 (Hierarchical Data Format 5) Software Library and Utilities License

    + +
    Copyright Notice and License Terms for 
    +HDF5 (Hierarchical Data Format 5) Software Library and Utilities
    +-----------------------------------------------------------------------------
    +
    +HDF5 (Hierarchical Data Format 5) Software Library and Utilities
    +Copyright 2006-2016 by The HDF Group.
    +
    +NCSA HDF5 (Hierarchical Data Format 5) Software Library and Utilities
    +Copyright 1998-2006 by the Board of Trustees of the University of Illinois.
    +
    +All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without 
    +modification, are permitted for any purpose (including commercial purposes) 
    +provided that the following conditions are met:
    +
    +1. Redistributions of source code must retain the above copyright notice, 
    +   this list of conditions, and the following disclaimer.
    +
    +2. Redistributions in binary form must reproduce the above copyright notice, 
    +   this list of conditions, and the following disclaimer in the documentation 
    +   and/or materials provided with the distribution.
    +
    +3. In addition, redistributions of modified forms of the source or binary 
    +   code must carry prominent notices stating that the original code was 
    +   changed and the date of the change.
    +
    +4. All publications or advertising materials mentioning features or use of 
    +   this software are asked, but not required, to acknowledge that it was 
    +   developed by The HDF Group and by the National Center for Supercomputing 
    +   Applications at the University of Illinois at Urbana-Champaign and 
    +   credit the contributors.
    +
    +5. Neither the name of The HDF Group, the name of the University, nor the 
    +   name of any Contributor may be used to endorse or promote products derived 
    +   from this software without specific prior written permission from 
    +   The HDF Group, the University, or the Contributor, respectively.
    +
    +DISCLAIMER: 
    +THIS SOFTWARE IS PROVIDED BY THE HDF GROUP AND THE CONTRIBUTORS 
    +"AS IS" WITH NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.  In no 
    +event shall The HDF Group or the Contributors be liable for any damages 
    +suffered by the users arising out of the use of this software, even if 
    +advised of the possibility of such damage. 
    +
    +-----------------------------------------------------------------------------
    +-----------------------------------------------------------------------------
    +
    +Contributors:   National Center for Supercomputing Applications (NCSA) at 
    +the University of Illinois, Fortner Software, Unidata Program Center (netCDF), 
    +The Independent JPEG Group (JPEG), Jean-loup Gailly and Mark Adler (gzip), 
    +and Digital Equipment Corporation (DEC).
    +
    +-----------------------------------------------------------------------------
    +
    +Portions of HDF5 were developed with support from the Lawrence Berkeley 
    +National Laboratory (LBNL) and the United States Department of Energy 
    +under Prime Contract No. DE-AC02-05CH11231.
    +
    +-----------------------------------------------------------------------------
    +
    +Portions of HDF5 were developed with support from the University of 
    +California, Lawrence Livermore National Laboratory (UC LLNL).  
    +The following statement applies to those portions of the product and must 
    +be retained in any redistribution of source code, binaries, documentation, 
    +and/or accompanying materials:
    +
    +   This work was partially produced at the University of California, 
    +   Lawrence Livermore National Laboratory (UC LLNL) under contract 
    +   no. W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy 
    +   (DOE) and The Regents of the University of California (University) 
    +   for the operation of UC LLNL.
    +
    +   DISCLAIMER: 
    +   This work was prepared as an account of work sponsored by an agency of 
    +   the United States Government. Neither the United States Government nor 
    +   the University of California nor any of their employees, makes any 
    +   warranty, express or implied, or assumes any liability or responsibility 
    +   for the accuracy, completeness, or usefulness of any information, 
    +   apparatus, product, or process disclosed, or represents that its use 
    +   would not infringe privately- owned rights. Reference herein to any 
    +   specific commercial products, process, or service by trade name, 
    +   trademark, manufacturer, or otherwise, does not necessarily constitute 
    +   or imply its endorsement, recommendation, or favoring by the United 
    +   States Government or the University of California. The views and 
    +   opinions of authors expressed herein do not necessarily state or reflect 
    +   those of the United States Government or the University of California, 
    +   and shall not be used for advertising or product endorsement purposes.
    +
    +-----------------------------------------------------------------------------
    +
    +HDF5 is available with the SZIP compression library but SZIP is not part 
    +of HDF5 and has separate copyright and license terms. See "Szip Compression 
    +in HDF Products" (www.hdfgroup.org/doc_resource/SZIP/) for further details.
    +
    +-----------------------------------------------------------------------------
    +
    + diff --git a/releng/pom.xml b/releng/pom.xml index dd0a01205..fcc27a679 100644 --- a/releng/pom.xml +++ b/releng/pom.xml @@ -15,7 +15,33 @@ org.simantics.sdk.build.targetdefinition - org.simantics.sdk.repository - org.simantics.desktop.rcp.product + + + + build-p2-repository + + + build-p2-repository + !false + + + + org.simantics.sdk.repository + + + + build-products + + + build-products + !false + + + + org.simantics.desktop.rcp.product + + + +