diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml
index 7eea049604..624183c079 100644
--- a/config/alfresco/bootstrap-context.xml
+++ b/config/alfresco/bootstrap-context.xml
@@ -166,6 +166,7 @@
+
diff --git a/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/remove-redundant-jbpm-indexes.sql b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/remove-redundant-jbpm-indexes.sql
new file mode 100644
index 0000000000..7e8f29c76e
--- /dev/null
+++ b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/remove-redundant-jbpm-indexes.sql
@@ -0,0 +1,66 @@
+--
+-- Title: Upgrade to V3.4 - Remove redundant indexes in jbpm tables
+-- Database: Generic
+-- Since: V3.4 schema 4210
+-- Author: Pavel Yurkevich
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+
+DROP INDEX IDX_ACTION_ACTNDL ON JBPM_ACTION; -- (optional)
+DROP INDEX IDX_ACTION_EVENT ON JBPM_ACTION; -- (optional)
+DROP INDEX IDX_ACTION_PROCDF ON JBPM_ACTION; -- (optional)
+DROP INDEX IDX_COMMENT_TOKEN ON JBPM_COMMENT; -- (optional)
+DROP INDEX IDX_COMMENT_TSK ON JBPM_COMMENT; -- (optional)
+DROP INDEX IDX_DELEG_PRCD ON JBPM_DELEGATION; -- (optional)
+DROP INDEX IDX_JOB_PRINST ON JBPM_JOB; -- (optional)
+DROP INDEX IDX_JOB_TOKEN ON JBPM_JOB; -- (optional)
+DROP INDEX IDX_JOB_TSKINST ON JBPM_JOB; -- (optional)
+DROP INDEX IDX_MODDEF_PROCDF ON JBPM_MODULEDEFINITION; -- (optional)
+DROP INDEX IDX_MODINST_PRINST ON JBPM_MODULEINSTANCE; -- (optional)
+DROP INDEX IDX_NODE_ACTION ON JBPM_NODE; -- (optional)
+DROP INDEX IDX_NODE_PROCDEF ON JBPM_NODE; -- (optional)
+DROP INDEX IDX_NODE_SUPRSTATE ON JBPM_NODE; -- (optional)
+DROP INDEX IDX_PSTATE_SBPRCDEF ON JBPM_NODE; -- (optional)
+DROP INDEX IDX_PLDACTR_ACTID ON JBPM_POOLEDACTOR; -- (optional)
+DROP INDEX IDX_TSKINST_SWLANE ON JBPM_POOLEDACTOR; -- (optional)
+DROP INDEX IDX_PROCDEF_STRTST ON JBPM_PROCESSDEFINITION; -- (optional)
+DROP INDEX IDX_PROCIN_KEY ON JBPM_PROCESSINSTANCE; -- (optional)
+DROP INDEX IDX_PROCIN_PROCDEF ON JBPM_PROCESSINSTANCE; -- (optional)
+DROP INDEX IDX_PROCIN_ROOTTK ON JBPM_PROCESSINSTANCE; -- (optional)
+DROP INDEX IDX_PROCIN_SPROCTK ON JBPM_PROCESSINSTANCE; -- (optional)
+DROP INDEX IDX_RTACTN_ACTION ON JBPM_RUNTIMEACTION; -- (optional)
+DROP INDEX IDX_RTACTN_PRCINST ON JBPM_RUNTIMEACTION; -- (optional)
+DROP INDEX IDX_SWIMLINST_SL ON JBPM_SWIMLANEINSTANCE; -- (optional)
+DROP INDEX IDX_TASK_PROCDEF ON JBPM_TASK; -- (optional)
+DROP INDEX IDX_TASK_TASKMGTDF ON JBPM_TASK; -- (optional)
+DROP INDEX IDX_TASK_TSKNODE ON JBPM_TASK; -- (optional)
+DROP INDEX IDX_TASKINST_TOKN ON JBPM_TASKINSTANCE; -- (optional)
+DROP INDEX IDX_TASKINST_TSK ON JBPM_TASKINSTANCE; -- (optional)
+DROP INDEX IDX_TASK_ACTORID ON JBPM_TASKINSTANCE; -- (optional)
+DROP INDEX IDX_TSKINST_SLINST ON JBPM_TASKINSTANCE; -- (optional)
+DROP INDEX IDX_TSKINST_TMINST ON JBPM_TASKINSTANCE; -- (optional)
+DROP INDEX IDX_TOKEN_NODE ON JBPM_TOKEN; -- (optional)
+DROP INDEX IDX_TOKEN_PARENT ON JBPM_TOKEN; -- (optional)
+DROP INDEX IDX_TOKEN_PROCIN ON JBPM_TOKEN; -- (optional)
+DROP INDEX IDX_TOKEN_SUBPI ON JBPM_TOKEN; -- (optional)
+DROP INDEX IDX_TKVARMAP_CTXT ON JBPM_TOKENVARIABLEMAP; -- (optional)
+DROP INDEX IDX_TKVVARMP_TOKEN ON JBPM_TOKENVARIABLEMAP; -- (optional)
+DROP INDEX IDX_TRANSIT_FROM ON JBPM_TRANSITION; -- (optional)
+DROP INDEX IDX_TRANSIT_TO ON JBPM_TRANSITION; -- (optional)
+DROP INDEX IDX_TRANS_PROCDEF ON JBPM_TRANSITION; -- (optional)
+DROP INDEX IDX_VARINST_PRCINS ON JBPM_VARIABLEINSTANCE; -- (optional)
+DROP INDEX IDX_VARINST_TK ON JBPM_VARIABLEINSTANCE; -- (optional)
+DROP INDEX IDX_VARINST_TKVARMP ON JBPM_VARIABLEINSTANCE; -- (optional)
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-remove-redundant-jbpm-indexes';
+INSERT INTO alf_applied_patch
+ (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
+ VALUES
+ (
+ 'patch.db-V3.4-remove-redundant-jbpm-indexes', 'Manually executed script upgrade V3.4',
+ 0, 6010, -1, 6011, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
+ );
diff --git a/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.PostgreSQLDialect/remove-redundant-jbpm-indexes.sql b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.PostgreSQLDialect/remove-redundant-jbpm-indexes.sql
new file mode 100644
index 0000000000..c5959873ea
--- /dev/null
+++ b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.PostgreSQLDialect/remove-redundant-jbpm-indexes.sql
@@ -0,0 +1,66 @@
+--
+-- Title: Upgrade to V3.4 - Remove redundant indexes in jbpm tables
+-- Database: PostgreSQL
+-- Since: V3.4 schema 4210
+-- Author: Pavel Yurkevich
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+
+DROP INDEX IDX_ACTION_ACTNDL; -- (optional)
+DROP INDEX IDX_ACTION_EVENT; -- (optional)
+DROP INDEX IDX_ACTION_PROCDF; -- (optional)
+DROP INDEX IDX_COMMENT_TOKEN; -- (optional)
+DROP INDEX IDX_COMMENT_TSK; -- (optional)
+DROP INDEX IDX_DELEG_PRCD; -- (optional)
+DROP INDEX IDX_JOB_PRINST; -- (optional)
+DROP INDEX IDX_JOB_TOKEN; -- (optional)
+DROP INDEX IDX_JOB_TSKINST; -- (optional)
+DROP INDEX IDX_MODDEF_PROCDF; -- (optional)
+DROP INDEX IDX_MODINST_PRINST; -- (optional)
+DROP INDEX IDX_NODE_ACTION; -- (optional)
+DROP INDEX IDX_NODE_PROCDEF; -- (optional)
+DROP INDEX IDX_NODE_SUPRSTATE; -- (optional)
+DROP INDEX IDX_PSTATE_SBPRCDEF; -- (optional)
+DROP INDEX IDX_PLDACTR_ACTID; -- (optional)
+DROP INDEX IDX_TSKINST_SWLANE; -- (optional)
+DROP INDEX IDX_PROCDEF_STRTST; -- (optional)
+DROP INDEX IDX_PROCIN_KEY; -- (optional)
+DROP INDEX IDX_PROCIN_PROCDEF; -- (optional)
+DROP INDEX IDX_PROCIN_ROOTTK; -- (optional)
+DROP INDEX IDX_PROCIN_SPROCTK; -- (optional)
+DROP INDEX IDX_RTACTN_ACTION; -- (optional)
+DROP INDEX IDX_RTACTN_PRCINST; -- (optional)
+DROP INDEX IDX_SWIMLINST_SL; -- (optional)
+DROP INDEX IDX_TASK_PROCDEF; -- (optional)
+DROP INDEX IDX_TASK_TASKMGTDF; -- (optional)
+DROP INDEX IDX_TASK_TSKNODE; -- (optional)
+DROP INDEX IDX_TASKINST_TOKN; -- (optional)
+DROP INDEX IDX_TASKINST_TSK; -- (optional)
+DROP INDEX IDX_TASK_ACTORID; -- (optional)
+DROP INDEX IDX_TSKINST_SLINST; -- (optional)
+DROP INDEX IDX_TSKINST_TMINST; -- (optional)
+DROP INDEX IDX_TOKEN_NODE; -- (optional)
+DROP INDEX IDX_TOKEN_PARENT; -- (optional)
+DROP INDEX IDX_TOKEN_PROCIN; -- (optional)
+DROP INDEX IDX_TOKEN_SUBPI; -- (optional)
+DROP INDEX IDX_TKVARMAP_CTXT; -- (optional)
+DROP INDEX IDX_TKVVARMP_TOKEN; -- (optional)
+DROP INDEX IDX_TRANSIT_FROM; -- (optional)
+DROP INDEX IDX_TRANSIT_TO; -- (optional)
+DROP INDEX IDX_TRANS_PROCDEF; -- (optional)
+DROP INDEX IDX_VARINST_PRCINS; -- (optional)
+DROP INDEX IDX_VARINST_TK; -- (optional)
+DROP INDEX IDX_VARINST_TKVARMP; -- (optional)
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-remove-redundant-jbpm-indexes';
+INSERT INTO alf_applied_patch
+ (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
+ VALUES
+ (
+ 'patch.db-V3.4-remove-redundant-jbpm-indexes', 'Manually executed script upgrade V3.4',
+ 0, 6010, -1, 6011, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
+ );
diff --git a/config/alfresco/ehcache-default.xml b/config/alfresco/ehcache-default.xml
index 8376ab6b42..971cf63ae7 100644
--- a/config/alfresco/ehcache-default.xml
+++ b/config/alfresco/ehcache-default.xml
@@ -377,6 +377,16 @@
statistics="false"
/>
+
+
+
+
+
+
+
+
+
+
delete from
- alf_transaction txn
+ alf_transaction
where not exists
(
select 1
from
alf_node node
where
- node.transaction_id = txn.id
+ node.transaction_id = alf_transaction.id
)
= #{minCommitTime}]]>
diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml
index b79259f006..616ce2b65a 100644
--- a/config/alfresco/patch/patch-services-context.xml
+++ b/config/alfresco/patch/patch-services-context.xml
@@ -3222,4 +3222,15 @@
+
+ patch.db-V3.4-remove-redundant-jbpm-indexes
+ patch.schemaUpgradeScript.description
+ 0
+ 5035
+ 5036
+
+ classpath:alfresco/dbscripts/upgrade/3.4/${db.script.dialect}/remove-redundant-jbpm-indexes.sql
+
+
+
diff --git a/config/alfresco/version.properties b/config/alfresco/version.properties
index 8ba94036b4..4169d3b41d 100644
--- a/config/alfresco/version.properties
+++ b/config/alfresco/version.properties
@@ -19,4 +19,4 @@ version.build=@build-number@
# Schema number
-version.schema=6010
+version.schema=6011
diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java
index 547499354a..80d4935b7e 100644
--- a/source/java/org/alfresco/repo/jscript/ScriptNode.java
+++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java
@@ -2022,20 +2022,22 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider
return null;
}
- // Checkout the node if required
- ScriptNode workingCopy = this;
- if (!nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY))
+ ScriptNode originalNode = this;
+ //cancel editing if we want to revert
+ if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY))
{
- workingCopy = checkout();
+ originalNode = cancelCheckout();
}
- // Checkin the node - to get the new version
- workingCopy = workingCopy.checkin(history, majorVersion);
-
// Revert the new (current) version of the node
- services.getVersionService().revert(workingCopy.nodeRef, version, deep);
+ services.getVersionService().revert(originalNode.getNodeRef(), version, deep);
- return workingCopy;
+ // Checkout/Checkin the node - to store the new version in version history
+ ScriptNode workingCopy = originalNode.checkout();
+ originalNode = workingCopy.checkin(history, majorVersion);
+
+
+ return originalNode;
}
/**
@@ -2414,6 +2416,15 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider
return newInstance(original, this.services, this.scope);
}
+ /**
+ * Removes the lock on a node.
+ *
+ */
+ public void unlock()
+ {
+ this.services.getLockService().unlock(this.nodeRef);
+ }
+
/**
* Cancel the check-out of a working copy document. The working copy will be deleted and any changes made to it
* are lost. Note that this method can only be called on a working copy Node. The reference to this working copy
diff --git a/source/java/org/alfresco/repo/remoteconnector/RemoteConnectorResponseImpl.java b/source/java/org/alfresco/repo/remoteconnector/RemoteConnectorResponseImpl.java
index 6b0726fcd3..dff666c3a1 100644
--- a/source/java/org/alfresco/repo/remoteconnector/RemoteConnectorResponseImpl.java
+++ b/source/java/org/alfresco/repo/remoteconnector/RemoteConnectorResponseImpl.java
@@ -67,9 +67,19 @@ public class RemoteConnectorResponseImpl implements RemoteConnectorResponse
public RemoteConnectorResponseImpl(RemoteConnectorRequest request, String contentType,
String charset, int status, Header[] headers, byte[] response)
{
- this(request, contentType, charset, status, headers, new ByteArrayInputStream(response));
- this.bodyBytes = response;
+ this(request, contentType, charset, status, headers, new ByteArrayInputStream(ensureBytes(response)));
+ this.bodyBytes = ensureBytes(response);
}
+ /**
+ * HttpClient will return a null response body for things like 204 (No Content).
+ * We want to treat that as an empty byte array, to meet our contracts
+ */
+ private static byte[] ensureBytes(byte[] bytes)
+ {
+ if (bytes == null) return EMPTY_BYTE_ARRAY;
+ return bytes;
+ }
+ private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
@Override
public int getStatus()
diff --git a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java
index 9a2b986940..d347966808 100644
--- a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java
+++ b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformer.java
@@ -206,7 +206,10 @@ public class DbObjectXMLTransformer
simpleEndTag(XML.EL_COLUMNS);
// Output primary key
- output(table.getPrimaryKey());
+ if (table.hasPrimaryKey())
+ {
+ output(table.getPrimaryKey());
+ }
// Output foreign keys
simpleStartTag(XML.EL_FOREIGN_KEYS);
diff --git a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java
index 6f67e7ea15..7b85635f6b 100644
--- a/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java
+++ b/source/java/org/alfresco/util/schemacomp/DbObjectXMLTransformerTest.java
@@ -24,6 +24,7 @@ import static org.alfresco.util.schemacomp.SchemaCompTestingUtils.fk;
import static org.alfresco.util.schemacomp.SchemaCompTestingUtils.fkeys;
import static org.alfresco.util.schemacomp.SchemaCompTestingUtils.indexes;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
@@ -264,6 +265,26 @@ public class DbObjectXMLTransformerTest
assertEquals("", reader.readLine());
}
+ /**
+ * ALF-13979: empty table causes NPE during schema export.
+ * @throws IOException
+ */
+ @Test
+ public void transformTableWithoutPrimaryKey() throws IOException
+ {
+ Table table = new Table("my_table");
+ assertFalse(table.hasPrimaryKey());
+
+ transformer.output(table);
+
+ BufferedReader reader = new BufferedReader(new StringReader(writer.toString()));
+ dumpOutput();
+ assertHasPreamble(reader);
+ skipUntilEnd(" {columns}", reader, true);
+ skipUntilEnd(" {foreignkeys}", reader, true);
+ skipUntilEnd(" {indexes}", reader, true);
+ assertEquals("", reader.readLine());
+ }
@Test
public void transformObjectWithValidators() throws IOException
@@ -332,7 +353,7 @@ public class DbObjectXMLTransformerTest
{
textToFind = textToFind.trim().
replace("{", "<").
- replace("}", "\\s+.*/>");
+ replace("}", ".*/>");
}
else
{
diff --git a/source/java/org/alfresco/util/schemacomp/model/Table.java b/source/java/org/alfresco/util/schemacomp/model/Table.java
index 9e242960d6..340dd06d62 100644
--- a/source/java/org/alfresco/util/schemacomp/model/Table.java
+++ b/source/java/org/alfresco/util/schemacomp/model/Table.java
@@ -102,6 +102,13 @@ public class Table extends AbstractDbObject
return this.primaryKey;
}
+ /**
+ * @return Whether there is a primary key on this table.
+ */
+ public boolean hasPrimaryKey()
+ {
+ return (primaryKey != null);
+ }
/**
* @param primaryKey the primaryKey to set