diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml
index bf78e2427a..05a962a69f 100644
--- a/config/alfresco/action-services-context.xml
+++ b/config/alfresco/action-services-context.xml
@@ -442,8 +442,8 @@
-
-
+
+ false
diff --git a/config/alfresco/application-context-core.xml b/config/alfresco/application-context-core.xml
index 30665d99cb..ec66e257a1 100644
--- a/config/alfresco/application-context-core.xml
+++ b/config/alfresco/application-context-core.xml
@@ -15,7 +15,6 @@
-
diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml
index b6c6afc6ab..75f88ee3cf 100644
--- a/config/alfresco/bootstrap-context.xml
+++ b/config/alfresco/bootstrap-context.xml
@@ -90,6 +90,7 @@
classpath:alfresco/dbscripts/create/${db.script.dialect}/AlfrescoPostCreate-JBPM-Extra.sql
+ classpath:alfresco/dbscripts/create/${db.script.dialect}/AlfrescoPostCreate-JBPM-FK-indexes.sql
@@ -136,6 +137,8 @@
+
+
@@ -524,6 +527,21 @@
+
+
+
+
+
+ contentDiskDriver
+
+
+
+
+ org.alfresco.jlan.server.filesys.DiskInterface
+
+
+
+
diff --git a/config/alfresco/bootstrap/webscripts/folder.get.atom.ftl b/config/alfresco/bootstrap/webscripts/folder.get.atom.ftl
index 098fe81dfa..d1df69f7d2 100644
--- a/config/alfresco/bootstrap/webscripts/folder.get.atom.ftl
+++ b/config/alfresco/bootstrap/webscripts/folder.get.atom.ftl
@@ -1,12 +1,12 @@
Alfresco (${server.edition})
- Folder: ${folder.displayPath}/${folder.name}
+ Folder: ${folder.displayPath}/${folder.name?xml}${xmldate(date)}${absurl(url.context)}/images/logo/AlfrescoLogo16.ico
<#list folder.children as child>
- ${child.name}
+ ${child.name?xml}
<#if child.isContainer>
<#else>
@@ -15,10 +15,10 @@
${absurl(url.context)}${child.icon16}urn:uuid:${child.id}${xmldate(child.properties.modified)}
- ${child.properties.description!""}
+ ${child.properties.description?xml!""}
- ${child.properties.creator}
-
+ ${child.properties.creator?xml}
+
#list>
diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml
index 89ed40faf0..3a847ae50e 100644
--- a/config/alfresco/core-services-context.xml
+++ b/config/alfresco/core-services-context.xml
@@ -83,6 +83,10 @@
SYSTEM_PROPERTIES_MODE_NEVER
+
+
+ 6
+
@@ -112,7 +116,7 @@
${alfresco.jgroups.bind_address}
-
+ ${alfresco.jgroups.bind_interface}
@@ -459,6 +463,7 @@
alfresco.messages.content-filter-languagesalfresco.messages.jbpm-engine-messagesalfresco.messages.activiti-engine-messages
+ alfresco.messages.wdr-messages
@@ -1033,12 +1038,18 @@
+
+
+
+
+
+
- opaquelocktoken
- sharedLockTokens
- lockDepth
- lockScope
+ webdav:opaquelocktoken
+ webdav:sharedLockTokens
+ webdav:lockDepth
+ webdav:lockScope
diff --git a/config/alfresco/dao/dao-context.xml b/config/alfresco/dao/dao-context.xml
index 9bae33a44e..95721aa27f 100644
--- a/config/alfresco/dao/dao-context.xml
+++ b/config/alfresco/dao/dao-context.xml
@@ -60,6 +60,8 @@
+
+
diff --git a/config/alfresco/dbscripts/create/org.hibernate.dialect.Dialect/AlfrescoPostCreate-JBPM-FK-indexes.sql b/config/alfresco/dbscripts/create/org.hibernate.dialect.Dialect/AlfrescoPostCreate-JBPM-FK-indexes.sql
new file mode 100644
index 0000000000..c33e74115a
--- /dev/null
+++ b/config/alfresco/dbscripts/create/org.hibernate.dialect.Dialect/AlfrescoPostCreate-JBPM-FK-indexes.sql
@@ -0,0 +1,109 @@
+--
+-- Title: Upgrade to V3.4 - Add indexes for jbpm foreign keys
+-- Database: Generic
+-- Since: V3.4 schema 4204
+-- Author: pavelyur
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+
+CREATE INDEX FK_ACTION_REFACT ON JBPM_ACTION (REFERENCEDACTION_); --(optional)
+CREATE INDEX FK_CRTETIMERACT_TA ON JBPM_ACTION (TIMERACTION_); --(optional)
+CREATE INDEX FK_ACTION_PROCDEF ON JBPM_ACTION (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_ACTION_EVENT ON JBPM_ACTION (EVENT_); --(optional)
+CREATE INDEX FK_ACTION_ACTNDEL ON JBPM_ACTION (ACTIONDELEGATION_); --(optional)
+CREATE INDEX FK_ACTION_EXPTHDL ON JBPM_ACTION(EXCEPTIONHANDLER_); --(optional)
+CREATE INDEX FK_BYTEARR_FILDEF ON JBPM_BYTEARRAY (FILEDEFINITION_); --(optional)
+CREATE INDEX FK_BYTEBLOCK_FILE ON JBPM_BYTEBLOCK (PROCESSFILE_); --(optional)
+CREATE INDEX FK_COMMENT_TOKEN ON JBPM_COMMENT (TOKEN_); --(optional)
+CREATE INDEX FK_COMMENT_TSK ON JBPM_COMMENT (TASKINSTANCE_); --(optional)
+CREATE INDEX FK_DECCOND_DEC ON JBPM_DECISIONCONDITIONS (DECISION_); --(optional)
+CREATE INDEX FK_DELEGATION_PRCD ON JBPM_DELEGATION (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_EVENT_PROCDEF ON JBPM_EVENT (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_EVENT_TRANS ON JBPM_EVENT (TRANSITION_); --(optional)
+CREATE INDEX FK_EVENT_NODE ON JBPM_EVENT (NODE_); --(optional)
+CREATE INDEX FK_EVENT_TASK ON JBPM_EVENT (TASK_); --(optional)
+CREATE INDEX FK_JOB_PRINST ON JBPM_JOB (PROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_JOB_ACTION ON JBPM_JOB (ACTION_); --(optional)
+CREATE INDEX FK_JOB_TOKEN ON JBPM_JOB (TOKEN_); --(optional)
+CREATE INDEX FK_JOB_NODE ON JBPM_JOB (NODE_); --(optional)
+CREATE INDEX FK_JOB_TSKINST ON JBPM_JOB (TASKINSTANCE_); --(optional)
+CREATE INDEX FK_LOG_SOURCENODE ON JBPM_LOG (SOURCENODE_); --(optional)
+CREATE INDEX FK_LOG_DESTNODE ON JBPM_LOG (DESTINATIONNODE_); --(optional)
+CREATE INDEX FK_LOG_TOKEN ON JBPM_LOG (TOKEN_); --(optional)
+CREATE INDEX FK_LOG_TRANSITION ON JBPM_LOG (TRANSITION_); --(optional)
+CREATE INDEX FK_LOG_TASKINST ON JBPM_LOG (TASKINSTANCE_); --(optional)
+CREATE INDEX FK_LOG_CHILDTOKEN ON JBPM_LOG (CHILD_); --(optional)
+CREATE INDEX FK_LOG_OLDBYTES ON JBPM_LOG (OLDBYTEARRAY_); --(optional)
+CREATE INDEX FK_LOG_SWIMINST ON JBPM_LOG (SWIMLANEINSTANCE_); --(optional)
+CREATE INDEX FK_LOG_NEWBYTES ON JBPM_LOG (NEWBYTEARRAY_); --(optional)
+CREATE INDEX FK_LOG_ACTION ON JBPM_LOG (ACTION_); --(optional)
+CREATE INDEX FK_LOG_VARINST ON JBPM_LOG (VARIABLEINSTANCE_); --(optional)
+CREATE INDEX FK_LOG_NODE ON JBPM_LOG (NODE_); --(optional)
+CREATE INDEX FK_LOG_PARENT ON JBPM_LOG (PARENT_); --(optional)
+CREATE INDEX FK_MODDEF_PROCDEF ON JBPM_MODULEDEFINITION (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_TSKDEF_START ON JBPM_MODULEDEFINITION (STARTTASK_); --(optional)
+CREATE INDEX FK_MODINST_PRCINST ON JBPM_MODULEINSTANCE (PROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_TASKMGTINST_TMD ON JBPM_MODULEINSTANCE (TASKMGMTDEFINITION_); --(optional)
+CREATE INDEX FK_DECISION_DELEG ON JBPM_NODE (DECISIONDELEGATION); --(optional)
+CREATE INDEX FK_NODE_PROCDEF ON JBPM_NODE (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_NODE_ACTION ON JBPM_NODE (ACTION_); --(optional)
+CREATE INDEX FK_PROCST_SBPRCDEF ON JBPM_NODE (SUBPROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_NODE_SCRIPT ON JBPM_NODE (SCRIPT_); --(optional)
+CREATE INDEX FK_NODE_SUPERSTATE ON JBPM_NODE (SUPERSTATE_); --(optional)
+CREATE INDEX FK_POOLEDACTOR_SLI ON JBPM_POOLEDACTOR (SWIMLANEINSTANCE_); --(optional)
+CREATE INDEX FK_PROCDEF_STRTSTA ON JBPM_PROCESSDEFINITION (STARTSTATE_); --(optional)
+CREATE INDEX FK_PROCIN_PROCDEF ON JBPM_PROCESSINSTANCE (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_PROCIN_ROOTTKN ON JBPM_PROCESSINSTANCE (ROOTTOKEN_); --(optional)
+CREATE INDEX FK_PROCIN_SPROCTKN ON JBPM_PROCESSINSTANCE (SUPERPROCESSTOKEN_); --(optional)
+CREATE INDEX FK_RTACTN_PROCINST ON JBPM_RUNTIMEACTION (PROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_RTACTN_ACTION ON JBPM_RUNTIMEACTION (ACTION_); --(optional)
+CREATE INDEX FK_SWL_ASSDEL ON JBPM_SWIMLANE (ASSIGNMENTDELEGATION_); --(optional)
+CREATE INDEX FK_SWL_TSKMGMTDEF ON JBPM_SWIMLANE (TASKMGMTDEFINITION_); --(optional)
+CREATE INDEX FK_SWIMLANEINST_TM ON JBPM_SWIMLANEINSTANCE (TASKMGMTINSTANCE_); --(optional)
+CREATE INDEX FK_SWIMLANEINST_SL ON JBPM_SWIMLANEINSTANCE (SWIMLANE_); --(optional)
+CREATE INDEX FK_TASK_STARTST ON JBPM_TASK (STARTSTATE_); --(optional)
+CREATE INDEX FK_TASK_PROCDEF ON JBPM_TASK (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_TASK_ASSDEL ON JBPM_TASK (ASSIGNMENTDELEGATION_); --(optional)
+CREATE INDEX FK_TASK_SWIMLANE ON JBPM_TASK (SWIMLANE_); --(optional)
+CREATE INDEX FK_TASK_TASKNODE ON JBPM_TASK (TASKNODE_); --(optional)
+CREATE INDEX FK_TASK_TASKMGTDEF ON JBPM_TASK (TASKMGMTDEFINITION_); --(optional)
+CREATE INDEX FK_TSK_TSKCTRL ON JBPM_TASK (TASKCONTROLLER_); --(optional)
+CREATE INDEX FK_TASKACTPL_TSKI ON JBPM_TASKACTORPOOL (TASKINSTANCE_); --(optional)
+CREATE INDEX FK_TSKACTPOL_PLACT ON JBPM_TASKACTORPOOL (POOLEDACTOR_); --(optional)
+CREATE INDEX FK_TSKCTRL_DELEG ON JBPM_TASKCONTROLLER (TASKCONTROLLERDELEGATION_); --(optional)
+CREATE INDEX FK_TSKINS_PRCINS ON JBPM_TASKINSTANCE (PROCINST_); --(optional)
+CREATE INDEX FK_TASKINST_TMINST ON JBPM_TASKINSTANCE (TASKMGMTINSTANCE_); --(optional)
+CREATE INDEX FK_TASKINST_TOKEN ON JBPM_TASKINSTANCE (TOKEN_); --(optional)
+CREATE INDEX FK_TASKINST_SLINST ON JBPM_TASKINSTANCE (SWIMLANINSTANCE_); --(optional)
+CREATE INDEX FK_TASKINST_TASK ON JBPM_TASKINSTANCE (TASK_); --(optional)
+CREATE INDEX FK_TOKEN_SUBPI ON JBPM_TOKEN (SUBPROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_TOKEN_PROCINST ON JBPM_TOKEN (PROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_TOKEN_NODE ON JBPM_TOKEN (NODE_); --(optional)
+CREATE INDEX FK_TOKEN_PARENT ON JBPM_TOKEN (PARENT_); --(optional)
+CREATE INDEX FK_TKVARMAP_TOKEN ON JBPM_TOKENVARIABLEMAP (TOKEN_); --(optional)
+CREATE INDEX FK_TKVARMAP_CTXT ON JBPM_TOKENVARIABLEMAP (CONTEXTINSTANCE_); --(optional)
+CREATE INDEX FK_TRANSITION_FROM ON JBPM_TRANSITION (FROM_); --(optional)
+CREATE INDEX FK_TRANS_PROCDEF ON JBPM_TRANSITION (PROCESSDEFINITION_); --(optional)
+CREATE INDEX FK_TRANSITION_TO ON JBPM_TRANSITION (TO_); --(optional)
+CREATE INDEX FK_VARACC_PROCST ON JBPM_VARIABLEACCESS (PROCESSSTATE_); --(optional)
+CREATE INDEX FK_VARACC_SCRIPT ON JBPM_VARIABLEACCESS (SCRIPT_); --(optional)
+CREATE INDEX FK_VARACC_TSKCTRL ON JBPM_VARIABLEACCESS (TASKCONTROLLER_); --(optional)
+CREATE INDEX FK_VARINST_PRCINST ON JBPM_VARIABLEINSTANCE (PROCESSINSTANCE_); --(optional)
+CREATE INDEX FK_VARINST_TKVARMP ON JBPM_VARIABLEINSTANCE (TOKENVARIABLEMAP_); --(optional)
+CREATE INDEX FK_VARINST_TK ON JBPM_VARIABLEINSTANCE (TOKEN_); --(optional)
+CREATE INDEX FK_BYTEINST_ARRAY ON JBPM_VARIABLEINSTANCE (BYTEARRAYVALUE_); --(optional)
+CREATE INDEX FK_VAR_TSKINST ON JBPM_VARIABLEINSTANCE (TASKINSTANCE_); --(optional)
+
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-JBPM-FK-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-JBPM-FK-indexes', 'Manually executed script upgrade to add FK indexes for JBPM',
+ 0, 4305, -1, 4306, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
+ );
diff --git a/config/alfresco/dbscripts/create/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoPostCreate-JBPM-FK-indexes.sql b/config/alfresco/dbscripts/create/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoPostCreate-JBPM-FK-indexes.sql
new file mode 100644
index 0000000000..3df4d6fd47
--- /dev/null
+++ b/config/alfresco/dbscripts/create/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoPostCreate-JBPM-FK-indexes.sql
@@ -0,0 +1,22 @@
+--
+-- Title: Upgrade to V3.4 - Add indexes for jbpm foreign keys
+-- Database: MySQL
+-- Since: V3.4 schema 4204
+-- Author: pavelyur
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+
+-- do nothing for mysql
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-JBPM-FK-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-JBPM-FK-indexes', 'Manually executed script upgrade to add FK indexes for JBPM',
+ 0, 4305, -1, 4306, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
+ );
diff --git a/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/AVM-rename-dupes.sql b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/AVM-rename-dupes.sql
index d3993eb90f..1e90dfaee7 100644
--- a/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/AVM-rename-dupes.sql
+++ b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/AVM-rename-dupes.sql
@@ -27,17 +27,17 @@ FROM
LOWER(ce.name) = entities.lname AND
ce.child_id != entities.max_child_id;
-UPDATE avm_child_entries
- SET name = name || '-renamed.duplicate.mark-' || child_id || '.temp'
+UPDATE avm_child_entries ce
+ SET name = ce.name || '-renamed.duplicate.mark-' || ce.child_id || '.temp'
WHERE EXISTS
(SELECT
1
FROM
avm_tmp_child_entries tmp
WHERE
- parent_id = tmp.parent_id AND
- name = tmp.name AND
- child_id = tmp.child_id);
+ ce.parent_id = tmp.parent_id AND
+ ce.name = tmp.name AND
+ ce.child_id = tmp.child_id);
--ASSIGN:update_count=value
SELECT
diff --git a/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/varchar-field-sizes-quadruple-increasing.sql b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/varchar-field-sizes-quadruple-increasing.sql
new file mode 100644
index 0000000000..29bd0ec2e6
--- /dev/null
+++ b/config/alfresco/dbscripts/upgrade/3.4/org.hibernate.dialect.Dialect/varchar-field-sizes-quadruple-increasing.sql
@@ -0,0 +1,21 @@
+--
+-- Title: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+-- Database: Generic
+-- Since: V3.4
+-- Author: Dmitry Velichkevich
+--
+-- Please contact support@alfresco.com if you need assistance with the upgrade.
+--
+-- ALF-4300: DB2: Review schema (eg. VARCHAR columns) with respect to multi-byte support (when using DB2 / UTF-8)
+
+--
+-- Record script finish
+--
+DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-VarcharFieldSizesQuadrupleIncreasing';
+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-VarcharFieldSizesQuadrupleIncreasing', 'Increasing VARCHAR field sizes quadruply for DB2 dialect V3.4',
+ 0, 4303, -1, 4304, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
+);
diff --git a/config/alfresco/form-services-context.xml b/config/alfresco/form-services-context.xml
index c65d96e587..09043d09e8 100644
--- a/config/alfresco/form-services-context.xml
+++ b/config/alfresco/form-services-context.xml
@@ -159,9 +159,8 @@
parent="baseFormProcessor">
-
- workflow
-
+
+
-
- task
-
+
+
diff --git a/config/alfresco/hibernate-context.xml b/config/alfresco/hibernate-context.xml
index 6b7f56290c..b7122deeef 100644
--- a/config/alfresco/hibernate-context.xml
+++ b/config/alfresco/hibernate-context.xml
@@ -67,6 +67,7 @@
org/alfresco/repo/workflow/jbpm/jbpm.Join.hbm.xmlorg/jbpm/graph/node/State.hbm.xmlorg/jbpm/graph/node/TaskNode.hbm.xml
+ org/alfresco/repo/workflow/jbpm/jbpm.TaskNode.hbm.xmlorg/jbpm/context/def/ContextDefinition.hbm.xmlorg/jbpm/context/def/VariableAccess.hbm.xmlorg/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml
@@ -98,6 +99,7 @@
org/jbpm/job/Timer.hbm.xmlorg/alfresco/repo/workflow/jbpm/jbpm.Timer.hbm.xmlorg/jbpm/job/ExecuteNodeJob.hbm.xml
+ org/alfresco/repo/workflow/jbpm/jbpm.ExecuteNodeJob.hbm.xmlorg/jbpm/job/ExecuteActionJob.hbm.xmlorg/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xmlorg/jbpm/taskmgmt/exe/TaskInstance.hbm.xml
diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/patch-common-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/patch-common-SqlMap.xml
index 87273d4cea..6178837e5d 100644
--- a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/patch-common-SqlMap.xml
+++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/patch-common-SqlMap.xml
@@ -79,6 +79,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -359,6 +374,138 @@
and (lower(ce.name) = entities.lname)
order by
parent_id, lower(name), child_id
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/alfresco/invitation-service-context.xml b/config/alfresco/invitation-service-context.xml
index 7d4bf14161..4cf49594c5 100644
--- a/config/alfresco/invitation-service-context.xml
+++ b/config/alfresco/invitation-service-context.xml
@@ -10,6 +10,7 @@
+
@@ -70,4 +71,4 @@
-
\ No newline at end of file
+
diff --git a/config/alfresco/jbpm-context.xml b/config/alfresco/jbpm-context.xml
index 4c029ab307..96287e2982 100644
--- a/config/alfresco/jbpm-context.xml
+++ b/config/alfresco/jbpm-context.xml
@@ -6,7 +6,7 @@
-
+ $ : {0}\u3067\u3059"
-invitation.invite.already_member="\u30e6\u30fc\u30b6{0}\u306f\u3059\u3067\u306b{1}\u306e\u30e1\u30f3\u30d0\u3067\u3059\u3002\u3082\u3046\u4e00\u5ea6\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093"
-invitation.cancel.not_site_manager="\u73fe\u5728\u306e\u30e6\u30fc\u30b6{0}\u306f\u3001\u62db\u5f85{1}\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093\u3002\u30b5\u30a4\u30c8{2}\u306e\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u3067\u306f\u3042\u308a\u307e\u305b\u3093"
-invitation.invite.not_site_manager="\u73fe\u5728\u306e\u30e6\u30fc\u30b6{0}\u306f\u3001\u30b5\u30a4\u30c8{1}\u306e\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u3067\u306f\u3042\u308a\u307e\u305b\u3093"
-invitation.invite.unable_generate_id="\u88ab\u62db\u5f85\u8005\u306e\u30e6\u30fc\u30b6\u540d\u3092\u751f\u6210\u3067\u304d\u307e\u305b\u3093\u3002\u540d: {0}\u3001\u59d3: {1}\u3001E\u30e1\u30fc\u30eb: {2}\u3068\u3044\u3046\u4ed6\u306e\u4eba\u306b\u307e\u3060\u5c5e\u3057\u3066\u3044\u307e\u305b\u3093"
-invitation.invite.already_finished="\u62db\u5f85{0}\u306f\u3001\u3059\u3067\u306b\u627f\u8afe\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3001\u307e\u305f\u306f\u5374\u4e0b\u3055\u308c\u3066\u3044\u307e\u3059"
-invitation.invite.authentication_chain="\u8a8d\u8a3c\u9023\u9396\u306b\u3088\u308a\u3001\u65b0\u3057\u3044\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u4f5c\u6210\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093"
+invitation.error.noworkflow="\u62DB\u5F85\u306E\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u540D: {0}"
+invitation.error.not_found="\u62DB\u5F85\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u62DB\u5F85ID: {0}"
+invitation.error.invalid_inviteId_format="\u62DB\u5F85ID\u304C\u7121\u52B9\u306A\u5F62\u5F0F\u3067\u3059\u3002\u6709\u52B9\u306A\u5F62\u5F0F\u306F$ : {0}\u3067\u3059"
+invitation.invite.already_member="\u30E6\u30FC\u30B6{0}\u306F\u3059\u3067\u306B{1}\u306E\u30E1\u30F3\u30D0\u3067\u3059\u3002\u3082\u3046\u4E00\u5EA6\u62DB\u5F85\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"
+invitation.cancel.not_site_manager="\u73FE\u5728\u306E\u30E6\u30FC\u30B6{0}\u306F\u3001\u62DB\u5F85{1}\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3067\u304D\u307E\u305B\u3093\u3002\u30B5\u30A4\u30C8{2}\u306E\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3067\u306F\u3042\u308A\u307E\u305B\u3093"
+invitation.invite.not_site_manager="\u73FE\u5728\u306E\u30E6\u30FC\u30B6{0}\u306F\u3001\u30B5\u30A4\u30C8{1}\u306E\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3067\u306F\u3042\u308A\u307E\u305B\u3093"
+invitation.invite.unable_generate_id="\u88AB\u62DB\u5F85\u8005\u306E\u30E6\u30FC\u30B6\u540D\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093\u3002\u540D: {0}\u3001\u59D3: {1}\u3001E\u30E1\u30FC\u30EB: {2}\u3068\u3044\u3046\u4ED6\u306E\u4EBA\u306B\u307E\u3060\u5C5E\u3057\u3066\u3044\u307E\u305B\u3093"
+invitation.invite.already_finished="\u62DB\u5F85{0}\u306F\u3001\u3059\u3067\u306B\u627F\u8AFE\u3001\u30AD\u30E3\u30F3\u30BB\u30EB\u3001\u307E\u305F\u306F\u5374\u4E0B\u3055\u308C\u3066\u3044\u307E\u3059"
+invitation.invite.authentication_chain="\u8A8D\u8A3C\u9023\u9396\u306B\u3088\u308A\u3001\u65B0\u3057\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4F5C\u6210\u304C\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093"
# InviteSender messages
-invitation.invitesender.email.subject=Alfresco {0}: \u3042\u306a\u305f\u306f\u3001{1}\u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u306b\u62db\u5f85\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-invitation.invitesender.email.role.SiteManager=\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3
-invitation.invitesender.email.role.SiteCollaborator=\u30b5\u30a4\u30c8\u5171\u540c\u4f5c\u696d\u8005
-invitation.invitesender.email.role.SiteContributor=\u30b5\u30a4\u30c8\u30fb\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf
-invitation.invitesender.email.role.SiteConsumer=\u30b5\u30a4\u30c8\u30fb\u30b2\u30b9\u30c8
+invitation.invitesender.email.subject={0}\u30B5\u30A4\u30C8\u3078\u306E\u53C2\u52A0\u306E\u62DB\u5F85
+invitation.invitesender.email.role.SiteManager=\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3
+invitation.invitesender.email.role.SiteCollaborator=\u30B5\u30A4\u30C8\u5171\u540C\u4F5C\u696D\u8005
+invitation.invitesender.email.role.SiteContributor=\u30B5\u30A4\u30C8\u30FB\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30BF
+invitation.invitesender.email.role.SiteConsumer=\u30B5\u30A4\u30C8\u30FB\u30B2\u30B9\u30C8
# Invitation workflow task description
-invitation.nominated.workflow.description={0}\u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u306e\u62db\u5f85
-invitation.moderated.workflow.description={0}\u30b5\u30a4\u30c8\u3078\u306e\u53c2\u52a0\u306e\u8981\u6c42
-
-# Person Notification messages
-invitation.notification.person.email.subject=Alfresco {0}: \u65b0\u3057\u3044\u30a2\u30ab\u30a6\u30f3\u30c8
+invitation.nominated.workflow.description={0}\u30B5\u30A4\u30C8\u3078\u306E\u53C2\u52A0\u306E\u62DB\u5F85
+invitation.moderated.workflow.description={0}\u30B5\u30A4\u30C8\u3078\u306E\u53C2\u52A0\u306E\u8981\u6C42
diff --git a/config/alfresco/messages/patch-service.properties b/config/alfresco/messages/patch-service.properties
index 906ba4a08d..4c25b11f7e 100644
--- a/config/alfresco/messages/patch-service.properties
+++ b/config/alfresco/messages/patch-service.properties
@@ -383,6 +383,8 @@ patch.actions.scheduledfolder.description=Creates the scheduled actions folder i
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
@@ -399,4 +401,7 @@ patch.htmlNotificationMailTemplates.description=Adds HTML email templates for no
patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
+
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/patch-service_de.properties b/config/alfresco/messages/patch-service_de.properties
index bb49df60e8..fcc7939517 100755
--- a/config/alfresco/messages/patch-service_de.properties
+++ b/config/alfresco/messages/patch-service_de.properties
@@ -383,20 +383,13 @@ patch.actions.scheduledfolder.description=Creates the scheduled actions folder i
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance
patch.fixUserQNames.result=Generated qnames for {0} users.
-patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts
-patch.newUserEmailTemplates.created=Email templates added: {0}
-
-patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site
-patch.inviteEmailTemplates.created=Email templates added: {0}
-
-patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content
-
-patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/patch-service_es.properties b/config/alfresco/messages/patch-service_es.properties
index bb49df60e8..fcc7939517 100755
--- a/config/alfresco/messages/patch-service_es.properties
+++ b/config/alfresco/messages/patch-service_es.properties
@@ -383,20 +383,13 @@ patch.actions.scheduledfolder.description=Creates the scheduled actions folder i
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance
patch.fixUserQNames.result=Generated qnames for {0} users.
-patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts
-patch.newUserEmailTemplates.created=Email templates added: {0}
-
-patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site
-patch.inviteEmailTemplates.created=Email templates added: {0}
-
-patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content
-
-patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/patch-service_fr.properties b/config/alfresco/messages/patch-service_fr.properties
index bb49df60e8..fcc7939517 100755
--- a/config/alfresco/messages/patch-service_fr.properties
+++ b/config/alfresco/messages/patch-service_fr.properties
@@ -383,20 +383,13 @@ patch.actions.scheduledfolder.description=Creates the scheduled actions folder i
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance
patch.fixUserQNames.result=Generated qnames for {0} users.
-patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts
-patch.newUserEmailTemplates.created=Email templates added: {0}
-
-patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site
-patch.inviteEmailTemplates.created=Email templates added: {0}
-
-patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content
-
-patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/patch-service_it.properties b/config/alfresco/messages/patch-service_it.properties
index bb49df60e8..31c276b5e9 100755
--- a/config/alfresco/messages/patch-service_it.properties
+++ b/config/alfresco/messages/patch-service_it.properties
@@ -382,6 +382,9 @@ patch.transfer.targetrule.description=Creates the transfer target rule for the d
patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary.
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+<<<<<<< .working
+
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
@@ -389,14 +392,5 @@ patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance
patch.fixUserQNames.result=Generated qnames for {0} users.
-patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts
-patch.newUserEmailTemplates.created=Email templates added: {0}
-
-patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site
-patch.inviteEmailTemplates.created=Email templates added: {0}
-
-patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content
-
-patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/patch-service_ja.properties b/config/alfresco/messages/patch-service_ja.properties
index bb49df60e8..fcc7939517 100755
--- a/config/alfresco/messages/patch-service_ja.properties
+++ b/config/alfresco/messages/patch-service_ja.properties
@@ -383,20 +383,13 @@ patch.actions.scheduledfolder.description=Creates the scheduled actions folder i
patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema
+patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect
+
patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier
patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier
patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance
patch.fixUserQNames.result=Generated qnames for {0} users.
-patch.newUserEmailTemplates.description=Adds the email templates for notifying new users of their accounts
-patch.newUserEmailTemplates.created=Email templates added: {0}
-
-patch.inviteEmailTemplates.description=Adds the email templates for inviting users to a Site
-patch.inviteEmailTemplates.created=Email templates added: {0}
-
-patch.htmlNotificationMailTemplates.description=Adds HTML email templates for notifying users of new content
-
-patch.imapSpacesLocaleTemplates.description=Adds content templates for IMAP clients (Non-default locales only)
-
-patch.exampleJavaScript.description=Loads sample Javascript file into datadictionary scripts folder
\ No newline at end of file
+patch.fixAclInheritance.description=Fixes any ACL inheritance issues.
+patch.fixAclInheritance.result=Fixed {0} ACLs.
diff --git a/config/alfresco/messages/site-service_de.properties b/config/alfresco/messages/site-service_de.properties
index 1d1498c435..22f65ca0b5 100755
--- a/config/alfresco/messages/site-service_de.properties
+++ b/config/alfresco/messages/site-service_de.properties
@@ -9,4 +9,4 @@ site_service.do_not_remove_manager=Eine Site ben\u00f6tigt mindestens einen Site
site_service.can_not_remove_membership=Der aktuelle Benutzer verf\u00fcgt nicht \u00fcber ausreichend Berechtigungen, um Mitgliedschaftsdetails der Site {0} zu l\u00f6schen.
site_service.do_not_change_manager=Eine Site ben\u00f6tigt mindestens einen Site Manager. Sie k\u00f6nnen die Rolle von {0} nicht \u00e4ndern, da sie derzeit die einzigen Site Manager sind.
site_service.can_not_change_membership=Der aktuelle Benutzer verf\u00fcgt nicht \u00fcber die Berechtigungen, um Mitgliedschaftsdetails der Site {0} zu \u00e4ndern.
-site_service.site_container_not_folder=Site Container {0} bezieht sich nicht auf einen Ordner.
\ No newline at end of file
+site_service.site_container_not_folder=Site Container {0} bezieht sich nicht auf einen Ordner.
diff --git a/config/alfresco/messages/site-service_fr.properties b/config/alfresco/messages/site-service_fr.properties
index 2b438ff82a..2134c161f4 100755
--- a/config/alfresco/messages/site-service_fr.properties
+++ b/config/alfresco/messages/site-service_fr.properties
@@ -8,5 +8,5 @@ site_service.site_no_exist=Le site {0} n''existe pas.
site_service.do_not_remove_manager=Un site n\u00e9cessite au moins un gestionnaire de site. Vous ne pouvez pas retirer \u00e0 {0} l''acc\u00e8s au site car il s''agit du seul gestionnaire du site.
site_service.can_not_remove_membership=L''utilisateur actuel ne dispose pas des permissions suffisantes pour supprimer les d\u00e9tails d''appartenance du site {0}.
site_service.do_not_change_manager=Un site n\u00e9cessite au moins un gestionnaire de site. Vous ne pouvez pas modifier le r\u00f4le de {0} car il s''agit du seul gestionnaire du site.
-site_service.can_not_change_membership=L''utilisateur actuel ne dispose pas des permissions suffisantes pour modifier les d\u00e9tails d''appartenance du site {0}.
+site_service.can_not_change_membership=L''utilisateur actuel ne dispose pas des permissions suffisantes pour supprimer les d\u00e9tails d''appartenance du site {0}.
site_service.site_container_not_folder=Le conteneur de site {0} ne se r\u00e9f\u00e8re pas \u00e0 un dossier.
\ No newline at end of file
diff --git a/config/alfresco/messages/site-service_it.properties b/config/alfresco/messages/site-service_it.properties
index ac1c4b2067..f61d98003e 100755
--- a/config/alfresco/messages/site-service_it.properties
+++ b/config/alfresco/messages/site-service_it.properties
@@ -9,4 +9,4 @@ site_service.do_not_remove_manager=Un sito deve avere almeno un manager. Non \u
site_service.can_not_remove_membership=L''utente attuale non dispone di permessi sufficienti per eliminare i dettagli delle appartenenze del sito {0}.
site_service.do_not_change_manager=Un sito deve avere almeno un manager. Non \u00e8 possibile cambiare il ruolo di {0} perch\u00e9 attualmente \u00e8 l''unico manager.
site_service.can_not_change_membership=L''utente attuale non dispone di permessi per modificare i dettagli delle appartenenze del sito {0}.
-site_service.site_container_not_folder=Il contenitore del sito {0} non referenzia una cartella.
\ No newline at end of file
+site_service.site_container_not_folder=Il contenitore del sito {0} non referenzia una cartella.
diff --git a/config/alfresco/messages/site-service_ja.properties b/config/alfresco/messages/site-service_ja.properties
index 1e01c593cb..a33dd2f0fc 100755
--- a/config/alfresco/messages/site-service_ja.properties
+++ b/config/alfresco/messages/site-service_ja.properties
@@ -1,12 +1,12 @@
# Site service externalised display strings
-site_service.unable_to_create=\u30b5\u30a4\u30c8\u7701\u7565\u540d {0} \u304c\u3059\u3067\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u30b5\u30a4\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 \u30b5\u30a4\u30c8\u7701\u7565\u540d\u306f\u56fa\u6709\u306e\u3082\u306e\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-site_service.visibility_group_missing=\u516c\u958b\u30ec\u30d9\u30eb\u30b0\u30eb\u30fc\u30d7 {0} \u304c\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u30b5\u30a4\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-site_service.can_not_update=\u30b5\u30a4\u30c8 {0} \u304c\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3002
-site_service.can_not_delete=\u30b5\u30a4\u30c8 {0} \u304c\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002
-site_service.site_no_exist=\u30b5\u30a4\u30c8 {0} \u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
-site_service.do_not_remove_manager=\u30b5\u30a4\u30c8\u306b\u306f\u3001\u5c11\u306a\u304f\u3068\u30821\u4eba\u306e\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u5fc5\u8981\u3067\u3059\u3002 \u73fe\u57281\u4eba\u3057\u304b\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u3044\u306a\u3044\u305f\u3081\u3001\u30b5\u30a4\u30c8\u4f1a\u54e1\u304b\u3089 {0} \u3092\u53d6\u308a\u5916\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002
-site_service.can_not_remove_membership=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u306b\u306f\u3001\u30b5\u30a4\u30c8 {0} \u306e\u4f1a\u54e1\u8a73\u7d30\u3092\u524a\u9664\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-site_service.do_not_change_manager=\u30b5\u30a4\u30c8\u306b\u306f\u3001\u5c11\u306a\u304f\u3068\u30821\u4eba\u306e\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u5fc5\u8981\u3067\u3059\u3002 \u73fe\u57281\u4eba\u3057\u304b\u30b5\u30a4\u30c8\u30fb\u30de\u30cd\u30fc\u30b8\u30e3\u304c\u3044\u306a\u3044\u305f\u3081\u3001{0} \u306e\u5f79\u5272\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002
-site_service.can_not_change_membership=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u306b\u306f\u3001\u30b5\u30a4\u30c8 {0} \u306e\u4f1a\u54e1\u8a73\u7d30\u3092\u5909\u66f4\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-site_service.site_container_not_folder=\u30b5\u30a4\u30c8\u30b3\u30f3\u30c6\u30ca {0} \u304c\u30d5\u30a9\u30eb\u30c0\u3092\u53c2\u7167\u3057\u3066\u3044\u307e\u305b\u3093\u3002
\ No newline at end of file
+site_service.unable_to_create=\u30B5\u30A4\u30C8\u7701\u7565\u540D {0} \u304C\u3059\u3067\u306B\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u30B5\u30A4\u30C8\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002 \u30B5\u30A4\u30C8\u7701\u7565\u540D\u306F\u56FA\u6709\u306E\u3082\u306E\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002
+site_service.visibility_group_missing=\u516C\u958B\u30EC\u30D9\u30EB\u30B0\u30EB\u30FC\u30D7 {0} \u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u3001\u30B5\u30A4\u30C8\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002
+site_service.can_not_update=\u30B5\u30A4\u30C8 {0} \u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u3001\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3002
+site_service.can_not_delete=\u30B5\u30A4\u30C8 {0} \u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u3001\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002
+site_service.site_no_exist=\u30B5\u30A4\u30C8 {0} \u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
+site_service.do_not_remove_manager=\u30B5\u30A4\u30C8\u306B\u306F\u3001\u5C11\u306A\u304F\u3068\u30821\u4EBA\u306E\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u304C\u5FC5\u8981\u3067\u3059\u3002 \u73FE\u57281\u4EBA\u3057\u304B\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u304C\u3044\u306A\u3044\u305F\u3081\u3001\u30B5\u30A4\u30C8\u4F1A\u54E1\u304B\u3089 {0} \u3092\u53D6\u308A\u5916\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002
+site_service.can_not_remove_membership=\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u306B\u306F\u3001\u30B5\u30A4\u30C8 {0} \u306E\u4F1A\u54E1\u8A73\u7D30\u3092\u524A\u9664\u3059\u308B\u305F\u3081\u306E\u5341\u5206\u306A\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002
+site_service.do_not_change_manager=\u30B5\u30A4\u30C8\u306B\u306F\u3001\u5C11\u306A\u304F\u3068\u30821\u4EBA\u306E\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u304C\u5FC5\u8981\u3067\u3059\u3002 \u73FE\u57281\u4EBA\u3057\u304B\u30B5\u30A4\u30C8\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u304C\u3044\u306A\u3044\u305F\u3081\u3001{0} \u306E\u5F79\u5272\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002
+site_service.can_not_change_membership=\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u306B\u306F\u3001\u30B5\u30A4\u30C8 {0} \u306E\u4F1A\u54E1\u8A73\u7D30\u3092\u5909\u66F4\u3059\u308B\u305F\u3081\u306E\u5341\u5206\u306A\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002
+site_service.site_container_not_folder=\u30B5\u30A4\u30C8\u30B3\u30F3\u30C6\u30CA {0} \u304C\u30D5\u30A9\u30EB\u30C0\u3092\u53C2\u7167\u3057\u3066\u3044\u307E\u305B\u3093\u3002
diff --git a/config/alfresco/messages/transfer-model_fr.properties b/config/alfresco/messages/transfer-model_fr.properties
index 5b236734af..726e26fd40 100644
--- a/config/alfresco/messages/transfer-model_fr.properties
+++ b/config/alfresco/messages/transfer-model_fr.properties
@@ -1,84 +1,86 @@
-# Display labels for Transfer Model
-
-trx_applicationmodel.description=Mod\u00e8le d'application de transfert Alfresco
-
-trx_applicationmodel.type.trx_transferGroup.title=Groupe de transfert
-trx_applicationmodel.type.trx_transferGroup.description=D\u00e9finition d'un groupe de transfert
-
-trx_applicationmodel.type.trx_transferLock.title=Verrou de transfert
-trx_applicationmodel.type.trx_transferLock.description=Type de noeud utilis\u00e9 pour repr\u00e9senter le noeud du verrou de transfert
-
-trx_applicationmodel.type.trx_transferRecord.title=Enregistrement de transfert
-trx_applicationmodel.type.trx_transferRecord.description=Type de noeud utilis\u00e9 pour enregistrer des informations de transfert
-
-trx_applicationmodel.type.trx_tempTransferStore.title=Stockage de transfert temporaire
-trx_applicationmodel.type.trx_tempTransferStore.description=Type de noeud utilis\u00e9 pour le stockage de noeuds entrants temporairement orphelins
-
-trx_applicationmodel.type.trx_transferReport.title=Rapport de transfert
-trx_applicationmodel.type.trx_transferReport.description=Rapport de transfert
-
-trx_applicationmodel.type.trx_transferReportDest.title=Rapport de transfert depuis la destination
-trx_applicationmodel.type.trx_transferReportDest.description=Rapport de transfert depuis la destination
-
-trx_applicationmodel.type.trx_transferTarget.title=Cible de transfert
-trx_applicationmodel.type.trx_transferTarget.description=D\u00e9finition d'une cible de transfert
-
-trx_applicationmodel.property.trx_endpointhost.title=H\u00f4te de point d'extr\u00e9mit\u00e9
-trx_applicationmodel.property.trx_endpointhost.description=H\u00f4te de point d'extr\u00e9mit\u00e9
-
-trx_applicationmodel.property.trx_endpointport.title=Port de point d'extr\u00e9mit\u00e9
-trx_applicationmodel.property.trx_endpointport.description=Port de point d'extr\u00e9mit\u00e9
-
-trx_applicationmodel.property.trx_endpointpath.title=Chemin de point d'extr\u00e9mit\u00e9
-trx_applicationmodel.property.trx_endpointpath.description=Chemin de point d'extr\u00e9mit\u00e9
-
-trx_applicationmodel.property.trx_endpointprotocol.title=Protocole de point d'extr\u00e9mit\u00e9
-trx_applicationmodel.property.trx_endpointprotocol.description=Protocole de point d'extr\u00e9mit\u00e9
-
-trx_applicationmodel.property.trx_enabled.title=Activ\u00e9
-trx_applicationmodel.property.trx_enabled.description=Activ\u00e9 ou d\u00e9sactiv\u00e9 ?
-
-trx_applicationmodel.property.trx_username.title=Nom d'utilisateur
-trx_applicationmodel.property.trx_username.description=Nom d'utilisateur
-
-trx_applicationmodel.property.trx_password.title=Mot de passe
-trx_applicationmodel.property.trx_password.description=Mot de passe
-
-trx_applicationmodel.property.trx_progressPosition.title=Position de la progression
-trx_applicationmodel.property.trx_progressPosition.description=Position de la progression
-
-trx_applicationmodel.property.trx_progressEndpoint.title=Point d'extr\u00e9mit\u00e9 de la progression
-trx_applicationmodel.property.trx_progressEndpoint.description=Point d'extr\u00e9mit\u00e9 de la progression
-
-trx_applicationmodel.property.trx_transferStatus.title=Statut de transfert
-trx_applicationmodel.property.trx_transferStatus.description=Statut de transfert
-
-trx_applicationmodel.property.trx_transferError.title=Erreur de transfert
-trx_applicationmodel.property.trx_transferError.description=Erreur de transfert
-
-trx_applicationmodel.property.trx_transferId.title=ID de transfert
-trx_applicationmodel.property.trx_transferId.description=ID de transfert
-
-trx_applicationmodel.property.trx_invadedBy.title=Envahi par
-trx_applicationmodel.property.trx_invadedBy.description=Entrep\u00f4ts ayant envahi ce noeud
-
-trx_applicationmodel.property.trx_repositoryId.title=Entrep\u00f4t source.
-trx_applicationmodel.property.trx_repositoryId.description=ID de l'entrep\u00f4t dont ce noeud est originaire.
-
-trx_applicationmodel.property.trx_fromRepositoryId.title=ID entrep\u00f4t de
-trx_applicationmodel.property.trx_fromContent.description=Adresses URL de contenu transf\u00e9r\u00e9es avec ce noeud
-
-trx_applicationmodel.association.trx_orphan.title=Orphelin de transfert
-trx_applicationmodel.association.trx_orphan.description=Orphelin de transfert
-
-trx_applicationmodel.aspect.trx_transferRelated.title=Li\u00e9 au transfert
-trx_applicationmodel.aspect.trx_transferRelated.description=Les noeuds avec cet aspect sont li\u00e9s \u00e0 un transfert particulier.
-
-trx_applicationmodel.aspect.trx_enableable.title=Activable
-trx_applicationmodel.aspect.trx_enableable.description=Activable
-
-trx_applicationmodel.aspect.trx_transferred.name=Transf\u00e9r\u00e9
-trx_applicationmodel.aspect.trx_transferred.description=Les noeuds avec cet aspect ont \u00e9t\u00e9 transf\u00e9r\u00e9s d'un entrep\u00f4t \u00e0 un autre
-
-trx_applicationmodel.aspect.trx_alien.name=Etranger de transfert
-trx_applicationmodel.aspect.trx_alien.description=Les noeuds avec cet aspect sont des noeuds \u00e9trangers ou ont \u00e9t\u00e9 envahis par d'autres noeuds \u00e9trangers
\ No newline at end of file
+# Display labels for Transfer Model French
+
+trx_applicationmodel.description=Alfresco Transfer Application Model
+
+trx_applicationmodel.type.trx_transferGroup.title=Transfer Group
+trx_applicationmodel.type.trx_transferGroup.description=The definition of a transfer group
+
+trx_applicationmodel.type.trx_transferLock.title=Transfer Lock
+trx_applicationmodel.type.trx_transferLock.description=Node type used to represent the transfer lock node
+
+trx_applicationmodel.type.trx_transferRecord.title=Transfer Record
+trx_applicationmodel.type.trx_transferRecord.description=Node type used to record transfer information
+
+trx_applicationmodel.type.trx_tempTransferStore.title=Temp Transfer Store
+trx_applicationmodel.type.trx_tempTransferStore.description=Node type used for storage of temporarily orphaned incoming nodes
+
+trx_applicationmodel.type.trx_transferReport.title=Transfer Report
+trx_applicationmodel.type.trx_transferReport.description=Transfer Report
+
+trx_applicationmodel.type.trx_transferReportDest.title=Transfer Report From Destination
+trx_applicationmodel.type.trx_transferReportDest.description=Transfer Report From Destination
+
+trx_applicationmodel.type.trx_transferTarget.title=Transfer Target
+trx_applicationmodel.type.trx_transferTarget.description=The definition of a transfer target
+
+trx_applicationmodel.property.trx_endpointhost.title=H\u00f4te de destination
+trx_applicationmodel.property.trx_endpointhost.description=H\u00f4te de destination
+
+trx_applicationmodel.property.trx_endpointport.title=Port de destination
+trx_applicationmodel.property.trx_endpointport.description=Port de destination
+
+trx_applicationmodel.property.trx_endpointpath.title=Chemin de destination
+trx_applicationmodel.property.trx_endpointpath.description=Chemin de destination
+
+trx_applicationmodel.property.trx_endpointprotocol.title=Endpoint Protocol
+trx_applicationmodel.property.trx_endpointprotocol.description=Endpoint Protocol
+
+trx_applicationmodel.property.trx_username.title=Username
+trx_applicationmodel.property.trx_username.description=Username
+
+trx_applicationmodel.property.trx_password.title=Password
+trx_applicationmodel.property.trx_password.description=Password
+
+trx_applicationmodel.property.trx_progressPosition.title=Progress Position
+trx_applicationmodel.property.trx_progressPosition.description=Progress Position
+
+trx_applicationmodel.property.trx_progressEndpoint.title=Progress Endpoint
+trx_applicationmodel.property.trx_progressEndpoint.description=Progress Endpoint
+
+trx_applicationmodel.property.trx_transferStatus.title=Transfer Status
+trx_applicationmodel.property.trx_transferStatus.description=Transfer Status
+
+trx_applicationmodel.property.trx_transferError.title=Transfer Error
+trx_applicationmodel.property.trx_transferError.description=Transfer Error
+
+trx_applicationmodel.property.trx_enabled.title=Enabled
+trx_applicationmodel.property.trx_enabled.description=Is this enabled or disabled
+
+trx_applicationmodel.property.trx_transferId.title=Transfer Id
+trx_applicationmodel.property.trx_transferId.description=Transfer Id
+
+trx_applicationmodel.property.trx_invadedBy.title=Invaded By
+trx_applicationmodel.property.trx_invadedBy.description=The repositories that have invaded this node
+
+trx_applicationmodel.property.trx_repositoryId.title=Source Repository.
+trx_applicationmodel.property.trx_repositoryId.description=The repository id that this node originates from.
+
+trx_applicationmodel.property.trx_fromRepositoryId.title=From Repository Id
+trx_applicationmodel.property.trx_fromContent.description=The content URLs transferred with this node
+
+trx_applicationmodel.association.trx_orphan.title=Transfer Orphan
+trx_applicationmodel.association.trx_orphan.description=Transfer Orphan
+
+trx_applicationmodel.aspect.trx_transferRelated.title=Transfer Related
+trx_applicationmodel.aspect.trx_transferRelated.description=Nodes with this aspect are related to a particular transfer.
+
+trx_applicationmodel.aspect.trx_enableable.title=Enableable
+trx_applicationmodel.aspect.trx_enableable.description=Enableable
+
+trx_applicationmodel.aspect.trx_transferred.name=Transferred
+trx_applicationmodel.aspect.trx_transferred.description=Nodes with this aspect have been transferred from one repository to another
+
+trx_applicationmodel.aspect.trx_alien.name=Transfer Alien
+trx_applicationmodel.aspect.trx_alien.description=Nodes with this aspect are either alien nodes or have been invaded by other alien nodes
+
+
diff --git a/config/alfresco/messages/transfer-service_de.properties b/config/alfresco/messages/transfer-service_de.properties
index 6eaa901b2f..6802916b2f 100755
--- a/config/alfresco/messages/transfer-service_de.properties
+++ b/config/alfresco/messages/transfer-service_de.properties
@@ -8,7 +8,7 @@ transfer_service.target_exists=Kann kein neues \u00dcbertragungsziel mit Namen {
transfer_service.comms.unsupported_protocol=Nicht unterst\u00fctztes Protokoll: {0}
transfer_service.comms.unsuccessful_response=Von Zielserver erfolglosen Antwort Code erhalten: {0}, {1}
transfer_service.comms.http_request_failed=HTTP Anfrage {0} an Ziel: {1} Status: {2} nicht ausgef\u00fchrt
-transfer_service.incompatible_versions=\u00dcbertragung zwischen nicht kompatiblen Versionen nicht m\u00f6glich, \u00dcbertragungs-ID:{0} von:{1} nach:{2}
+transfer_service.incompatible_versions=\u00dcbertragung zwischen nicht kompatiblen Versionen nicht m\u00f6glich, \u00dcbertragungs-ID: {0} von: {1} nach: {2}
transfer_service.no_nodes=Keine zu \u00fcbertragenden Nodes
transfer_service.target_not_enabled=\u00dcbertragungsziel nicht aktiviert {0}
transfer_service.cancelled=\u00dcbertragung abgebrochen
diff --git a/config/alfresco/messages/transfer-service_fr.properties b/config/alfresco/messages/transfer-service_fr.properties
index d8ac8d4128..2b605ab25b 100755
--- a/config/alfresco/messages/transfer-service_fr.properties
+++ b/config/alfresco/messages/transfer-service_fr.properties
@@ -7,7 +7,7 @@ transfer_service.unable_to_transfer_async=Impossible de transf\u00e9rer de mani\
transfer_service.target_exists=Impossible de cr\u00e9er une cible de transfert portant le nom {0} car une cible porte d\u00e9j\u00e0 ce nom.
transfer_service.comms.unsupported_protocol=Protocole non pris en charge : {0}
transfer_service.comms.unsuccessful_response=Code de r\u00e9ponse infructueuse re\u00e7u depuis le serveur cible : {0}, {1}
-transfer_service.comms.http_request_failed=Echec d''ex\u00e9cution de la requ\u00eate HTTP {0} vers la cible : {1} statut : {2}
+transfer_service.comms.http_request_failed=Echec d'ex\u00e9cution de la requ\u00eate HTTP {0} vers la cible : {1} statut : {2}
transfer_service.incompatible_versions=Transfert impossible entre des versions incompatibles. Identifiant de transfert : {0} de : {1} vers : {2}
transfer_service.no_nodes=Aucun noeud \u00e0 transf\u00e9rer
transfer_service.target_not_enabled=Cible de transfert non activ\u00e9e {0}
diff --git a/config/alfresco/messages/transfer-service_it.properties b/config/alfresco/messages/transfer-service_it.properties
index 7a21a85881..20ae34fbfe 100755
--- a/config/alfresco/messages/transfer-service_it.properties
+++ b/config/alfresco/messages/transfer-service_it.properties
@@ -8,7 +8,7 @@ transfer_service.target_exists=Impossibile creare una nuova destinazione di tras
transfer_service.comms.unsupported_protocol=Protocollo non supportato: {0}
transfer_service.comms.unsuccessful_response=Ricevuto codice di risposta di errore dal server di destinazione: {0}, {1}
transfer_service.comms.http_request_failed=Impossibile eseguire la richiesta HTTP {0} per la destinazione: {1} stato: {2}
-transfer_service.incompatible_versions=Impossibile eseguire il trasferimento tra ID trasferimento di versioni incompatibili:{0} da:{1} a:{2}
+transfer_service.incompatible_versions=Impossibile eseguire il trasferimento tra ID trasferimento di versioni incompatibili: {0} da: {1} a: {2}
transfer_service.no_nodes=Nessun nodo da trasferire
transfer_service.target_not_enabled=Destinazione di trasferimento non abilitata {0}
transfer_service.cancelled=Trasferimento annullato
diff --git a/config/alfresco/messages/transfer-service_ja.properties b/config/alfresco/messages/transfer-service_ja.properties
index 39f3c52d2e..5dfba88df2 100755
--- a/config/alfresco/messages/transfer-service_ja.properties
+++ b/config/alfresco/messages/transfer-service_ja.properties
@@ -1,47 +1,47 @@
# Transfer service externalised display strings
-transfer_service.unable_to_find_transfer_home=\u8ee2\u9001\u30db\u30fc\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093: {0}
-transfer_service.unable_to_find_transfer_group=\u540d\u524d\u3001{0} \u306e\u4ed8\u3044\u305f\u8ee2\u9001\u30b0\u30eb\u30fc\u30d7\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-transfer_service.unable_to_find_transfer_target=\u540d\u524d\u3001{0} \u306e\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-transfer_service.unable_to_transfer_async=\u975e\u540c\u671f\u8ee2\u9001\u304c\u3067\u304d\u307e\u305b\u3093\u3002
-transfer_service.target_exists=\u540d\u524d, {0} \u306e\u4ed8\u3044\u305f\u65b0\u898f\u306e\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002\u305d\u306e\u540d\u524d\u306e\u30bf\u30fc\u30b2\u30c3\u30c8\u304c\u3059\u3067\u306b\u3042\u308a\u307e\u3059\u3002
-transfer_service.comms.unsupported_protocol=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u306a\u3044\u30d7\u30ed\u30c8\u30b3\u30eb: {0}
-transfer_service.comms.unsuccessful_response=\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u30b5\u30fc\u30d0\u304b\u3089\u5931\u6557\u5fdc\u7b54\u3092\u53d7\u3051\u53d6\u308a\u307e\u3057\u305f: {0}, {1}
-transfer_service.comms.http_request_failed=\u30bf\u30fc\u30b2\u30c3\u30c8: {1} \u30b9\u30c6\u30fc\u30bf\u30b9: {2} \u306b\u5bfe\u3059\u308bHTTP\u30ea\u30af\u30a8\u30b9\u30c8 {0} \u306e\u5b9f\u884c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-transfer_service.incompatible_versions=\u4e92\u63db\u6027\u306e\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u8ee2\u9001ID\u9593\u3067\u306f\u8ee2\u9001\u3067\u304d\u307e\u305b\u3093:{0}\u3001{1}\u304b\u3089{2}
-transfer_service.no_nodes=\u8ee2\u9001\u3059\u3079\u304d\u30ce\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-transfer_service.target_not_enabled=\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u304c\u6709\u52b9\u3067\u3042\u308a\u307e\u305b\u3093 {0}
-transfer_service.cancelled=\u8ee2\u9001\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002
-transfer_service.failed_to_get_transfer_status=\u30bf\u30fc\u30b2\u30c3\u30c8 {0}\u304b\u3089\u306e\u8ee2\u9001\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-transfer_service.target_error=\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306f {0} \u3067\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-transfer_service.unknown_target_error=\u4e0d\u660e\u306a\u30a8\u30e9\u30fc
-transfer_service.receiver.no_primary_parent_supplied=\u4e00\u6b21\u89aa\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u8ee2\u9001\u3067\u304d\u307e\u305b\u3093\u3002
-transfer_service.receiver.orphans_exist=\u8ee2\u9001\u3067\u304d\u307e\u305b\u3093\u3002\u5b64\u7acb\u884c\u304c\u5b58\u5728\u3057\u307e\u3059
-transfer_service.receiver.content_file_missing=\u8ee2\u9001\u3067\u304d\u307e\u305b\u3093\u3002\u30b3\u30f3\u30c6\u30f3\u30c4\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-transfer_service.receiver.failed_to_create_staging_folder=\u8ee2\u9001 {0} \u7528\u306e\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f
-transfer_service.receiver.lock_folder_not_found=\u6307\u5b9a\u3057\u305f\u30ed\u30c3\u30af\u30d5\u30a9\u30eb\u30c0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093: {0}
-transfer_service.receiver.temp_folder_not_found=\u8ee2\u9001\u7528\u306b\u6307\u5b9a\u3057\u305f\u4e00\u6642\u30d5\u30a9\u30eb\u30c0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 {0}: {1}
-transfer_service.receiver.lock_unavailable=\u8ee2\u9001\u30ed\u30c3\u30af\u306f\u4ed6\u306e\u30a4\u30f3\u30d0\u30a6\u30f3\u30c9\u8ee2\u9001\u306b\u5bfe\u3057\u3066\u5ba3\u8a00\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u65b0\u305f\u306b\u8ee2\u9001\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3002
-transfer_service.receiver.record_folder_not_found=\u30a4\u30f3\u30d0\u30a6\u30f3\u30c9\u8ee2\u9001\u8a18\u9332\u3092\u4fdd\u6301\u3059\u308b\u7279\u5b9a\u6e08\u30d5\u30a9\u30eb\u30c0\u306e\u767a\u898b\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0}
-transfer_service.receiver.not_lock_owner=\u8ee2\u9001\u30aa\u30da\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u8a66\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u6307\u5b9a\u3057\u305f\u8ee2\u9001\u306b\u3088\u308a\u30ed\u30c3\u30af\u304c\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3067\u3057\u305f: {0}
-transfer_service.receiver.error_ending_transfer=\u8ee2\u9001 ({0}) \u3092\u5b8c\u4e86\u3059\u308b\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u7d50\u679c\u3001\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-transfer_service.receiver.error_staging_snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u8ee2\u9001 {0}\u7528\u306b\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u3059\u308b\u904e\u7a0b\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-transfer_service.receiver.error_staging_content=\u30b3\u30f3\u30c6\u30f3\u30c4\u30d5\u30a1\u30a4\u30eb\u3092\u8ee2\u9001\u7528\u306b\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u3059\u308b\u904e\u7a0b\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f {0}\u3002 \u30d5\u30a1\u30a4\u30eb\u306eID\u306f {1} \u3067\u3059
-transfer_service.receiver.no_snapshot_received=\u8ee2\u9001 ({0})\u3092\u30b3\u30df\u30c3\u30c8\u3059\u308b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308a\u307e\u3057\u305f\u304c\u3001\u30de\u30c3\u30c1\u3059\u308b\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d7\u4fe1\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-transfer_service.receiver.error_committing_transfer=\u8ee2\u9001 {0} \u306e\u30b3\u30df\u30c3\u30c8\u3092\u8a66\u307f\u3066\u3044\u308b\u9593\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-transfer_service.receiver.transfer_not_found=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u8ee2\u9001\u306e\u8a18\u9332\u306e\u767a\u898b\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0}
-transfer_service.receiver.transfer_cancelled=\u8ee2\u9001\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u3066\u3044\u307e\u3059: {0}
-transfer_service.no_encoding=\u5024\u3092\u975e\u76f4\u5217\u5316\u3067\u304d\u307e\u305b\u3093\u3002\u30b3\u30fc\u30c9\u5316 {0} \u306e\u5909\u63db\u306f\u884c\u308f\u308c\u307e\u305b\u3093
-transfer_service.unable_to_deserialise=\u5024\u3092\u975e\u76f4\u5217\u5316\u3067\u304d\u307e\u305b\u3093
-transfer_service.receiver.lock_timed_out=\u8ee2\u9001\u30ed\u30c3\u30af\u304c\u8ee2\u9001ID\u3092\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f: {0}
-transfer_service.receiver.lock_not_found=\u8ee2\u9001\u30ed\u30c3\u30af\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
-transfer_service.receiver.error_start=\u8ee2\u9001\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093
-transfer_service.receiver.error_generating_requisite=\u8ee2\u9001\u306e\u5fc5\u8981\u6761\u4ef6\u3092\u751f\u6210\u3067\u304d\u307e\u305b\u3093
-transfer_service.receiver.error.transfer_to_self=\u8ee2\u9001\u30ed\u30c3\u30af\u304c\u8ee2\u9001ID\u3092\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f: {0}
+transfer_service.unable_to_find_transfer_home=\u8EE2\u9001\u30DB\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}
+transfer_service.unable_to_find_transfer_group=\u540D\u524D\u3001{0} \u306E\u4ED8\u3044\u305F\u8EE2\u9001\u30B0\u30EB\u30FC\u30D7\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002
+transfer_service.unable_to_find_transfer_target=\u540D\u524D\u3001{0} \u306E\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002
+transfer_service.unable_to_transfer_async=\u975E\u540C\u671F\u8EE2\u9001\u304C\u3067\u304D\u307E\u305B\u3093\u3002
+transfer_service.target_exists=\u540D\u524D, {0} \u306E\u4ED8\u3044\u305F\u65B0\u898F\u306E\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002\u305D\u306E\u540D\u524D\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u3059\u3067\u306B\u3042\u308A\u307E\u3059\u3002
+transfer_service.comms.unsupported_protocol=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u306A\u3044\u30D7\u30ED\u30C8\u30B3\u30EB: {0}
+transfer_service.comms.unsuccessful_response=\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u30B5\u30FC\u30D0\u304B\u3089\u5931\u6557\u5FDC\u7B54\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F: {0}, {1}
+transfer_service.comms.http_request_failed=\u30BF\u30FC\u30B2\u30C3\u30C8: {1} \u30B9\u30C6\u30FC\u30BF\u30B9: {2} \u306B\u5BFE\u3059\u308BHTTP\u30EA\u30AF\u30A8\u30B9\u30C8 {0} \u306E\u5B9F\u884C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
+transfer_service.incompatible_versions=\u4E92\u63DB\u6027\u306E\u306A\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u8EE2\u9001ID\u9593\u3067\u306F\u8EE2\u9001\u3067\u304D\u307E\u305B\u3093:{0}\u3001{1}\u304B\u3089{2}
+transfer_service.no_nodes=\u8EE2\u9001\u3059\u3079\u304D\u30CE\u30FC\u30C9\u304C\u3042\u308A\u307E\u305B\u3093\u3002
+transfer_service.target_not_enabled=\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u6709\u52B9\u3067\u3042\u308A\u307E\u305B\u3093 {0}
+transfer_service.cancelled=\u8EE2\u9001\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002
+transfer_service.failed_to_get_transfer_status=\u30BF\u30FC\u30B2\u30C3\u30C8 {0}\u304B\u3089\u306E\u8EE2\u9001\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
+transfer_service.target_error=\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306F {0} \u3067\u5931\u6557\u3057\u307E\u3057\u305F\u3002
+transfer_service.unknown_target_error=\u4E0D\u660E\u306A\u30A8\u30E9\u30FC
+transfer_service.receiver.no_primary_parent_supplied=\u4E00\u6B21\u89AA\u304C\u63D0\u4F9B\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u8EE2\u9001\u3067\u304D\u307E\u305B\u3093\u3002
+transfer_service.receiver.orphans_exist=\u8EE2\u9001\u3067\u304D\u307E\u305B\u3093\u3002\u5B64\u7ACB\u884C\u304C\u5B58\u5728\u3057\u307E\u3059
+transfer_service.receiver.content_file_missing=\u8EE2\u9001\u3067\u304D\u307E\u305B\u3093\u3002\u30B3\u30F3\u30C6\u30F3\u30C4\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002
+transfer_service.receiver.failed_to_create_staging_folder=\u8EE2\u9001 {0} \u7528\u306E\u30B9\u30C6\u30FC\u30B8\u30F3\u30B0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F
+transfer_service.receiver.lock_folder_not_found=\u6307\u5B9A\u3057\u305F\u30ED\u30C3\u30AF\u30D5\u30A9\u30EB\u30C0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}
+transfer_service.receiver.temp_folder_not_found=\u8EE2\u9001\u7528\u306B\u6307\u5B9A\u3057\u305F\u4E00\u6642\u30D5\u30A9\u30EB\u30C0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 {0}: {1}
+transfer_service.receiver.lock_unavailable=\u8EE2\u9001\u30ED\u30C3\u30AF\u306F\u4ED6\u306E\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9\u8EE2\u9001\u306B\u5BFE\u3057\u3066\u5BA3\u8A00\u3055\u308C\u3066\u3044\u307E\u3059\u3002 \u65B0\u305F\u306B\u8EE2\u9001\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3002
+transfer_service.receiver.record_folder_not_found=\u30A4\u30F3\u30D0\u30A6\u30F3\u30C9\u8EE2\u9001\u8A18\u9332\u3092\u4FDD\u6301\u3059\u308B\u7279\u5B9A\u6E08\u30D5\u30A9\u30EB\u30C0\u306E\u767A\u898B\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {0}
+transfer_service.receiver.not_lock_owner=\u8EE2\u9001\u30AA\u30DA\u30EC\u30FC\u30B7\u30E7\u30F3\u306E\u5B9F\u884C\u8A66\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 \u6307\u5B9A\u3057\u305F\u8EE2\u9001\u306B\u3088\u308A\u30ED\u30C3\u30AF\u304C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3067\u3057\u305F: {0}
+transfer_service.receiver.error_ending_transfer=\u8EE2\u9001 ({0}) \u3092\u5B8C\u4E86\u3059\u308B\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u7D50\u679C\u3001\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
+transfer_service.receiver.error_staging_snapshot=\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u8EE2\u9001 {0}\u7528\u306B\u30B9\u30C6\u30FC\u30B8\u30F3\u30B0\u3059\u308B\u904E\u7A0B\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
+transfer_service.receiver.error_staging_content=\u30B3\u30F3\u30C6\u30F3\u30C4\u30D5\u30A1\u30A4\u30EB\u3092\u8EE2\u9001\u7528\u306B\u30B9\u30C6\u30FC\u30B8\u30F3\u30B0\u3059\u308B\u904E\u7A0B\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F {0}\u3002 \u30D5\u30A1\u30A4\u30EB\u306EID\u306F {1} \u3067\u3059
+transfer_service.receiver.no_snapshot_received=\u8EE2\u9001 ({0})\u3092\u30B3\u30DF\u30C3\u30C8\u3059\u308B\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u304C\u3001\u30DE\u30C3\u30C1\u3059\u308B\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u53D7\u4FE1\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002
+transfer_service.receiver.error_committing_transfer=\u8EE2\u9001 {0} \u306E\u30B3\u30DF\u30C3\u30C8\u3092\u8A66\u307F\u3066\u3044\u308B\u9593\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
+transfer_service.receiver.transfer_not_found=\u30EA\u30AF\u30A8\u30B9\u30C8\u3055\u308C\u305F\u8EE2\u9001\u306E\u8A18\u9332\u306E\u767A\u898B\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {0}
+transfer_service.receiver.transfer_cancelled=\u8EE2\u9001\u306F\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u3066\u3044\u307E\u3059: {0}
+transfer_service.no_encoding=\u5024\u3092\u975E\u76F4\u5217\u5316\u3067\u304D\u307E\u305B\u3093\u3002\u30B3\u30FC\u30C9\u5316 {0} \u306E\u5909\u63DB\u306F\u884C\u308F\u308C\u307E\u305B\u3093
+transfer_service.unable_to_deserialise=\u5024\u3092\u975E\u76F4\u5217\u5316\u3067\u304D\u307E\u305B\u3093
+transfer_service.receiver.lock_timed_out=\u8EE2\u9001\u30ED\u30C3\u30AF\u304C\u8EE2\u9001ID\u3092\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: {0}
+transfer_service.receiver.lock_not_found=\u8EE2\u9001\u30ED\u30C3\u30AF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F
+transfer_service.receiver.error_start=\u8EE2\u9001\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093
+transfer_service.receiver.error_generating_requisite=\u8EE2\u9001\u306E\u5FC5\u8981\u6761\u4EF6\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093
+transfer_service.receiver.error.transfer_to_self=\u8EE2\u9001\u30ED\u30C3\u30AF\u304C\u8EE2\u9001ID\u3092\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: {0}
-transfer_service.missing_endpoint_path=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30d1\u30b9\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
-transfer_service.missing_endpoint_protocol=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30d7\u30ed\u30c8\u30b3\u30eb\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
-transfer_service.missing_endpoint_host=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30db\u30b9\u30c8\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
-transfer_service.missing_endpoint_port=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30dd\u30fc\u30c8\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
-transfer_service.missing_endpoint_username=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30e6\u30fc\u30b6\u540d\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
-transfer_service.missing_endpoint_password=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6307\u5b9a\u3057\u305f\u8ee2\u9001\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
+transfer_service.missing_endpoint_path=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30D1\u30B9\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
+transfer_service.missing_endpoint_protocol=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30D7\u30ED\u30C8\u30B3\u30EB\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
+transfer_service.missing_endpoint_host=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30DB\u30B9\u30C8\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
+transfer_service.missing_endpoint_port=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30DD\u30FC\u30C8\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
+transfer_service.missing_endpoint_username=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30E6\u30FC\u30B6\u540D\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
+transfer_service.missing_endpoint_password=\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u6307\u5B9A\u3057\u305F\u8EE2\u9001\u30BF\u30FC\u30B2\u30C3\u30C8\u306B\u5BFE\u3057\u3066\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {0}
diff --git a/config/alfresco/messages/wdr-messages.properties b/config/alfresco/messages/wdr-messages.properties
new file mode 100644
index 0000000000..6aad0ef14f
--- /dev/null
+++ b/config/alfresco/messages/wdr-messages.properties
@@ -0,0 +1,12 @@
+# Display labels for Web Delivery Runtime
+
+wdr.err.invalid_username_or_password=Invalid user name or password.
+wdr.err.unable_create_logfile=Could not create logfile; Deployment cannot continue
+wdr.err.unable_prepare_already_commit=Deployment cannot be prepared: already aborting, or committing.
+wdr.err.unable_prepare_missing_file="Unable to prepare, missing temporary file. {0}
+wdr.err.invalid_ticket=Deployment timed out or invalid ticket. {0}
+wdr.err.unable_commit=Unable to commit
+
+wdr.avm.snapshot_tag=Deployment from store:{0}, version:{1}
+wdr.avm.snapshot_description=Deployment from store:{0}, version:{1}
+
diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml
index d7d1dc0bd5..d8ce586f34 100644
--- a/config/alfresco/model/contentModel.xml
+++ b/config/alfresco/model/contentModel.xml
@@ -18,6 +18,7 @@
+
diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml
index 9bb96341f4..02b637ca89 100644
--- a/config/alfresco/patch/patch-services-context.xml
+++ b/config/alfresco/patch/patch-services-context.xml
@@ -1878,7 +1878,7 @@
-
+
@@ -2760,4 +2760,48 @@
+
+
+
+
+
+
+
+
+ classpath:alfresco/dbscripts/upgrade/3.4/${db.script.dialect}/varchar-field-sizes-quadruple-increasing.sql
+
+
+
+
+ patch.fixAclInheritance
+ patch.fixAclInheritance.description
+ 0
+ 4304
+ 4305
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ patch.db-V3.4-JBPM-FK-indexes
+ patch.schemaUpgradeScript.description
+ 0
+ 4305
+ 4306
+
+ classpath:alfresco/dbscripts/create/${db.script.dialect}/AlfrescoPostCreate-JBPM-FK-indexes.sql
+
+
+
diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml
index 7d80d56b5f..1f05ff018d 100644
--- a/config/alfresco/public-services-security-context.xml
+++ b/config/alfresco/public-services-security-context.xml
@@ -421,7 +421,7 @@
org.alfresco.service.cmr.model.FileFolderService.rename=ACL_NODE.0.sys:base.WriteProperties
org.alfresco.service.cmr.model.FileFolderService.move=ACL_NODE.0.sys:base.DeleteNode,ACL_NODE.1.sys:base.CreateChildren
org.alfresco.service.cmr.model.FileFolderService.moveFrom=ACL_NODE.0.sys:base.DeleteNode,ACL_NODE.2.sys:base.CreateChildren
- org.alfresco.service.cmr.model.FileFolderService.copy=ACL_NODE.0.sys:base.ReadProperties,ACL_NODE.1.sys:base.CreateChildren
+ org.alfresco.service.cmr.model.FileFolderService.copy=ACL_NODE.0.sys:base.Read,ACL_NODE.1.sys:base.CreateChildren
org.alfresco.service.cmr.model.FileFolderService.create=ACL_NODE.0.sys:base.CreateChildren
org.alfresco.service.cmr.model.FileFolderService.delete=ACL_NODE.0.sys:base.DeleteNode
org.alfresco.service.cmr.model.FileFolderService.getNamePath=ACL_NODE.1.sys:base.ReadProperties
diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties
index 234d9d21ff..224c4efef5 100644
--- a/config/alfresco/repository.properties
+++ b/config/alfresco/repository.properties
@@ -39,6 +39,9 @@ system.webdav.rootPath=${protocols.rootPath}
# servlet allows unauthenticated deployment of new workflows.
system.workflow.deployservlet.enabled=false
+# Sets the location for the JBPM Configuration File
+system.workflow.jbpm.config.location=classpath:org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml
+
# ######################################### #
# Index Recovery and Tracking Configuration #
# ######################################### #
diff --git a/config/alfresco/site-services-context.xml b/config/alfresco/site-services-context.xml
index 932b701437..e39cd5e34d 100644
--- a/config/alfresco/site-services-context.xml
+++ b/config/alfresco/site-services-context.xml
@@ -108,6 +108,7 @@
+
diff --git a/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml b/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
index a1478b7411..b8dcd9201c 100644
--- a/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
+++ b/config/alfresco/subsystems/ActivitiesFeed/default/activities-feed-context.xml
@@ -63,6 +63,7 @@
+
diff --git a/config/alfresco/subsystems/fileServers/default/file-servers-context.xml b/config/alfresco/subsystems/fileServers/default/file-servers-context.xml
index 53cc504555..5ce1ff1b93 100644
--- a/config/alfresco/subsystems/fileServers/default/file-servers-context.xml
+++ b/config/alfresco/subsystems/fileServers/default/file-servers-context.xml
@@ -49,6 +49,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -198,11 +210,6 @@
${ftp.port}
-
-
- ${ftp.ipv6.enabled}
-
-
diff --git a/config/alfresco/subsystems/fileServers/default/file-servers.properties b/config/alfresco/subsystems/fileServers/default/file-servers.properties
index 9c2ed117aa..b6dc2e0b6f 100644
--- a/config/alfresco/subsystems/fileServers/default/file-servers.properties
+++ b/config/alfresco/subsystems/fileServers/default/file-servers.properties
@@ -9,6 +9,11 @@ filesystem.rootPath=${protocols.rootPath}
# File name patterns that trigger rename shuffle detection
filesystem.renameShufflePattern=(.*\\.tmp)|(.*\\.wbk)|(.*\\.bak)|(.*\\~)
+# Should we ever set the read only flag on folders? This may cause problematic
+# behaviour in Windows clients. See ALF-6727.
+filesystem.setReadOnlyFlagOnFolders=false
+
+
### CIFS Server Configuration ###
cifs.enabled=true
cifs.serverName=${localname}A
@@ -47,7 +52,6 @@ cifs.sessionDebug=
### FTP Server Configuration ###
ftp.enabled=true
ftp.port=21
-ftp.ipv6.enabled=false
# FTP data port range, a value of 0:0 disables the data port range and will use the next available port
# Valid range is 1024-65535
@@ -68,6 +72,8 @@ ftp.sessionDebug=
### NFS Server Configuration ###
nfs.enabled=false
+# NodeMonitor to update cache of NFS server on nodes renaming and deleting not through NFS protocol
+nfs.nodeMinitor.enabled=${nfs.enabled}
# Mount/NFS server ports, 0 will allocate next available port
nfs.mountServerPort=0
nfs.nfsServerPort=2049
diff --git a/config/alfresco/network-protocol-context.xml b/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml
similarity index 90%
rename from config/alfresco/network-protocol-context.xml
rename to config/alfresco/subsystems/fileServers/default/network-protocol-context.xml
index c49a630854..14ba2e70b9 100644
--- a/config/alfresco/network-protocol-context.xml
+++ b/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml
@@ -67,6 +67,8 @@
+
+
@@ -84,6 +86,12 @@
${server.transaction.allow-writes}
+ ${filesystem.setReadOnlyFlagOnFolders}
+
+
+ {http://www.alfresco.org/model/forum/1.0}forum
+
+
diff --git a/config/alfresco/version.properties b/config/alfresco/version.properties
index e8c8ea905d..57385f4f17 100644
--- a/config/alfresco/version.properties
+++ b/config/alfresco/version.properties
@@ -19,4 +19,4 @@ version.build=@build-number@
# Schema number
-version.schema=4303
+version.schema=4306
diff --git a/config/alfresco/wcm-services-context.xml b/config/alfresco/wcm-services-context.xml
index 74b56d21b1..1adc22fbcf 100644
--- a/config/alfresco/wcm-services-context.xml
+++ b/config/alfresco/wcm-services-context.xml
@@ -45,6 +45,7 @@
+
diff --git a/config/alfresco/workflow/invitation-moderated-workflow-messages_ja.properties b/config/alfresco/workflow/invitation-moderated-workflow-messages_ja.properties
index 96a13ea0a2..0acdf2b107 100755
--- a/config/alfresco/workflow/invitation-moderated-workflow-messages_ja.properties
+++ b/config/alfresco/workflow/invitation-moderated-workflow-messages_ja.properties
@@ -5,7 +5,7 @@
#
imwf_invitation-moderated.workflow.title=\u62db\u5f85 - \u30e2\u30c7\u30ec\u30fc\u30c8\u6e08
-imwf_invitation-moderated.workflow.description=Web\u30fb\u30b5\u30a4\u30c8\u306a\u3069\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u30e2\u30c7\u30ec\u30fc\u30c8\u3055\u308c\u305f\u62db\u5f85
+imwf_invitation-moderated.workflow.description=Web\u30b5\u30a4\u30c8\u306a\u3069\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u30e2\u30c7\u30ec\u30fc\u30c8\u3055\u308c\u305f\u62db\u5f85
imwf_invitation-moderated-workflow-model.type.imwf_moderatedInvitationReviewTask.title=\u30e2\u30c7\u30ec\u30fc\u30c8\u3055\u308c\u305f\u30b5\u30a4\u30c8\u62db\u5f85
imwf_invitation-moderated-workflow-model.type.imwf_moderatedInvitationReviewTask.description=\u30e2\u30c7\u30ec\u30fc\u30c8\u3055\u308c\u305f\u62db\u5f85\u306e\u958b\u59cb
diff --git a/config/alfresco/workflow/wcm-workflow-messages_ja.properties b/config/alfresco/workflow/wcm-workflow-messages_ja.properties
index de5f013b35..823be36729 100755
--- a/config/alfresco/workflow/wcm-workflow-messages_ja.properties
+++ b/config/alfresco/workflow/wcm-workflow-messages_ja.properties
@@ -4,7 +4,7 @@
# Submit Workflow
#
-wcmwf_submit.workflow.title=Web\u30fb\u30b5\u30a4\u30c8\u63d0\u51fa
+wcmwf_submit.workflow.title=Web\u30b5\u30a4\u30c8\u63d0\u51fa
wcmwf_submit.workflow.description=\u627f\u8a8d\u7528\u306b\u5909\u66f4\u3092\u9001\u4fe1
wcmwf_submit.node.verifybrokenlinks.transition.abort.title=\u63d0\u51fa\u306e\u505c\u6b62
wcmwf_submit.node.verifybrokenlinks.transition.abort.description=\u63d0\u51fa\u306e\u505c\u6b62
@@ -27,7 +27,7 @@ wcmwf_submit.node.submitpending.transition.cancel.description=\u63d0\u51fa\u306e
wcmwf_submit.node.submitpending.transition.launch.title=\u4eca\u3059\u3050\u9001\u4fe1
wcmwf_submit.node.submitpending.transition.launch.description=\u4eca\u3059\u3050\u9001\u4fe1
-wcmwf_submitdirect.workflow.title=Web\u30fb\u30b5\u30a4\u30c8\u63d0\u51fa\uff08\u76f4\u63a5\uff09
+wcmwf_submitdirect.workflow.title=Web\u30b5\u30a4\u30c8\u63d0\u51fa\uff08\u76f4\u63a5\uff09
wcmwf_submitdirect.workflow.description=\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30fb\u30b5\u30f3\u30c9\u30dc\u30c3\u30af\u30b9\u306b\u5909\u66f4\u3092\u76f4\u63a5\u9001\u4fe1
diff --git a/config/test/alfresco/model/testWcmModel.xml b/config/test/alfresco/model/testWcmModel.xml
new file mode 100644
index 0000000000..61f5238c96
--- /dev/null
+++ b/config/test/alfresco/model/testWcmModel.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ d:date
+ true
+
+
+
+
+
+
diff --git a/config/test/alfresco/wcm-template-node-test-context.xml b/config/test/alfresco/wcm-template-node-test-context.xml
new file mode 100644
index 0000000000..d115215c07
--- /dev/null
+++ b/config/test/alfresco/wcm-template-node-test-context.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test/alfresco/model/testWcmModel.xml
+
+
+
+
+
diff --git a/source/java/org/alfresco/cmis/CMISRelationshipDirectionEnum.java b/source/java/org/alfresco/cmis/CMISRelationshipDirectionEnum.java
index 5ca5151d9c..39b8f432a3 100644
--- a/source/java/org/alfresco/cmis/CMISRelationshipDirectionEnum.java
+++ b/source/java/org/alfresco/cmis/CMISRelationshipDirectionEnum.java
@@ -27,7 +27,7 @@ public enum CMISRelationshipDirectionEnum implements EnumLabel
{
SOURCE("source"),
TARGET("target"),
- BOTH("both");
+ EITHER("either");
private String label;
diff --git a/source/java/org/alfresco/cmis/CMISServices.java b/source/java/org/alfresco/cmis/CMISServices.java
index 30d8cf3323..91a16a65f5 100644
--- a/source/java/org/alfresco/cmis/CMISServices.java
+++ b/source/java/org/alfresco/cmis/CMISServices.java
@@ -673,7 +673,7 @@ public interface CMISServices
*/
public void deleteObject(String objectId, boolean allVersions) throws CMISConstraintException,
CMISVersioningException, CMISObjectNotFoundException, CMISInvalidArgumentException,
- CMISPermissionDeniedException, CMISRuntimeException;
+ CMISPermissionDeniedException, CMISRuntimeException, CMISServiceException;
/**
* Adds a secondary child association to an object from a folder.
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISBasePropertyDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISBasePropertyDefinition.java
index dc080973a4..60163cb066 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISBasePropertyDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISBasePropertyDefinition.java
@@ -50,6 +50,7 @@ import org.alfresco.service.cmr.dictionary.Constraint;
import org.alfresco.service.cmr.dictionary.ConstraintDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
+import org.alfresco.util.ISO9075;
/**
* CMIS Property Definition
@@ -109,7 +110,7 @@ public class CMISBasePropertyDefinition implements CMISPropertyDefinition, Seria
{
this.propertyId = propertyId;
this.typeDef = typeDef;
- queryName = cmisMapping.buildPrefixEncodedString(propertyId.getQName());
+ queryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(propertyId.getQName()));
displayName = (propDef.getTitle() != null) ? propDef.getTitle() : propertyId.getId();
description = propDef.getDescription() != null ? propDef.getDescription() : displayName;
propertyType = cmisMapping.getDataType(propDef.getDataType());
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISDocumentTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISDocumentTypeDefinition.java
index bce1e97282..2d250a7659 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISDocumentTypeDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISDocumentTypeDefinition.java
@@ -25,6 +25,7 @@ import org.alfresco.cmis.CMISTypeId;
import org.alfresco.cmis.mapping.CMISMapping;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
@@ -69,7 +70,7 @@ public class CMISDocumentTypeDefinition extends CMISAbstractTypeDefinition
}
else
{
- objectTypeQueryName = cmisMapping.buildPrefixEncodedString(typeId.getQName());
+ objectTypeQueryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(typeId.getQName()));
if (cmisMapping.isValidCmisDocument(parentQName))
{
parentTypeId = cmisMapping.getCmisTypeId(CMISScope.DOCUMENT, parentQName);
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISFolderTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISFolderTypeDefinition.java
index 57f3964de1..0713768454 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISFolderTypeDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISFolderTypeDefinition.java
@@ -25,6 +25,7 @@ import org.alfresco.cmis.mapping.CMISMapping;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
@@ -63,7 +64,7 @@ public class CMISFolderTypeDefinition extends CMISAbstractTypeDefinition
}
else
{
- objectTypeQueryName = cmisMapping.buildPrefixEncodedString(typeId.getQName());
+ objectTypeQueryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(typeId.getQName()));
if (cmisMapping.isValidCmisFolder(parentQName))
{
parentTypeId = cmisMapping.getCmisTypeId(CMISScope.FOLDER, parentQName);
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISObjectTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISObjectTypeDefinition.java
index 0fe32d040d..6486479944 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISObjectTypeDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISObjectTypeDefinition.java
@@ -27,6 +27,7 @@ import org.alfresco.cmis.mapping.CMISMapping;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
@@ -52,7 +53,7 @@ public class CMISObjectTypeDefinition extends CMISAbstractTypeDefinition
// Object type properties
objectTypeId = typeId;
- objectTypeQueryName = cmisMapping.buildPrefixEncodedString(typeId.getQName());
+ objectTypeQueryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(typeId.getQName()));
if (cmisClassDef != null)
{
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISPolicyTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISPolicyTypeDefinition.java
index 12dd170896..1114227abf 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISPolicyTypeDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISPolicyTypeDefinition.java
@@ -31,6 +31,7 @@ import org.alfresco.cmis.mapping.CMISMapping;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
@@ -68,7 +69,7 @@ public class CMISPolicyTypeDefinition extends CMISAbstractTypeDefinition
}
else
{
- objectTypeQueryName = cmisMapping.buildPrefixEncodedString(typeId.getQName());
+ objectTypeQueryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(typeId.getQName()));
parentTypeId = CMISDictionaryModel.POLICY_TYPE_ID;
}
description = cmisClassDef.getDescription() != null ? cmisClassDef.getDescription() : displayName;
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISRelationshipTypeDefinition.java b/source/java/org/alfresco/cmis/dictionary/CMISRelationshipTypeDefinition.java
index c38eb13883..57f1deafef 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISRelationshipTypeDefinition.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISRelationshipTypeDefinition.java
@@ -36,6 +36,7 @@ import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ISO9075;
/**
@@ -95,7 +96,7 @@ public class CMISRelationshipTypeDefinition extends CMISAbstractTypeDefinition
{
creatable = true;
displayName = (assocDef.getTitle() != null) ? assocDef.getTitle() : typeId.getId();
- objectTypeQueryName = cmisMapping.buildPrefixEncodedString(typeId.getQName());
+ objectTypeQueryName = ISO9075.encodeSQL(cmisMapping.buildPrefixEncodedString(typeId.getQName()));
parentTypeId = CMISDictionaryModel.RELATIONSHIP_TYPE_ID;
description = assocDef.getDescription() != null ? assocDef.getDescription() : displayName;
diff --git a/source/java/org/alfresco/cmis/dictionary/CMISStrictDictionaryService.java b/source/java/org/alfresco/cmis/dictionary/CMISStrictDictionaryService.java
index 96aca1a748..05ee07c46d 100644
--- a/source/java/org/alfresco/cmis/dictionary/CMISStrictDictionaryService.java
+++ b/source/java/org/alfresco/cmis/dictionary/CMISStrictDictionaryService.java
@@ -22,6 +22,7 @@ import java.util.Collection;
import org.alfresco.cmis.CMISScope;
import org.alfresco.cmis.CMISTypeId;
+import org.alfresco.cmis.mapping.CMISMapping;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.ClassDefinition;
@@ -67,6 +68,8 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService
CMISTypeId typeId = cmisMapping.getCmisTypeId(classQName);
if (typeId == null)
continue;
+ if (typeId.getScope() == CMISScope.RELATIONSHIP)
+ continue;
// create appropriate kind of type definition
ClassDefinition classDef = dictionaryService.getClass(cmisMapping.getCmisType(typeId.getQName()));
@@ -80,11 +83,6 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService
boolean isSystem = dictionaryService.isSubClass(classDef.getName(), ContentModel.TYPE_SYSTEM_FOLDER);
objectTypeDef = new CMISFolderTypeDefinition(cmisMapping, typeId, classDef, isSystem);
}
- else if (typeId.getScope() == CMISScope.RELATIONSHIP)
- {
- AssociationDefinition assocDef = dictionaryService.getAssociation(classQName);
- objectTypeDef = new CMISRelationshipTypeDefinition(cmisMapping, typeId, classDef, assocDef);
- }
else if (typeId.getScope() == CMISScope.POLICY)
{
objectTypeDef = new CMISPolicyTypeDefinition(cmisMapping, typeId, classDef);
@@ -106,15 +104,20 @@ public class CMISStrictDictionaryService extends CMISAbstractDictionaryService
*/
private void createAssocDefs(DictionaryRegistry registry, Collection classQNames)
{
+ CMISTypeId typeId = cmisMapping.getCmisTypeId(CMISScope.RELATIONSHIP, CMISMapping.RELATIONSHIP_QNAME);
+ ClassDefinition classDef = dictionaryService.getClass(cmisMapping.getCmisType(typeId.getQName()));
+ CMISAbstractTypeDefinition objectTypeDef = new CMISRelationshipTypeDefinition(cmisMapping, typeId, classDef, null);
+ registry.registerTypeDefinition(objectTypeDef);
+
for (QName classQName : classQNames)
{
if (!cmisMapping.isValidCmisRelationship(classQName))
continue;
// create appropriate kind of type definition
- CMISTypeId typeId = cmisMapping.getCmisTypeId(CMISScope.RELATIONSHIP, classQName);
+ typeId = cmisMapping.getCmisTypeId(CMISScope.RELATIONSHIP, classQName);
AssociationDefinition assocDef = dictionaryService.getAssociation(classQName);
- CMISAbstractTypeDefinition objectTypeDef = new CMISRelationshipTypeDefinition(cmisMapping, typeId, null, assocDef);
+ objectTypeDef = new CMISRelationshipTypeDefinition(cmisMapping, typeId, null, assocDef);
registry.registerTypeDefinition(objectTypeDef);
}
diff --git a/source/java/org/alfresco/cmis/mapping/CMISMapping.java b/source/java/org/alfresco/cmis/mapping/CMISMapping.java
index 13c129950d..8891a654e8 100644
--- a/source/java/org/alfresco/cmis/mapping/CMISMapping.java
+++ b/source/java/org/alfresco/cmis/mapping/CMISMapping.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
@@ -238,7 +237,7 @@ public class CMISMapping implements InitializingBean
registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_ACL, PermissionService.READ_PERMISSIONS));
registerEvaluator(CMISScope.DOCUMENT, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_APPLY_ACL, PermissionService.CHANGE_PERMISSIONS));
- registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_DELETE_OBJECT, PermissionService.DELETE_NODE));
+ registerEvaluator(CMISScope.FOLDER, new RootActionEvaluator(new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_DELETE_OBJECT, PermissionService.DELETE_NODE), false));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_UPDATE_PROPERTIES, PermissionService.WRITE_PROPERTIES));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_FOLDER_TREE, PermissionService.READ_CHILDREN));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_PROPERTIES, PermissionService.READ_PROPERTIES));
@@ -247,7 +246,7 @@ public class CMISMapping implements InitializingBean
registerEvaluator(CMISScope.FOLDER, new ParentActionEvaluator(new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_FOLDER_PARENT, PermissionService.READ_PERMISSIONS)));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_DESCENDANTS, PermissionService.READ_CHILDREN));
// Is CAN_MOVE_OBJECT correct mapping?
- registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_MOVE_OBJECT, PermissionService.DELETE_NODE));
+ registerEvaluator(CMISScope.FOLDER, new RootActionEvaluator(new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_MOVE_OBJECT, PermissionService.DELETE_NODE), false));
registerEvaluator(CMISScope.FOLDER, new FixedValueActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_APPLY_POLICY, false));
registerEvaluator(CMISScope.FOLDER, new FixedValueActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_APPLIED_POLICIES, true));
registerEvaluator(CMISScope.FOLDER, new FixedValueActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_REMOVE_POLICY, false));
@@ -255,7 +254,7 @@ public class CMISMapping implements InitializingBean
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CREATE_DOCUMENT, PermissionService.CREATE_CHILDREN));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CREATE_FOLDER, PermissionService.CREATE_CHILDREN));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_CREATE_RELATIONSHIP, PermissionService.CREATE_ASSOCIATIONS));
- registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_DELETE_TREE, PermissionService.DELETE_NODE));
+ registerEvaluator(CMISScope.FOLDER, new RootActionEvaluator(new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_DELETE_TREE, PermissionService.DELETE_NODE), false));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_GET_ACL, PermissionService.READ_PERMISSIONS));
registerEvaluator(CMISScope.FOLDER, new PermissionActionEvaluator(serviceRegistry, CMISAllowedActionEnum.CAN_APPLY_ACL, PermissionService.CHANGE_PERMISSIONS));
@@ -406,14 +405,14 @@ public class CMISMapping implements InitializingBean
{
return getCmisTypeId(CMISScope.FOLDER, classQName);
}
- if (isValidCmisRelationship(classQName))
- {
- return getCmisTypeId(CMISScope.RELATIONSHIP, classQName);
- }
if (isValidCmisPolicy(classQName))
{
return getCmisTypeId(CMISScope.POLICY, classQName);
}
+ if (isValidCmisRelationship(classQName))
+ {
+ return getCmisTypeId(CMISScope.RELATIONSHIP, classQName);
+ }
return null;
}
@@ -560,14 +559,6 @@ public class CMISMapping implements InitializingBean
{
return false;
}
- if (!isValidCmisDocumentOrFolder(getCmisType(associationDefinition.getSourceClass().getName())))
- {
- return false;
- }
- if (!isValidCmisDocumentOrFolder(getCmisType(associationDefinition.getTargetClass().getName())))
- {
- return false;
- }
return true;
}
diff --git a/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java b/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java
index d319b3e880..5025a4e6a0 100644
--- a/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java
+++ b/source/java/org/alfresco/cmis/mapping/CMISServicesImpl.java
@@ -692,11 +692,11 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware,
// retrieve associations
List assocs = new ArrayList();
- if (direction == CMISRelationshipDirectionEnum.SOURCE || direction == CMISRelationshipDirectionEnum.BOTH)
+ if (direction == CMISRelationshipDirectionEnum.SOURCE || direction == CMISRelationshipDirectionEnum.EITHER)
{
assocs.addAll(nodeService.getTargetAssocs(node, RegexQNamePattern.MATCH_ALL));
}
- if (direction == CMISRelationshipDirectionEnum.TARGET || direction == CMISRelationshipDirectionEnum.BOTH)
+ if (direction == CMISRelationshipDirectionEnum.TARGET || direction == CMISRelationshipDirectionEnum.EITHER)
{
assocs.addAll(nodeService.getSourceAssocs(node, RegexQNamePattern.MATCH_ALL));
}
@@ -709,12 +709,16 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware,
for (AssociationRef assoc : assocs)
{
CMISTypeDefinition assocTypeDef = cmisDictionaryService.findTypeForClass(assoc.getTypeQName(), CMISScope.RELATIONSHIP);
- if (assocTypeDef != null)
+ QName sourceTypeDef = nodeService.getType(assoc.getSourceRef());
+ QName targetTypeDef = nodeService.getType(assoc.getTargetRef());
+ if (assocTypeDef == null || cmisDictionaryService.findTypeForClass(sourceTypeDef) == null ||
+ cmisDictionaryService.findTypeForClass(targetTypeDef) == null)
{
- if (assocTypeDef.equals(relDef) || (subRelDefs != null && subRelDefs.contains(assocTypeDef)))
- {
- filteredAssocs.add(assoc);
- }
+ continue;
+ }
+ if (assocTypeDef.equals(relDef) || (subRelDefs != null && subRelDefs.contains(assocTypeDef)))
+ {
+ filteredAssocs.add(assoc);
}
}
@@ -1466,7 +1470,7 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware,
*/
public void deleteObject(String objectId, boolean allVersions) throws CMISConstraintException,
CMISVersioningException, CMISObjectNotFoundException, CMISInvalidArgumentException,
- CMISPermissionDeniedException, CMISRuntimeException
+ CMISPermissionDeniedException, CMISRuntimeException, CMISServiceException
{
try
{
@@ -1533,6 +1537,10 @@ public class CMISServicesImpl implements CMISServices, ApplicationContextAware,
// Attempt to delete the node
nodeService.deleteNode(nodeRef);
}
+ catch (CMISServiceException e)
+ {
+ throw e;
+ }
catch (AccessDeniedException e)
{
throw new CMISPermissionDeniedException(e);
diff --git a/source/java/org/alfresco/cmis/mapping/RootActionEvaluator.java b/source/java/org/alfresco/cmis/mapping/RootActionEvaluator.java
new file mode 100644
index 0000000000..37791f8897
--- /dev/null
+++ b/source/java/org/alfresco/cmis/mapping/RootActionEvaluator.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.cmis.mapping;
+
+import org.alfresco.service.cmr.repository.NodeRef;
+
+/**
+ * Action Evaluator which evaluates on whether node is root or not
+ *
+ * @author davidc
+ */
+public class RootActionEvaluator extends AbstractActionEvaluator
+{
+ private AbstractActionEvaluator evaluator;
+ private boolean allow;
+
+ /**
+ * Construct
+ *
+ * @param serviceRegistry
+ * @param action
+ */
+ protected RootActionEvaluator(AbstractActionEvaluator evaluator, boolean allow)
+ {
+ super(evaluator.getServiceRegistry(), evaluator.getAction());
+ this.evaluator = evaluator;
+ this.allow = allow;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.alfresco.cmis.CMISActionEvaluator#isAllowed(org.alfresco.service.cmr.repository.NodeRef)
+ */
+ public boolean isAllowed(NodeRef nodeRef)
+ {
+ if (nodeRef.equals(getServiceRegistry().getCMISService().getDefaultRootNodeRef()))
+ {
+ return allow;
+ }
+ return evaluator.isAllowed(nodeRef);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append("RootActionEvaluator[evaluator=").append(evaluator).append(",allow=").append(allow).append("]");
+ return builder.toString();
+ }
+}
+
diff --git a/source/java/org/alfresco/cmis/search/CMIS-query-test-model.xml b/source/java/org/alfresco/cmis/search/CMIS-query-test-model.xml
index 2ca70e9f2e..83a7853ac5 100644
--- a/source/java/org/alfresco/cmis/search/CMIS-query-test-model.xml
+++ b/source/java/org/alfresco/cmis/search/CMIS-query-test-model.xml
@@ -292,6 +292,30 @@
Extended Foldercm:folder
+
+
+ Type that requires encoding
+ cm:content
+ true
+
+
+ d:text
+ false
+ false
+
+ true
+ both
+
+
+
+
+
+
+ Type that requires encoding
+ true
+
+
+
\ No newline at end of file
diff --git a/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java b/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java
index c762445198..57c5faecec 100644
--- a/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java
+++ b/source/java/org/alfresco/cmis/search/CmisFunctionEvaluationContext.java
@@ -20,6 +20,7 @@ package org.alfresco.cmis.search;
import java.io.Serializable;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Map;
import org.alfresco.cmis.CMISCardinalityEnum;
@@ -38,6 +39,7 @@ import org.alfresco.repo.search.impl.querymodel.QueryModelException;
import org.alfresco.repo.search.impl.querymodel.Selector;
import org.alfresco.repo.search.impl.querymodel.impl.functions.Lower;
import org.alfresco.repo.search.impl.querymodel.impl.functions.Upper;
+import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.apache.lucene.queryParser.ParseException;
@@ -48,6 +50,8 @@ import org.apache.lucene.search.Query;
*/
public class CmisFunctionEvaluationContext implements FunctionEvaluationContext
{
+ private static HashSet EXPOSED_FIELDS = new HashSet();
+
public static CMISScope[] STRICT_SCOPES = new CMISScope[] { CMISScope.DOCUMENT, CMISScope.FOLDER };
public static CMISScope[] ALFRESCO_SCOPES = new CMISScope[] { CMISScope.DOCUMENT, CMISScope.FOLDER, CMISScope.POLICY };
@@ -64,6 +68,54 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext
private Float score;
+ static
+ {
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_PATH);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_TEXT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ID);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ISROOT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ISNODE);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_TX);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_PARENT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_PRIMARYPARENT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_QNAME);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_CLASS);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_TYPE);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_EXACTTYPE);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ASPECT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_EXACTASPECT);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ALL);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ISUNSET);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ISNULL);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ISNOTNULL);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_FTSSTATUS);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_ASSOCTYPEQNAME);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_PRIMARYASSOCTYPEQNAME);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_DBID);
+ EXPOSED_FIELDS.add(LuceneQueryParser.FIELD_TAG);
+
+
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.ANY.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.ASSOC_REF.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.BOOLEAN.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.CATEGORY.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.CHILD_ASSOC_REF.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.CONTENT.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.DATE.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.DATETIME.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.DOUBLE.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.FLOAT.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.INT.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.LOCALE.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.LONG.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.MLTEXT.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.NODE_REF.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.PATH.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.PERIOD.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.QNAME.getLocalName());
+ EXPOSED_FIELDS.add("d:"+DataTypeDefinition.TEXT.getLocalName());
+ }
+
/**
* @param nodeRefs
* the nodeRefs to set
@@ -363,7 +415,14 @@ public class CmisFunctionEvaluationContext implements FunctionEvaluationContext
CMISPropertyDefinition propDef = cmisDictionaryService.findPropertyByQueryName(propertyName);
if (propDef == null)
{
- throw new CMISQueryException("Unknown column/property " + propertyName);
+ if (EXPOSED_FIELDS.contains(propertyName))
+ {
+ return;
+ }
+ else
+ {
+ throw new CMISQueryException("Unknown column/property " + propertyName);
+ }
}
CMISTypeDefinition typeDef = cmisDictionaryService.findTypeForClass(selector.getType(), validScopes);
diff --git a/source/java/org/alfresco/cmis/search/QueryTest.java b/source/java/org/alfresco/cmis/search/QueryTest.java
index 7373384591..e38f7645e4 100644
--- a/source/java/org/alfresco/cmis/search/QueryTest.java
+++ b/source/java/org/alfresco/cmis/search/QueryTest.java
@@ -96,6 +96,7 @@ import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.tree.CommonTree;
import org.alfresco.util.CachingDateFormat;
+import org.alfresco.util.ISO9075;
import org.springframework.extensions.surf.util.I18NUtil;
/**
@@ -105,6 +106,14 @@ public class QueryTest extends BaseCMISTest
{
private static final String TEST_NAMESPACE = "http://www.alfresco.org/test/cmis-query-test";
+
+
+ QName typeThatRequiresEncoding = QName.createQName(TEST_NAMESPACE, "type-that-requires-encoding");
+
+ QName aspectThatRequiresEncoding = QName.createQName(TEST_NAMESPACE, "aspect-that-requires-encoding");
+
+ QName propertyThatRequiresEncoding = QName.createQName(TEST_NAMESPACE, "property-that-requires-encoding");
+
QName extendedContent = QName.createQName(TEST_NAMESPACE, "extendedContent");
QName singleTextBoth = QName.createQName(TEST_NAMESPACE, "singleTextBoth");
@@ -583,6 +592,15 @@ public class QueryTest extends BaseCMISTest
}
+ public void testEncodingOfTypeAndPropertyNames()
+ {
+ addTypeTestDataModel();
+ assertNotNull("Type not found by query name "+ISO9075.encodeSQL(typeThatRequiresEncoding.toPrefixString(namespaceService)), cmisDictionaryService.findTypeByQueryName(ISO9075.encodeSQL(typeThatRequiresEncoding.toPrefixString(namespaceService))));
+ assertNotNull("Aspect not found by query name "+ISO9075.encodeSQL(aspectThatRequiresEncoding.toPrefixString(namespaceService)), cmisDictionaryService.findTypeByQueryName(ISO9075.encodeSQL(aspectThatRequiresEncoding.toPrefixString(namespaceService))));
+ assertNotNull("Prpo not found by query name "+ISO9075.encodeSQL(propertyThatRequiresEncoding.toPrefixString(namespaceService)), cmisDictionaryService.findPropertyByQueryName(ISO9075.encodeSQL(propertyThatRequiresEncoding.toPrefixString(namespaceService))));
+
+ }
+
public void test_ALLOWED_CHILD_OBJECT_TYPES() throws Exception
{
CMISQueryOptions options = new CMISQueryOptions("SELECT * FROM cmis:Folder", rootNodeRef.getStoreRef());
@@ -3290,6 +3308,9 @@ public class QueryTest extends BaseCMISTest
testQuery("SELECT * FROM cmis:document WHERE CONTAINS('\\'quick\\'')", 1, false, "cmis:objectId", new String(), false);
testExtendedQuery("SELECT * FROM cmis:document D WHERE CONTAINS(D, 'cmis:name:\\'Tutorial\\'')", 1, false, "cmis:objectId", new String(), false);
testExtendedQuery("SELECT cmis:name as BOO FROM cmis:document D WHERE CONTAINS('BOO:\\'Tutorial\\'')", 1, false, "cmis:objectId", new String(), false);
+ testExtendedQuery("SELECT * FROM cmis:document D WHERE CONTAINS('TEXT:\\'zebra\\'')", doc_count-1, false, "cmis:objectId", new String(), false);
+ testExtendedQuery("SELECT * FROM cmis:document D WHERE CONTAINS('ALL:\\'zebra\\'')", doc_count-1, false, "cmis:objectId", new String(), false);
+ testExtendedQuery("SELECT * FROM cmis:document D WHERE CONTAINS('d:content:\\'zebra\\'')", doc_count-1, false, "cmis:objectId", new String(), false);
}
public void testScoreValues()
@@ -3823,6 +3844,23 @@ public class QueryTest extends BaseCMISTest
testQuery("SELECT * FROM test:extendedContent WHERE 'Un tokenised' = ANY test:singleTextBoth ", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextBoth IN ('Un tokenised', 'Monkey')", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextBoth NOT IN ('Un tokenized')", 1, false, "cmis:name", new String(), true);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth < 'tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth < 'Un tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth < 'V'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth < 'U'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth <= 'tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth <= 'Un tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth <= 'V'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth <= 'U'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth > 'tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth > 'Un tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth > 'V'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth > 'U'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth >= 'tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth >= 'Un tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth >= 'V'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextBoth >= 'U'", 1, false, "cmis:name", new String(), false);
+
testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised = 'Un tokenised'", 1, false, "cmis:name", new String(), false);
testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised <> 'tokenised'", 1, false, "cmis:name", new String(), false);
@@ -3833,6 +3871,22 @@ public class QueryTest extends BaseCMISTest
testQuery("SELECT * FROM test:extendedContent WHERE 'Un tokenised' = ANY test:singleTextUntokenised ", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextUntokenised IN ('Un tokenised', 'Monkey')", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextUntokenised NOT IN ('Un tokenized')", 1, false, "cmis:name", new String(), true);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised < 'tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised < 'Un tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised < 'V'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised < 'U'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised <= 'tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised <= 'Un tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised <= 'V'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised <= 'U'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised > 'tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised > 'Un tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised > 'V'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised > 'U'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised >= 'tokenised'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised >= 'Un tokenised'", 1, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised >= 'V'", 0, false, "cmis:name", new String(), false);
+ testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextUntokenised >= 'U'", 1, false, "cmis:name", new String(), false);
testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextTokenised = 'tokenised'", 1, false, "cmis:name", new String(), false);
testQuery("SELECT * FROM test:extendedContent WHERE test:singleTextTokenised <> 'tokenized'", 1, false, "cmis:name", new String(), false);
@@ -3843,6 +3897,7 @@ public class QueryTest extends BaseCMISTest
testQuery("SELECT * FROM test:extendedContent WHERE 'tokenised' = ANY test:singleTextTokenised ", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextTokenised IN ('tokenised', 'Monkey')", 1, false, "cmis:name", new String(), true);
testQuery("SELECT * FROM test:extendedContent WHERE ANY test:singleTextTokenised NOT IN ('tokenized')", 1, false, "cmis:name", new String(), true);
+ // Ranges do not make a lot of sense for tokenized fields
// d:text single by alias
diff --git a/source/java/org/alfresco/filesys/NFSServerBean.java b/source/java/org/alfresco/filesys/NFSServerBean.java
index c5d7a24287..b169f2ff84 100644
--- a/source/java/org/alfresco/filesys/NFSServerBean.java
+++ b/source/java/org/alfresco/filesys/NFSServerBean.java
@@ -55,6 +55,8 @@ public class NFSServerBean extends AbstractLifecycleBean
private ServerConfiguration m_filesysConfig;
private NFSConfigSection m_nfsConfig;
+ private NfsServerNodeMonitor nodeMonitor;
+
// List of NFS server components
private Vector m_serverList = new Vector();
@@ -79,6 +81,11 @@ public class NFSServerBean extends AbstractLifecycleBean
return m_filesysConfig;
}
+ public void setNodeMonitor(NfsServerNodeMonitor nodeMonitor)
+ {
+ this.nodeMonitor = nodeMonitor;
+ }
+
/**
* Check if the server is started/enabled
*
@@ -113,7 +120,12 @@ public class NFSServerBean extends AbstractLifecycleBean
// Create the mount and main NFS servers
m_serverList.add(new MountServer(m_filesysConfig));
- m_serverList.add(new NFSServer(m_filesysConfig));
+ NFSServer nfsServer = new NFSServer(m_filesysConfig);
+ m_serverList.add(nfsServer);
+ if (null != nodeMonitor)
+ {
+ nodeMonitor.setNfsServer(nfsServer);
+ }
// Add the servers to the configuration
@@ -152,6 +164,11 @@ public class NFSServerBean extends AbstractLifecycleBean
*/
public final void stopServer()
{
+ if (null != nodeMonitor)
+ {
+ nodeMonitor.setEnabled(false);
+ }
+
if (m_filesysConfig == null)
{
// initialisation failed
diff --git a/source/java/org/alfresco/filesys/NfsServerNodeMonitor.java b/source/java/org/alfresco/filesys/NfsServerNodeMonitor.java
new file mode 100644
index 0000000000..52013f9b60
--- /dev/null
+++ b/source/java/org/alfresco/filesys/NfsServerNodeMonitor.java
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2006-2011 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.filesys;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.filesys.repo.ContentContext;
+import org.alfresco.jlan.oncrpc.nfs.NFSServer;
+import org.alfresco.jlan.oncrpc.nfs.ShareDetails;
+import org.alfresco.jlan.server.core.DeviceContext;
+import org.alfresco.jlan.server.filesys.FileName;
+import org.alfresco.model.ContentModel;
+import org.alfresco.repo.node.NodeServicePolicies;
+import org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy;
+import org.alfresco.repo.node.NodeServicePolicies.OnDeleteNodePolicy;
+import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
+import org.alfresco.repo.policy.JavaBehaviour;
+import org.alfresco.repo.policy.PolicyComponent;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.repository.Path;
+import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
+import org.alfresco.service.cmr.security.PermissionService;
+import org.alfresco.service.namespace.QName;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.InitializingBean;
+
+/**
+ * Node monitor for NFS server which updates NFS cache on renaming or deleting nodes not through NFS protocol. This monitor may be dynamically enabled or disabled. It handles nodes
+ * for ${filesystem.name} device name
+ *
+ * @author Dmitry Velichkevich
+ */
+public class NfsServerNodeMonitor
+ implements
+ NodeServicePolicies.OnUpdatePropertiesPolicy,
+ NodeServicePolicies.BeforeDeleteNodePolicy,
+ NodeServicePolicies.OnDeleteNodePolicy,
+ InitializingBean
+{
+ private static final Logger LOGGER = Logger.getLogger(NfsServerNodeMonitor.class);
+
+ public static final char NIX_SEPARATOR = '/';
+ public static final String NIX_SEPARATOR_STR = "/";
+
+ //
+ // Not static fields (or bean properties)
+ //
+
+ private Boolean enabled;
+
+ private String targetDeviceName;
+
+ // Calculable value
+ private StoreRef targetStoreRef;
+
+ private List filesystemContexts;
+
+ private NodeService nodeService;
+ private PolicyComponent policyComponent;
+ private PermissionService permissionService;
+
+ /**
+ * Calculable value (see {@link NFSServerBean})
+ */
+ private NFSServer nfsServer;
+
+ private Map cachedNodes = new HashMap();
+
+ public NfsServerNodeMonitor()
+ {
+ }
+
+ /**
+ * Enables or disables policy handlers
+ *
+ * @param enabled {@link Boolean} value which determines working state of the handler
+ */
+ public void setEnabled(boolean enabled)
+ {
+ Object previousState = this.enabled;
+ this.enabled = enabled;
+ if (null != previousState)
+ {
+ initialize();
+ }
+ }
+
+ public Boolean isEnabled()
+ {
+ return enabled;
+ }
+
+ public void setTargetDeviceName(String targetDeviceName)
+ {
+ this.targetDeviceName = targetDeviceName;
+ }
+
+ public String getTargetDeviceName()
+ {
+ return targetDeviceName;
+ }
+
+ public void setFilesystemContexts(List filesystemContexts)
+ {
+ this.filesystemContexts = filesystemContexts;
+ }
+
+ public StoreRef getTargetStoreRef()
+ {
+ return targetStoreRef;
+ }
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ public void setPolicyComponent(PolicyComponent policyComponent)
+ {
+ this.policyComponent = policyComponent;
+ }
+
+ public void setPermissionService(PermissionService permissionService)
+ {
+ this.permissionService = permissionService;
+ }
+
+ public void setNfsServer(NFSServer nfsServer)
+ {
+ this.nfsServer = nfsServer;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception
+ {
+ initialize();
+ }
+
+ /**
+ * Performs all check on mandatory properties, searches for {@link StoreRef} for root path of target device and registers policy handlers for NFS cache updating on node
+ * properties updating and node deleting
+ */
+ private void initialize()
+ {
+ if (enabled)
+ {
+ if (null == filesystemContexts)
+ {
+ throw new AlfrescoRuntimeException("'filesystemContexts' property is not configured");
+ }
+ for (DeviceContext context : filesystemContexts)
+ {
+ if ((context instanceof ContentContext) && (null != context.getDeviceName()) && context.getDeviceName().equals(targetDeviceName))
+ {
+ ContentContext targetContext = (ContentContext) context;
+ if (null != targetContext.getStoreName())
+ {
+ targetStoreRef = new StoreRef(targetContext.getStoreName());
+ }
+ break;
+ }
+ }
+ if (null == targetStoreRef)
+ {
+ throw new AlfrescoRuntimeException("Target Store Reference can't be found for '" + targetDeviceName
+ + "' device name. Check correctness of 'targetDeviceName' and 'filesystemContexts' properties configurations");
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("StoreRef='" + targetStoreRef + "' was found for '" + targetDeviceName + "' device name");
+ }
+
+ policyComponent.bindClassBehaviour(OnDeleteNodePolicy.QNAME, this, new JavaBehaviour(this, "onDeleteNode"));
+ policyComponent.bindClassBehaviour(BeforeDeleteNodePolicy.QNAME, this, new JavaBehaviour(this, "beforeDeleteNode"));
+ policyComponent.bindClassBehaviour(OnUpdatePropertiesPolicy.QNAME, this, new JavaBehaviour(this, "onUpdateProperties"));
+ }
+ else
+ {
+ LOGGER.warn("NodeMonitor for NFS server is not enabled! Cache of NFS server will be never synchronized with target filesystem");
+ }
+ }
+
+ @Override
+ public void onUpdateProperties(NodeRef nodeRef, Map before, Map after)
+ {
+ if (enabled && (null != nfsServer) && targetStoreRef.equals(nodeRef.getStoreRef()))
+ {
+ int dbId = DefaultTypeConverter.INSTANCE.intValue(nodeService.getProperty(nodeRef, ContentModel.PROP_NODE_DBID));
+ if (null == findShareDetailsForId(dbId))
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Node with nodeRef='" + nodeRef + "' and dbId='" + dbId + "' is not in NFS server cache");
+ }
+
+ return;
+ }
+ cachedNodes.put(nodeRef, dbId);
+
+ String oldName = DefaultTypeConverter.INSTANCE.convert(String.class, before.get(ContentModel.PROP_NAME));
+ String newName = DefaultTypeConverter.INSTANCE.convert(String.class, after.get(ContentModel.PROP_NAME));
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("oldName='" + oldName + "', newName='" + newName + "'");
+ }
+
+ if (((null == oldName) && (null != newName)) || ((null != oldName) && !oldName.equals(newName)))
+ {
+ String path = buildRelativePath(nodeRef, newName);
+
+ updateNfsCache(nodeRef, path);
+ }
+ }
+ }
+
+ @Override
+ public void beforeDeleteNode(NodeRef nodeRef)
+ {
+ if (enabled && (null != nfsServer) && (null != nodeRef) && targetStoreRef.equals(nodeRef.getStoreRef()))
+ {
+ int dbId = DefaultTypeConverter.INSTANCE.intValue(nodeService.getProperty(nodeRef, ContentModel.PROP_NODE_DBID));
+ cachedNodes.put(nodeRef, dbId);
+ }
+ }
+
+ @Override
+ public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived)
+ {
+ NodeRef nodeRef = (null != childAssocRef) ? (childAssocRef.getChildRef()) : (null);
+ if (enabled && (null != nfsServer) && (null != nodeRef) && targetStoreRef.equals(nodeRef.getStoreRef()))
+ {
+ updateNfsCache(nodeRef, null);
+ }
+ }
+
+ /**
+ * Searches for {@link ShareDetails} to access NFS server cache for specific device name (e.g. 'Alfresco', 'AVM' etc)
+ *
+ * @param fileId - {@link Integer} value which contains fileId specific to device
+ * @return {@link ShareDetails} instance which contains fileId key in the cache or null if such instance was not found
+ */
+ private ShareDetails findShareDetailsForId(int fileId)
+ {
+ if ((null == nfsServer) || (null == nfsServer.getShareDetails()))
+ {
+ return null;
+ }
+
+ Hashtable details = nfsServer.getShareDetails().getShareDetails();
+ for (Integer key : details.keySet())
+ {
+ ShareDetails shareDetails = details.get(key);
+ if (null != shareDetails.getFileIdCache().findPath(fileId))
+ {
+ return shareDetails;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Builds path relative to NFS device name e.g. for the nfs.domain.name:/DeviceName/folder/document.doc method will return \folder\document.doc
+ *
+ * @param nodeRef - {@link NodeRef} instance for target node
+ * @param newName - {@link String} value which contains new name for the node
+ * @return {@link String} value of relative path
+ */
+ private String buildRelativePath(NodeRef nodeRef, String newName)
+ {
+ String result = null;
+ Path path = nodeService.getPath(nodeRef);
+ if (null != path)
+ {
+ StringBuilder newPath = new StringBuilder(path.toDisplayPath(nodeService, permissionService));
+ if ((NIX_SEPARATOR == newPath.charAt(0)) || (FileName.DOS_SEPERATOR == newPath.charAt(0)))
+ {
+ newPath.delete(0, 1);
+ }
+ int indexOfFirstSeparator = newPath.indexOf(NIX_SEPARATOR_STR);
+ indexOfFirstSeparator = (-1 == indexOfFirstSeparator) ? (newPath.indexOf(FileName.DOS_SEPERATOR_STR)) : (indexOfFirstSeparator);
+ char lastChar = newPath.charAt(newPath.length() - 1);
+ if ((FileName.DOS_SEPERATOR != lastChar) && (NIX_SEPARATOR != lastChar))
+ {
+ newPath.append(FileName.DOS_SEPERATOR);
+ }
+ if (-1 == indexOfFirstSeparator)
+ {
+ indexOfFirstSeparator = newPath.length() - 1;
+ }
+ newPath = newPath.append(newName).delete(0, indexOfFirstSeparator);
+ result = newPath.toString().replace(NIX_SEPARATOR, FileName.DOS_SEPERATOR);
+ }
+ return result;
+ }
+
+ /**
+ * Updates NFS cache for specified node. newPath equal to null determines that node should be deleted from the cache
+ *
+ * @param nodeRef - {@link NodeRef} value of the target node
+ * @param newPath - {@link String} value or null to determine new cache value for specified node
+ */
+ private void updateNfsCache(NodeRef nodeRef, String newPath)
+ {
+ int dbId = -1;
+ if (cachedNodes.containsKey(nodeRef))
+ {
+ dbId = (null != cachedNodes.get(nodeRef)) ? (cachedNodes.get(nodeRef)) : (-1);
+ cachedNodes.remove(nodeRef);
+ }
+ else
+ {
+ if (nodeService.exists(nodeRef))
+ {
+ dbId = DefaultTypeConverter.INSTANCE.intValue(nodeService.getProperty(nodeRef, ContentModel.PROP_NODE_DBID));
+ }
+ }
+
+ ShareDetails shareDetails = findShareDetailsForId(dbId);
+ if (null != shareDetails)
+ {
+ if (null != newPath)
+ {
+ shareDetails.getFileIdCache().addPath(dbId, newPath);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Path='" + newPath + "' in cache was set for NodeRef='" + nodeRef + "', dbId ='" + dbId + "'");
+ }
+ }
+ else
+ {
+ shareDetails.getFileIdCache().deletePath(dbId);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Cache field for node with NodeRef='" + nodeRef + "', dbId='" + dbId + "' was removed");
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof NfsServerNodeMonitor)
+ {
+ NfsServerNodeMonitor converted = (NfsServerNodeMonitor) obj;
+ return areEqual(targetDeviceName, converted.getTargetDeviceName()) && areEqual(targetStoreRef, converted.getTargetStoreRef());
+ }
+ return false;
+ }
+
+ private boolean areEqual(Object left, Object right)
+ {
+ return (null != left) ? (left.equals(right)) : (null == right);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = (null != targetDeviceName) ? (targetDeviceName.hashCode()) : (31);
+ return result * 37 + ((null != targetStoreRef) ? (targetStoreRef.hashCode()) : (43));
+ }
+}
diff --git a/source/java/org/alfresco/filesys/ServerConfigurationBean.java b/source/java/org/alfresco/filesys/ServerConfigurationBean.java
index e48eeb9cf0..21d6962aef 100644
--- a/source/java/org/alfresco/filesys/ServerConfigurationBean.java
+++ b/source/java/org/alfresco/filesys/ServerConfigurationBean.java
@@ -1414,17 +1414,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean {
ftpConfig.setFTPDebug(ftpDbg);
}
- // Check if IPv6 support should be enabled
-
- elem = config.getConfigElement("IPv6");
- if ( elem != null) {
-
- // Enable IPv6 support
-
- if ( elem.hasAttribute("state") && elem.getAttribute("state").equalsIgnoreCase("enabled"))
- ftpConfig.setIPv6Enabled( true);
- }
-
// Check if a character set has been specified
elem = config.getConfigElement( "charSet");
diff --git a/source/java/org/alfresco/filesys/alfresco/AlfrescoDiskDriver.java b/source/java/org/alfresco/filesys/alfresco/AlfrescoDiskDriver.java
index 2965e45f52..5376bfbcd3 100644
--- a/source/java/org/alfresco/filesys/alfresco/AlfrescoDiskDriver.java
+++ b/source/java/org/alfresco/filesys/alfresco/AlfrescoDiskDriver.java
@@ -158,6 +158,9 @@ public abstract class AlfrescoDiskDriver implements IOCtlInterface, Transactiona
/**
* Perform a retryable operation in a write transaction
+ *
+ * WARNING : side effect - that the current transaction, if any, is ended.
+ *
*
* @param sess
* the server session
diff --git a/source/java/org/alfresco/filesys/alfresco/DesktopAction.java b/source/java/org/alfresco/filesys/alfresco/DesktopAction.java
index bdaf963acd..78bea11196 100644
--- a/source/java/org/alfresco/filesys/alfresco/DesktopAction.java
+++ b/source/java/org/alfresco/filesys/alfresco/DesktopAction.java
@@ -19,15 +19,15 @@
package org.alfresco.filesys.alfresco;
-import java.io.File;
import java.io.IOException;
import org.alfresco.jlan.server.filesys.DiskSharedDevice;
-import org.alfresco.jlan.server.filesys.pseudo.LocalPseudoFile;
+import org.alfresco.jlan.server.filesys.pseudo.MemoryPseudoFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFile;
import org.alfresco.repo.admin.SysAdminParams;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.util.ResourceFinder;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.Resource;
@@ -108,7 +108,7 @@ public abstract class DesktopAction {
// Filesystem driver and context
- private AlfrescoDiskDriver m_filesysDriver;
+ protected AlfrescoDiskDriver m_filesysDriver;
private AlfrescoContext m_filesysContext;
// Webapp URL
@@ -400,35 +400,23 @@ public abstract class DesktopAction {
throw new DesktopActionException("Desktop action executable path not specified");
// Check that the application exists on the local filesystem
+
Resource resource = new ResourceFinder().getResource(m_path);
if (!resource.exists())
{
throw new DesktopActionException("Failed to find drag and drop application, " + m_path);
}
- // Decode the URL path, it might contain escaped characters
-
-
- // Check that the drag/drop file exists
- File appFile;
+ PseudoFile pseudoFile = null;
try
{
- appFile = resource.getFile();
-
- if (!appFile.exists())
- {
- throw new DesktopActionException("Drag and drop application not found, " + appFile);
- }
+ pseudoFile = new MemoryPseudoFile(m_filename, IOUtils.toByteArray(resource.getInputStream()));
}
catch (IOException e)
{
- throw new DesktopActionException("Unable to resolve drag and drop application as a file, "
- + resource.getDescription());
+ throw new DesktopActionException("Drag and drop application resource is invalid, " + resource.getDescription());
}
- // Create the pseudo file for the action
-
- PseudoFile pseudoFile = new LocalPseudoFile(m_filename, appFile.getAbsolutePath());
setPseudoFile(pseudoFile);
}
diff --git a/source/java/org/alfresco/filesys/alfresco/DesktopActionException.java b/source/java/org/alfresco/filesys/alfresco/DesktopActionException.java
index 195c1b655d..d49367f173 100644
--- a/source/java/org/alfresco/filesys/alfresco/DesktopActionException.java
+++ b/source/java/org/alfresco/filesys/alfresco/DesktopActionException.java
@@ -34,8 +34,8 @@ public class DesktopActionException extends Exception {
/**
* Class constructor
*
- * @param sts int
- * @param msg String
+ * @param sts numeric status code.
+ * @param msg readable error message
*/
public DesktopActionException(int sts, String msg)
{
diff --git a/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java b/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java
index 3dbc436866..53a2289b0f 100644
--- a/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java
+++ b/source/java/org/alfresco/filesys/alfresco/MultiTenantShareMapper.java
@@ -33,6 +33,7 @@ import org.alfresco.jlan.server.config.ConfigurationListener;
import org.alfresco.jlan.server.config.InvalidConfigurationException;
import org.alfresco.jlan.server.config.ServerConfiguration;
import org.alfresco.jlan.server.core.ShareMapper;
+import org.alfresco.jlan.server.core.ShareType;
import org.alfresco.jlan.server.core.SharedDevice;
import org.alfresco.jlan.server.core.SharedDeviceList;
import org.alfresco.jlan.server.filesys.DiskSharedDevice;
@@ -195,7 +196,8 @@ public class MultiTenantShareMapper implements ShareMapper, ConfigurationListene
// Check if this is a tenant user
- if ( m_alfrescoConfig.getTenantService().isEnabled() && m_alfrescoConfig.getTenantService().isTenantUser())
+ if ( m_alfrescoConfig.getTenantService().isEnabled() && m_alfrescoConfig.getTenantService().isTenantUser() &&
+ typ != ShareType.ADMINPIPE)
return findTenantShare(host, name, typ, sess, create);
// Find the required share by name/type. Use a case sensitive search first, if that fails use a case
diff --git a/source/java/org/alfresco/filesys/auth/cifs/EnterpriseCifsAuthenticator.java b/source/java/org/alfresco/filesys/auth/cifs/EnterpriseCifsAuthenticator.java
index 2ee6307686..362246174f 100644
--- a/source/java/org/alfresco/filesys/auth/cifs/EnterpriseCifsAuthenticator.java
+++ b/source/java/org/alfresco/filesys/auth/cifs/EnterpriseCifsAuthenticator.java
@@ -807,9 +807,16 @@ public class EnterpriseCifsAuthenticator extends CifsAuthenticatorBase implement
sess.removeSetupObject( client.getProcessId());
- // Convert to an access denied exception
+ // Convert to an access denied exception if necessary
- throw new SMBSrvException( SMBStatus.NTAccessDenied, SMBStatus.ErrDos, SMBStatus.DOSAccessDenied);
+ if (ex instanceof AlfrescoRuntimeException && ex.getCause() instanceof SMBSrvException)
+ {
+ throw (SMBSrvException) ex.getCause();
+ }
+ else
+ {
+ throw new SMBSrvException( SMBStatus.NTAccessDenied, SMBStatus.ErrDos, SMBStatus.DOSAccessDenied);
+ }
}
// Debug
diff --git a/source/java/org/alfresco/filesys/config/FTPConfigBean.java b/source/java/org/alfresco/filesys/config/FTPConfigBean.java
index f09ff9f0c3..ae829b48ff 100644
--- a/source/java/org/alfresco/filesys/config/FTPConfigBean.java
+++ b/source/java/org/alfresco/filesys/config/FTPConfigBean.java
@@ -56,9 +56,6 @@ public class FTPConfigBean
/** The authenticator. */
private FTPAuthenticator authenticator;
- /** Is IP v6 enabled? */
- private boolean ipv6Enabled;
-
// Data port range
private int dataPortFrom;
@@ -270,27 +267,6 @@ public class FTPConfigBean
this.authenticator = authenticator;
}
- /**
- * Checks if IP v6 is enabled.
- *
- * @return true if IP v6 is enabled
- */
- public boolean getIpv6Enabled()
- {
- return ipv6Enabled;
- }
-
- /**
- * Indicates whether IP v6 should be enabled.
- *
- * @param ipv6Enabled
- * true if IP v6 should be enabled
- */
- public void setIpv6Enabled(boolean ipv6Enabled)
- {
- this.ipv6Enabled = ipv6Enabled;
- }
-
/**
* Return the data port range from port
*
diff --git a/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java b/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java
index 01ddc49307..385850f565 100644
--- a/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java
+++ b/source/java/org/alfresco/filesys/config/ServerConfigurationBean.java
@@ -1256,10 +1256,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean
ftpConfig.setFTPDebug(ftpDbg);
}
- // Check if IPv6 support should be enabled
-
- ftpConfig.setIPv6Enabled(ftpConfigBean.getIpv6Enabled());
-
// Check if a character set has been specified
String charSet = ftpConfigBean.getCharSet();
diff --git a/source/java/org/alfresco/filesys/repo/CifsHelper.java b/source/java/org/alfresco/filesys/repo/CifsHelper.java
index e5c5dc38a7..d6b1612083 100644
--- a/source/java/org/alfresco/filesys/repo/CifsHelper.java
+++ b/source/java/org/alfresco/filesys/repo/CifsHelper.java
@@ -22,8 +22,10 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
@@ -68,11 +70,14 @@ public class CifsHelper
private MimetypeService mimetypeService;
private PermissionService permissionService;
private boolean isReadOnly;
+ private boolean setReadOnlyFlagOnFolders;
// Mark locked files as offline
private boolean lockedFilesAsOffline;
+ private Set excludedTypes = new HashSet();
+
/**
* Class constructor
*/
@@ -115,6 +120,14 @@ public class CifsHelper
return nodeService;
}
+ public void setExcludedTypes(List excludedTypes)
+ {
+ for(String exType:excludedTypes)
+ {
+ this.excludedTypes.add(QName.createQName(exType));
+ }
+ }
+
/**
* @return Returns true if all files/folders should be treated as read-only
*/
@@ -153,6 +166,19 @@ public class CifsHelper
return lockedFilesAsOffline;
}
+ /**
+ * Controls whether the read only flag is set on folders. This flag, when set, may cause problematic # behaviour in
+ * Windows clients and doesn't necessarily mean a folder can't be written to. See ALF-6727. Should we ever set the
+ * read only flag on folders?
+ *
+ * @param setReadOnlyFlagOnFolders
+ * the setReadOnlyFlagOnFolders to set
+ */
+ public void setSetReadOnlyFlagOnFolders(boolean setReadOnlyFlagOnFolders)
+ {
+ this.setReadOnlyFlagOnFolders = setReadOnlyFlagOnFolders;
+ }
+
/**
* @param serviceRegistry for repo connection
* @param nodeRef
@@ -292,14 +318,17 @@ public class CifsHelper
// Read/write access
- boolean deniedPermission = permissionService.hasPermission(nodeRef, PermissionService.WRITE) == AccessStatus.DENIED;
- if (isReadOnly || deniedPermission)
+ if (!fileFolderInfo.isFolder() || setReadOnlyFlagOnFolders)
{
- int attr = fileInfo.getFileAttributes();
- if (( attr & FileAttribute.ReadOnly) == 0)
+ boolean deniedPermission = permissionService.hasPermission(nodeRef, PermissionService.WRITE) == AccessStatus.DENIED;
+ if (isReadOnly || deniedPermission)
{
- attr += FileAttribute.ReadOnly;
- fileInfo.setFileAttributes(attr);
+ int attr = fileInfo.getFileAttributes();
+ if (( attr & FileAttribute.ReadOnly) == 0)
+ {
+ attr += FileAttribute.ReadOnly;
+ fileInfo.setFileAttributes(attr);
+ }
}
}
@@ -498,9 +527,19 @@ public class CifsHelper
// result storage
List results = new ArrayList(5);
+ List rubeResults = new ArrayList(5);
// kick off the path walking
- addDescendents(pathRootNodeRefs, pathElements, results);
+ addDescendents(pathRootNodeRefs, pathElements, rubeResults);
+
+ for (NodeRef nodeRef : rubeResults)
+ {
+ QName nodeType = nodeService.getType(nodeRef);
+ if (!excludedTypes.contains(nodeType))
+ {
+ results.add(nodeRef);
+ }
+ }
// done
if (logger.isDebugEnabled())
diff --git a/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java b/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java
index e36093fae0..24242d360e 100644
--- a/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java
+++ b/source/java/org/alfresco/filesys/repo/ContentDiskDriver.java
@@ -80,11 +80,15 @@ import org.alfresco.jlan.util.MemorySize;
import org.alfresco.jlan.util.WildCard;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.admin.SysAdminParams;
+import org.alfresco.repo.content.MimetypeMap;
+import org.alfresco.repo.content.encoding.ContentCharsetFinder;
import org.alfresco.repo.node.archive.NodeArchiveService;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationContext;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
+import org.alfresco.service.cmr.action.Action;
+import org.alfresco.service.cmr.action.ActionService;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.lock.LockService;
import org.alfresco.service.cmr.lock.LockType;
@@ -102,6 +106,7 @@ import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.AccessPermission;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.AuthenticationService;
+import org.alfresco.service.cmr.security.OwnableService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
@@ -120,7 +125,6 @@ import org.springframework.extensions.config.ConfigElement;
public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterface, FileLockingInterface, OpLockInterface, DiskSizeInterface
{
// Logging
-
private static final Log logger = LogFactory.getLog(ContentDiskDriver.class);
// Configuration key names
@@ -143,6 +147,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// File state attributes
public static final String AttrLinkNode = "ContentLinkNode";
+ public static final String CanDeleteWithoutPerms = "CanDeleteWithoutPerms";
// List of content properties to copy during rename
@@ -179,6 +184,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
private NodeArchiveService nodeArchiveService;
private LockService lockService;
private DictionaryService dictionaryService;
+ private OwnableService ownableService;
+ private ActionService actionService;
private AuthenticationContext authContext;
private AuthenticationService authService;
@@ -319,6 +326,15 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
return dictionaryService;
}
+ /**
+ * Get the ownable service
+ *
+ * @return OwnableService
+ */
+ public final OwnableService getOwnableService() {
+ return ownableService;
+ }
+
/**
* @param contentService the content service
*/
@@ -456,25 +472,35 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
this.dictionaryService = dictionaryService;
}
+ /**
+ * Set the ownable servive
+ *
+ * @param ownableService OwnableService
+ */
+ public void setOwnableService(OwnableService ownableService) {
+ this.ownableService = ownableService;
+ }
+
/**
* Parse and validate the parameter string and create a device context object for this instance
* of the shared device. The same DeviceInterface implementation may be used for multiple
* shares.
+ *
+ * WARNING: side effect, may commit or roll back current user transaction context.
*
- * @param shareName String
- * @param args ConfigElement
+ * @param deviceName The name of the device
+ * @param cfg ConfigElement the configuration of the device context.
* @return DeviceContext
* @exception DeviceContextException
*/
- public DeviceContext createContext(String shareName, ConfigElement cfg) throws DeviceContextException
+ // MER TODO - transaction handling in registerContext needs changing
+ public DeviceContext createContext(String deviceName, ConfigElement cfg) throws DeviceContextException
{
ContentContext context = null;
try
{
-
// Get the store
-
ConfigElement storeElement = cfg.getChild(KEY_STORE);
if (storeElement == null || storeElement.getValue() == null || storeElement.getValue().length() == 0)
{
@@ -495,7 +521,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Create the context
context = new ContentContext();
- context.setDeviceName(shareName);
+ context.setDeviceName(deviceName);
context.setStoreName(storeValue);
context.setRootPath(rootPath);
context.setSysAdminParams(this.sysAdminParams);
@@ -511,14 +537,18 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
String relPath = relativePathElement.getValue().replace( '/', FileName.DOS_SEPERATOR);
context.setRelativePath(relPath);
}
-
-
}
- catch (Exception ex)
+ /*
+ * MER - I changed the code below - resulted in a NPE anyway
+ * lower down
+ */
+ catch (DeviceContextException ex)
{
logger.error("Error during create context", ex);
+ throw ex;
+
}
-
+
// Check if URL link files are enabled
ConfigElement urlFileElem = cfg.getChild( "urlFile");
@@ -544,6 +574,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Install the node service monitor
+ // MER 01/03/2011 - I think one of these is the "wrong way round"
+
if ( cfg.getChild("disableNodeMonitor") == null) {
// Create the node monitor
@@ -571,9 +603,12 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
* of the shared device. The same DeviceInterface implementation may be used for multiple
* shares.
*
+ * WARNING: side effect, will commit or roll back current user transaction context.
+ *
* @param ctx the context
* @exception DeviceContextException
*/
+ // MER TODO - transaction handling in registerContext needs changing
@Override
public void registerContext(DeviceContext ctx) throws DeviceContextException
{
@@ -664,6 +699,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Commit the transaction
+ // MER 16/03/2010 - Why is this transaction management here?
tx.commit();
tx = null;
@@ -673,6 +709,10 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
catch (Exception ex)
{
logger.error("Error during create context", ex);
+
+ // MER BUGBUG Exception swallowed - will result in null pointer errors at best.
+ throw new DeviceContextException("unable to register context", ex);
+ // MER END
}
finally
{
@@ -1333,10 +1373,13 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
/**
* Check if the specified file exists, and whether it is a file or directory.
*
+ *
+ * WARNING: side effect, commit or roll back current user transaction context. Current transaction becomes read only.
+ *
* @param sess Server session
* @param tree Tree connection
- * @param name java.lang.String
- * @return int
+ * @param name the path of the file
+ * @return FileStatus (0: NotExist, 1 : FileExist, 2: DirectoryExists)
* @see FileStatus
*/
public int fileExists(SrvSession sess, TreeConnection tree, String name)
@@ -1655,78 +1698,78 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
logger.debug( " Fstate=" + fstate);
}
- throw new AccessDeniedException("Invalid access mode");
- }
-
- if ( fstate.getOpenCount() > 0) {
-
- // Check for impersonation security level from the original process that opened the file
-
- if ( params.getSecurityLevel() == WinNT.SecurityImpersonation && params.getProcessId() == fstate.getProcessId())
- nosharing = false;
-
- // Check if the caller wants read access, check the sharing mode
-
- else if ( params.isReadOnlyAccess() && (fstate.getSharedAccess() & SharingMode.READ) != 0)
- nosharing = false;
-
- // Check if the caller wants write access, check the sharing mode
-
- else if (( params.isReadWriteAccess() || params.isWriteOnlyAccess()) && (fstate.getSharedAccess() & SharingMode.WRITE) == 0)
- {
- // DEBUG
-
- if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Sharing mode disallows write access path=" + params.getPath());
-
- // Access not allowed
-
- throw new AccessDeniedException( "Sharing mode (write)");
- }
-
- // Check if the file has been opened for exclusive access
-
- else if ( fstate.getSharedAccess() == SharingMode.NOSHARING)
- nosharing = true;
-
- // Check if the required sharing mode is allowed by the current file open
-
- else if ( ( fstate.getSharedAccess() & params.getSharedAccess()) != params.getSharedAccess())
- nosharing = true;
-
- // Check if the caller wants exclusive access to the file
-
- else if ( params.getSharedAccess() == SharingMode.NOSHARING)
- nosharing = true;
-
- }
-
- // Check if the file allows shared access
-
- if ( nosharing == true)
- {
- if ( params.getPath().equals( "\\") == false) {
-
- // DEBUG
-
- if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Sharing violation path=" + params.getPath() + ", sharing=0x" + Integer.toHexString(fstate.getSharedAccess()));
-
- // File is locked by another user
-
- throw new FileSharingException("File already open, " + params.getPath());
- }
+ throw new AccessDeniedException("Invalid access mode");
}
-
- // Update the file sharing mode and process id, if this is the first file open
-
- fstate.setSharedAccess( params.getSharedAccess());
- fstate.setProcessId( params.getProcessId());
-
- // DEBUG
-
- if ( logger.isDebugEnabled() && fstate.getOpenCount() == 0 && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Path " + params.getPath() + ", sharing=0x" + Integer.toHexString(params.getSharedAccess()) + ", PID=" + params.getProcessId());
+
+ if ( fstate.getOpenCount() > 0) {
+
+ // Check for impersonation security level from the original process that opened the file
+
+ if ( params.getSecurityLevel() == WinNT.SecurityImpersonation && params.getProcessId() == fstate.getProcessId())
+ nosharing = false;
+
+ // Check if the caller wants read access, check the sharing mode
+
+ else if ( params.isReadOnlyAccess() && (fstate.getSharedAccess() & SharingMode.READ) != 0)
+ nosharing = false;
+
+ // Check if the caller wants write access, check the sharing mode
+
+ else if (( params.isReadWriteAccess() || params.isWriteOnlyAccess()) && (fstate.getSharedAccess() & SharingMode.WRITE) == 0)
+ {
+ // DEBUG
+
+ if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Sharing mode disallows write access path=" + params.getPath());
+
+ // Access not allowed
+
+ throw new AccessDeniedException( "Sharing mode (write)");
+ }
+
+ // Check if the file has been opened for exclusive access
+
+ else if ( fstate.getSharedAccess() == SharingMode.NOSHARING)
+ nosharing = true;
+
+ // Check if the required sharing mode is allowed by the current file open
+
+ else if ( ( fstate.getSharedAccess() & params.getSharedAccess()) != params.getSharedAccess())
+ nosharing = true;
+
+ // Check if the caller wants exclusive access to the file
+
+ else if ( params.getSharedAccess() == SharingMode.NOSHARING)
+ nosharing = true;
+
+ }
+
+ // Check if the file allows shared access
+
+ if ( nosharing == true)
+ {
+ if ( params.getPath().equals( "\\") == false) {
+
+ // DEBUG
+
+ if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Sharing violation path=" + params.getPath() + ", sharing=0x" + Integer.toHexString(fstate.getSharedAccess()));
+
+ // File is locked by another user
+
+ throw new FileSharingException("File already open, " + params.getPath());
+ }
+ }
+
+ // Update the file sharing mode and process id, if this is the first file open
+
+ fstate.setSharedAccess( params.getSharedAccess());
+ fstate.setProcessId( params.getProcessId());
+
+ // DEBUG
+
+ if ( logger.isDebugEnabled() && fstate.getOpenCount() == 0 && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Path " + params.getPath() + ", sharing=0x" + Integer.toHexString(params.getSharedAccess()) + ", PID=" + params.getProcessId());
}
// Check if the node is a link node
@@ -1736,68 +1779,68 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
if ( linkRef == null)
{
- // Check if the file is already opened by this client/process
-
- if ( tree.openFileCount() > 0) {
-
- // Search the open file table for this session/virtual circuit
-
- int idx = 0;
-
- while ( idx < tree.getFileTableLength() && netFile == null) {
-
- // Get the current file from the open file table
-
- NetworkFile curFile = tree.findFile( idx);
- if ( curFile != null && curFile instanceof ContentNetworkFile) {
-
- // Check if the file is the same path and process id
-
- ContentNetworkFile contentFile = (ContentNetworkFile) curFile;
- if ( contentFile.getProcessId() == params.getProcessId() &&
- contentFile.getFullName().equalsIgnoreCase( params.getFullPath())) {
-
- // Check that the access mode is the same
-
- if (( params.isReadWriteAccess() && contentFile.getGrantedAccess() == NetworkFile.READWRITE) ||
- ( params.isReadOnlyAccess() && contentFile.getGrantedAccess() == NetworkFile.READONLY)) {
-
- // Found a match, re-use the open file
-
- netFile = contentFile;
-
- // Increment the file open count, last file close will actually close the file/stream
-
- contentFile.incrementOpenCount();
-
- // DEBUG
-
- if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Re-use existing file open Path " + params.getPath() + ", PID=" + params.getProcessId() + ", params=" +
- ( params.isReadOnlyAccess() ? "ReadOnly" : "Write") + ", file=" +
- ( contentFile.getGrantedAccess() == NetworkFile.READONLY ? "ReadOnly" : "Write"));
- }
- else if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
- logger.debug("Not re-using file path=" + params.getPath() + ", readWrite=" + (params.isReadWriteAccess() ? "true" : "false") +
- ", readOnly=" + (params.isReadOnlyAccess() ? "true" : "false") +
- ", grantedAccess=" + contentFile.getGrantedAccessAsString());
- }
- }
-
- // Update the file table index
-
- idx++;
- }
- }
-
- // Create the network file, if we could not match an existing file open
-
- if ( netFile == null) {
-
- // Create a new network file for the open request
-
- netFile = ContentNetworkFile.createFile(nodeService, contentService, mimetypeService, cifsHelper, nodeRef, params, sess);
- }
+ // Check if the file is already opened by this client/process
+
+ if ( tree.openFileCount() > 0) {
+
+ // Search the open file table for this session/virtual circuit
+
+ int idx = 0;
+
+ while ( idx < tree.getFileTableLength() && netFile == null) {
+
+ // Get the current file from the open file table
+
+ NetworkFile curFile = tree.findFile( idx);
+ if ( curFile != null && curFile instanceof ContentNetworkFile) {
+
+ // Check if the file is the same path and process id
+
+ ContentNetworkFile contentFile = (ContentNetworkFile) curFile;
+ if ( contentFile.getProcessId() == params.getProcessId() &&
+ contentFile.getFullName().equalsIgnoreCase( params.getFullPath())) {
+
+ // Check that the access mode is the same
+
+ if (( params.isReadWriteAccess() && contentFile.getGrantedAccess() == NetworkFile.READWRITE) ||
+ ( params.isReadOnlyAccess() && contentFile.getGrantedAccess() == NetworkFile.READONLY)) {
+
+ // Found a match, re-use the open file
+
+ netFile = contentFile;
+
+ // Increment the file open count, last file close will actually close the file/stream
+
+ contentFile.incrementOpenCount();
+
+ // DEBUG
+
+ if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Re-use existing file open Path " + params.getPath() + ", PID=" + params.getProcessId() + ", params=" +
+ ( params.isReadOnlyAccess() ? "ReadOnly" : "Write") + ", file=" +
+ ( contentFile.getGrantedAccess() == NetworkFile.READONLY ? "ReadOnly" : "Write"));
+ }
+ else if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
+ logger.debug("Not re-using file path=" + params.getPath() + ", readWrite=" + (params.isReadWriteAccess() ? "true" : "false") +
+ ", readOnly=" + (params.isReadOnlyAccess() ? "true" : "false") +
+ ", grantedAccess=" + contentFile.getGrantedAccessAsString());
+ }
+ }
+
+ // Update the file table index
+
+ idx++;
+ }
+ }
+
+ // Create the network file, if we could not match an existing file open
+
+ if ( netFile == null) {
+
+ // Create a new network file for the open request
+
+ netFile = ContentNetworkFile.createFile(nodeService, contentService, mimetypeService, cifsHelper, nodeRef, params, sess);
+ }
}
else
{
@@ -1819,11 +1862,11 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
srvName = InetAddress.getLocalHost().getHostName();
}
- // Convert the target node to a path, convert to URL format
-
- String path = getPathForNode( tree, linkRef);
- path = path.replace( FileName.DOS_SEPERATOR, '/');
-
+ // Convert the target node to a path, convert to URL format
+
+ String path = getPathForNode( tree, linkRef);
+ path = path.replace( FileName.DOS_SEPERATOR, '/');
+
// Build the URL file data
StringBuilder urlStr = new StringBuilder();
@@ -1890,7 +1933,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Set the file access date/time, if available
if ( fstate.hasAccessDateTime())
- netFile.setAccessDate( fstate.getAccessDateTime());
+ netFile.setAccessDate( fstate.getAccessDateTime());
}
// Debug
@@ -1929,6 +1972,9 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
/**
* Create a new file on the file system.
*
+ *
+ * WARNING : side effect - closes current transaction context.
+ *
* @param sess Server session
* @param tree Tree connection
* @param params File create parameters
@@ -1983,6 +2029,10 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
}
// Create it - the path will be created, if necessary
+ if(logger.isDebugEnabled())
+ {
+ logger.debug("create new file" + path);
+ }
NodeRef nodeRef = cifsHelper.createNode(deviceRootNodeRef, path, ContentModel.TYPE_CONTENT);
nodeService.addAspect(nodeRef, ContentModel.ASPECT_NO_CONTENT, null);
@@ -2058,7 +2108,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Update the parent folder file state
if ( parentState != null)
- parentState.updateModifyDateTime();
+ parentState.updateModifyDateTime();
}
// Debug
@@ -2101,14 +2151,17 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Convert to a general I/O exception
- throw new IOException("Create file " + params.getFullPath());
+ throw new IOException("Create file " + params.getFullPath(), ex);
}
}
/**
* Create a new directory on this file system.
- *
+ *
+ *
+ * WARNING : side effect - closes current transaction context.
+ *
* @param sess Server session
* @param tree Tree connection.
* @param params Directory create parameters
@@ -2201,7 +2254,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Update the parent folder file state
if ( parentState != null)
- parentState.updateModifyDateTime();
+ parentState.updateModifyDateTime();
}
// Debug
@@ -2255,16 +2308,16 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
public NodeRef call() throws IOException
{
// Get the node for the folder
-
+
NodeRef nodeRef = cifsHelper.getNodeRef(deviceRootNodeRef, dir);
if (fileFolderService.exists(nodeRef))
{
// Check if the folder is empty
-
+
if ( cifsHelper.isFolderEmpty( nodeRef))
{
// Delete the folder node
-
+
fileFolderService.delete(nodeRef);
return nodeRef;
}
@@ -2277,7 +2330,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
}});
if (nodeRef != null && ctx.hasStateCache())
{
- // Remove the file state
+ // Remove the file state
ctx.getStateCache().removeFileState(dir);
@@ -2289,8 +2342,8 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Get the file state for the parent folder
FileState parentState = getStateForPath(tree, paths[0]);
- if ( parentState == null && ctx.hasStateCache())
- parentState = ctx.getStateCache().findFileState( paths[0], true);
+ if ( parentState == null && ctx.hasStateCache())
+ parentState = ctx.getStateCache().findFileState( paths[0], true);
// Update the modification timestamp
@@ -2306,7 +2359,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
catch (FileNotFoundException e)
{
// Debug
-
+
if (logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILE))
logger.debug("Delete directory - file not found, " + dir);
}
@@ -2344,13 +2397,13 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
*/
public void flushFile(SrvSession sess, TreeConnection tree, NetworkFile file) throws IOException
{
- // Debug
-
- ContentContext ctx = (ContentContext) tree.getContext();
-
- if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILEIO))
- logger.debug("Flush file=" + file.getFullName());
-
+ // Debug
+
+ ContentContext ctx = (ContentContext) tree.getContext();
+
+ if ( logger.isDebugEnabled() && ctx.hasDebug(AlfrescoContext.DBG_FILEIO))
+ logger.debug("Flush file=" + file.getFullName());
+
// Flush the file data
file.flushFile();
@@ -2365,7 +2418,12 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
* @exception java.io.IOException If an error occurs.
*/
public void closeFile(SrvSession sess, TreeConnection tree, final NetworkFile file) throws IOException
- {
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Close file: file" + file);
+ }
+
// Get the associated file state
final ContentContext ctx = (ContentContext) tree.getContext();
@@ -2374,15 +2432,15 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Check for a content file
if ( file instanceof ContentNetworkFile) {
-
+
// Update the file state
if ( ctx.hasStateCache())
{
FileState fstate = ctx.getStateCache().findFileState(file.getFullName());
if ( fstate != null) {
-
- // If the file open count is now zero then reset the stored sharing mode
+
+ // If the file open count is now zero then reset the stored sharing mode
if ( fstate.decrementOpenCount() == 0)
fstate.setSharedAccess( SharingMode.READWRITE + SharingMode.DELETE);
@@ -2390,7 +2448,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Check if there is a cached modification timestamp to be written out
if ( file.hasDeleteOnClose() == false && fstate.hasModifyDateTime() && fstate.hasFilesystemObject() && fstate.isDirectory() == false) {
-
+
// Update the modification date on the file/folder node
toUpdate = fstate;
}
@@ -2446,6 +2504,7 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
NodeRef nodeRef = ((NodeRefNetworkFile) file).getNodeRef();
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_NO_CONTENT))
{
+ logger.debug("No content - delete");
fileFolderService.delete(nodeRef);
}
}
@@ -2519,18 +2578,19 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
// Defer to the network file to close the stream and remove the content
- file.closeFile();
+ file.close();
// Remove the node if marked for delete
if (file.hasDeleteOnClose())
{
+ logger.debug("File has delete on close");
// Check if the file is a noderef based file
if ( file instanceof NodeRefNetworkFile)
{
NodeRefNetworkFile nodeNetFile = (NodeRefNetworkFile) file;
- NodeRef nodeRef = nodeNetFile.getNodeRef();
+ final NodeRef nodeRef = nodeNetFile.getNodeRef();
// We don't know how long the network file has had the reference, so check for existence
@@ -2543,12 +2603,32 @@ public class ContentDiskDriver extends AlfrescoDiskDriver implements DiskInterfa
try
{
// Delete the file
+ FileState fileState = ctx.getStateCache().findFileState(file.getFullName());
+ if (fileState!= null && fileState.findAttribute(CanDeleteWithoutPerms) != null)
+ {
+ //Has CanDeleteWithoutPerms attribute, so delete from system user
+ AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork