diff --git a/src/main/java/caosdb/datetime/UTCDateTime.java b/src/main/java/caosdb/datetime/UTCDateTime.java index 215de67befe403aa6a202ed178244b3de898d23e..db66ef0ad08abf0d52a8f3b1b97c6a20cc613c8a 100644 --- a/src/main/java/caosdb/datetime/UTCDateTime.java +++ b/src/main/java/caosdb/datetime/UTCDateTime.java @@ -296,7 +296,7 @@ public class UTCDateTime implements Interval { throw new NullPointerException("toString method!!!"); } - public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanosecond) { + public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanoseconds) { if (LEAP_SECONDS.isEmpty()) { initLeapSeconds(); } @@ -310,10 +310,10 @@ public class UTCDateTime implements Interval { if (leapSeconds2 != leapSeconds && LEAP_SECONDS.contains(systemSeconds)) { gc.add(Calendar.SECOND, -1); return new UTCDateTime( - systemSeconds, leapSeconds, nanosecond, new LeapSecondDateTimeStringStrategy(gc, 1)); + systemSeconds, leapSeconds, nanoseconds, new LeapSecondDateTimeStringStrategy(gc, 1)); } else { return new UTCDateTime( - systemSeconds, leapSeconds, nanosecond, new GregorianCalendarDateTimeStringStrategy(gc)); + systemSeconds, leapSeconds, nanoseconds, new GregorianCalendarDateTimeStringStrategy(gc)); } } diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java index 86918e37c279f4ab5decb9c59c5311e1747f1a0f..fc17dd1066cfa57660d44dbb6a521d3177e5fc72 100644 --- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java +++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/DatabaseConnectionPool.java @@ -86,9 +86,6 @@ class DatabaseConnectionPool { + "/" + CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_DATABASE_NAME) + "?noAccessToProcedureBodies=true&autoReconnect=true&serverTimezone=UTC&characterEncoding=UTF-8"; - // + - // "?noAccessToProcedureBodies=true&cacheCallableStmts=true&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_unicode_ci&characterSetResults=utf8&serverTimezone=CET"; - // + "?profileSQL=true&characterSetResults=utf8"; final String user = CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_USER_NAME); final String pwd = CaosDBServer.getServerProperty(ServerProperties.KEY_MYSQL_USER_PASSWORD); final ConnectionPool pool = new ConnectionPool("MySQL Pool", 2, 5, 0, 0, url, user, pwd); diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java index dca689c0414726a424e224ff5eed9ea27f740cfc..b443c54507e415ed4171fcf0ac99c3da762fb506 100644 --- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java +++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLHelper.java @@ -50,6 +50,11 @@ public class MySQLHelper implements DBHelper { private Logger logger = LoggerFactory.getLogger(getClass()); + /** + * Initialize a transaction by calling the corresponding SQL procedure. + * + * <p>In the database, this adds a row to the transaction table with SRID, user and timestamp. + */ public void initTransaction(Connection connection, WriteTransaction<?> transaction) throws SQLException { try (CallableStatement call = connection.prepareCall("CALL set_transaction(?,?,?,?,?)")) { @@ -152,7 +157,7 @@ public class MySQLHelper implements DBHelper { try (Statement s = connection.createStatement()) { s.execute("SET @SRID = NULL"); } catch (SQLException e) { - logger.error("Exception during resetting the @SRID variable.", e); + logger.error("Exception while resetting the @SRID variable.", e); } // close all cached statements (if possible) @@ -162,7 +167,7 @@ public class MySQLHelper implements DBHelper { stmt.close(); } } catch (final SQLException e) { - logger.warn("Exception during closing a prepared statement.", e); + logger.warn("Exception while closing a prepared statement.", e); } } diff --git a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java index 30497b2d759e91622025cbaf0425dcdff7f64036..73c589fade317586cc1b5bfb4b796578f9e819ba 100644 --- a/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java +++ b/src/main/java/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java @@ -64,8 +64,8 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS } updateFilePropsStmt.execute(); - final PreparedStatement updateEntityStmt = prepareStatement(STMT_UPDATE_ENTITY); // very sparse entity + final PreparedStatement updateEntityStmt = prepareStatement(STMT_UPDATE_ENTITY); updateEntityStmt.setInt(1, spe.id); updateEntityStmt.setString(2, spe.name); updateEntityStmt.setString(3, spe.description); diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java index eac5aa7f0a0bd506514cdbca2efe989541dd5e3a..d33d5e96d978fe86d6eb965113726eb79bb60d40 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveParents.java @@ -38,10 +38,10 @@ import org.apache.commons.jcs.access.behavior.ICacheAccess; // When an old entity version has a parent which is deleted, the name is // still in the cached VerySparseEntity. This can be resolved by using a // similar strategy as in RetrieveProperties.java where the name etc. are -// retrieved in a second step. Thus the deletion doesn't slips through +// retrieved in a second step. Thus the deletion doesn't slip through // unnoticed. // -// Changes are to be made in the backend-api, i.e. mysqlbackend and the +// Changes are necessary in the backend-api, i.e. mysqlbackend and the // interfaces as well. // // See also a failing test in caosdb-pyinttest: diff --git a/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java b/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java index 77f282d08e2b054f079013a1dd47d112592fa16e..1daab0504cafbd05e9e03dff78b2c230a0438ccd 100644 --- a/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java +++ b/src/main/java/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java @@ -38,7 +38,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory { @Override protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException { - super.process(map); + super.process(map); // Make the map available to the object. if (!map.isEmpty()) getVersion(); } @@ -52,6 +52,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory { return v; } + /** Return a list of direct children. */ private LinkedList<Version> getSuccessors(String id) { LinkedList<Version> result = new LinkedList<>(); @@ -69,6 +70,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory { return result; } + /** Return a list of direct parents. */ private LinkedList<Version> getPredecessors(String id) { LinkedList<Version> result = new LinkedList<>(); if (getMap().containsKey(id) && getMap().get(id).parents != null) diff --git a/src/main/java/caosdb/server/datatype/ReferenceValue.java b/src/main/java/caosdb/server/datatype/ReferenceValue.java index 41c475bfac1153b87c7e63db80c1ec173fdb1c98..77f7aa8c56d97b8dc5abf914c0b6c88749683d69 100644 --- a/src/main/java/caosdb/server/datatype/ReferenceValue.java +++ b/src/main/java/caosdb/server/datatype/ReferenceValue.java @@ -31,6 +31,14 @@ import caosdb.server.utils.ServerMessages; import java.util.Objects; import org.jdom2.Element; +/** + * A ReferenceValue represents the value of a reference property to another entity. + * + * <p>Differently from other properties, they may be versioned, i.e. they may reference to a + * specific version of an entity. + * + * <p>TODO: Ways to specify a reference value, what are the consequences of versioned references? + */ public class ReferenceValue implements SingleValue { private EntityInterface entity = null; private String name = null; @@ -61,6 +69,11 @@ public class ReferenceValue implements SingleValue { } } + /** + * Split a reference string into an entity part and a version part, if there is a version part. + * + * <p>If parsing the entity ID part to an integer fails, a NumberFormatException may be thrown. + */ public static ReferenceValue parseIdVersion(String str) { String[] split = str.split("@", 2); if (split.length == 2) { @@ -70,6 +83,12 @@ public class ReferenceValue implements SingleValue { } } + /** + * Create a ReferenceValue from a string. + * + * <p>If the string looks like a valid "entityID@version" string, the result will have the + * corresponding entity and version parts. + */ public static ReferenceValue parseFromString(String str) { try { return parseIdVersion(str); @@ -78,18 +97,28 @@ public class ReferenceValue implements SingleValue { } } + /** + * Produce a nice but short string: + * + * <p>Case 1 "versioned" (reference to an entity without specifying that entity's version): + * Produces a string like "1234" or "Experiment". Note that referencing via name is never + * versioned. + * + * <p>Case 2 "unversioned" (reference to an entity with a specified version): Produces a string + * like "1234@ab987f". + */ @Override public String toString() { - if (this.entity != null && versioned) { - return this.entity.getIdVersion().toString(); - } else if (this.entity != null) { + if (this.entity != null && versioned) { // Was specified as "versioned", with resolved entity + return this.entity.getIdVersion(); + } else if (this.entity != null) { // resolved, but unversioned return this.entity.getId().toString(); - } else if (this.id == null && this.name != null) { + } else if (this.id == null + && this.name != null) { // Only name is available, no id (and thus no resolved entity) return this.name; - } else if (this.version != null) { - return getIdVersion(); } - return this.id.toString(); + // Specification via id is the only remaining possibility + return getIdVersion(); // if version is null, returns ID only } public String getIdVersion() { @@ -105,14 +134,16 @@ public class ReferenceValue implements SingleValue { } public ReferenceValue(final Integer id) { - this.id = id; + this(id, null); } public ReferenceValue(final Integer id, final String version) { this.id = id; this.version = version; + this.versioned = version != null; } + /** If the reference is given by name, versioning is not possible (at the moment). */ public ReferenceValue(final String name) { this.name = name; } diff --git a/src/main/java/caosdb/server/entity/Entity.java b/src/main/java/caosdb/server/entity/Entity.java index e2f9b6d818813296e31f812d4ddfa6ac289de409..16f4f508e2d97a4c0f58c1775e95db9efbf4ffba 100644 --- a/src/main/java/caosdb/server/entity/Entity.java +++ b/src/main/java/caosdb/server/entity/Entity.java @@ -804,7 +804,7 @@ public class Entity extends AbstractObservable implements EntityInterface { int pidx = 0; for (final Element pe : element.getChildren()) { if (pe.getName().equalsIgnoreCase("Version")) { - // IGNORE: When it is allowed for clients to set a version id, parsing + // IGNORE: Once it becomes allowed for clients to set a version id, parsing // the Version element would be done here. Until this is the case, the // Version tag is ignored. } else if (pe.getName().equalsIgnoreCase("EmptyString")) { @@ -1147,6 +1147,7 @@ public class Entity extends AbstractObservable implements EntityInterface { this.version = version; } + /** Return "id@version" if there is versioning information, else only "id". */ @Override public String getIdVersion() { if (!this.hasId()) { diff --git a/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java b/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java index 07c9fe67a667cbd8ef5087f87b731e71ede6fafe..7a4a29a16cc545ca5316c7b086a8b1ec46cfcfc3 100644 --- a/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java +++ b/src/main/java/caosdb/server/entity/xml/SetFieldStrategy.java @@ -112,7 +112,7 @@ public class SetFieldStrategy { * are actually used, e.g ["a.b.c.d1", "a.b.c.d2"]. */ return new SetFieldStrategy() { - // Always-true-strategy + // Return true for everything except version fields. @Override public boolean isToBeSet(String field) { return field == null || !field.equalsIgnoreCase("version"); diff --git a/src/main/java/caosdb/server/transaction/WriteTransaction.java b/src/main/java/caosdb/server/transaction/WriteTransaction.java index dd2a581716fb5261ff63e026957bc37805b47147..ec37d19d6f5a4663c0af0adda186c282215a302b 100644 --- a/src/main/java/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/caosdb/server/transaction/WriteTransaction.java @@ -37,9 +37,6 @@ public abstract class WriteTransaction<C extends TransactionContainer> extends T // acquire strong access. No other thread can have access until // it this strong access is released. setAccess(getMonitor().acquireStrongAccess(this)); - - // set SRID - } @Override