diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml
index fa4d0a5ad8..6e4e94014a 100644
--- a/config/alfresco/content-services-context.xml
+++ b/config/alfresco/content-services-context.xml
@@ -325,6 +325,38 @@
+
+
+
+
+
+ application/illustrator
+ image/jpeg
+
+
+ application/illustrator
+ image/png
+
+
+ application/illustrator
+ image/gif
+
+
+
+
+
+
+
+
+
+
+
+ image/png
+
+
+
+
diff --git a/config/alfresco/extension/video-thumbnail-context.xml.sample b/config/alfresco/extension/video-thumbnail-context.xml.sample
index 350dc0be08..ef03f3f3a4 100644
--- a/config/alfresco/extension/video-thumbnail-context.xml.sample
+++ b/config/alfresco/extension/video-thumbnail-context.xml.sample
@@ -237,7 +237,7 @@
-
+
diff --git a/config/alfresco/extension/video-transformation-context.xml.sample b/config/alfresco/extension/video-transformation-context.xml.sample
index 5778918f6b..093dd02920 100644
--- a/config/alfresco/extension/video-transformation-context.xml.sample
+++ b/config/alfresco/extension/video-transformation-context.xml.sample
@@ -358,7 +358,7 @@
audio/x-aiff
- audio/x-mpeg
+ audio/mpeg
@@ -366,7 +366,7 @@
audio/basic
- audio/x-mpeg
+ audio/mpeg
@@ -374,7 +374,7 @@
audio/x-wav
- audio/x-mpeg
+ audio/mpeg
@@ -382,7 +382,7 @@
audio/ogg
- audio/x-mpeg
+ audio/mpeg
diff --git a/config/alfresco/messages/action-config_de.properties b/config/alfresco/messages/action-config_de.properties
index 1441cc1439..ab51804737 100755
--- a/config/alfresco/messages/action-config_de.properties
+++ b/config/alfresco/messages/action-config_de.properties
@@ -68,7 +68,7 @@ remove-features.title=Aspekt entfernen
remove-features.description=Damit wird ein Aspekt aus dem passenden Element entfernt.
remove-features.aspect-name.display-label=Aspekt
-simple-workflow.title=Einfachen Workflow hinzuf\u00fcgen
+simple-workflow.title=Einfachen Workflow hinzuf\u00fcgen.
simple-workflow.description=Hiermit wird ein einfacher Workflow zu dem passenden Element hinzugef\u00fcgt. Damit kann das Element f\u00fcr den n\u00e4chsten Schritt in einem Workflow in einen anderen Raum verschoben werden. Wenn Sie einen Schritt ablehnen wollen, k\u00f6nnen Sie auch einen Raum angeben, in den verschoben werden soll.
simple-workflow.approve-step.display-label=Schritt zustimmen
simple-workflow.approve-folder.display-label=Ordner Schritt zustimmen
@@ -182,7 +182,7 @@ simple-avm-submit.description=Damit werden neuere Knoten im passenden Element im
simple-avm-promote.title=Einfache Sandbox Bef\u00f6rderung
simple-avm-promote.description=Damit werden neuere Knoten im passenden Element in die angegebene Ziel-Sandbox bef\u00f6rdert.
-simple-avm-promote.target-store.display-label=Name des AVM-Zielspeichers.
+simple-avm-promote.target-store.display-label=Name des AVM-Zielspeichers
avm-revert-store.title=Einen Single Knoten in einem Speicher zur\u00fccksetzen.
avm-revert-store.description=Damit werden alle Knoten einschlie\u00dflich des und nach dem Argument-Knoten in eine vorherige Version zur\u00fcckgesetzt.
diff --git a/config/alfresco/messages/action-config_fr.properties b/config/alfresco/messages/action-config_fr.properties
index 86e2ae2982..5d95ddff3b 100755
--- a/config/alfresco/messages/action-config_fr.properties
+++ b/config/alfresco/messages/action-config_fr.properties
@@ -15,7 +15,7 @@ ac-content-properties.size=Taille
# Action conditions
no-condition.title=Tous les \u00e9l\u00e9ments
-no-condition.description=Cette condition correspondra \u00e0 tout \u00e9l\u00e9ment de contenu ajout\u00e9 \u00e0 l'espace. Utiliser celle-ci quand vous souhaitez appliquer une action \u00e0 tout ce qui est ajout\u00e9 \u00e0 l'espace.
+no-condition.description=Cette condition correspondra \u00e0 tout \u00e9l\u00e9ment de contenu ajout\u00e9 \u00e0 l'espace. Utiliser la quand vous souhaitez appliquer une action \u00e0 tout ce qui est ajout\u00e9 \u00e0 l'espace.
compare-property-value.title=Le nom contient une valeur
compare-property-value.description=La r\u00e8gle s'applique \u00e0 tous les \u00e9l\u00e9ments dont les noms pr\u00e9sentent une valeur sp\u00e9cifique.
@@ -30,7 +30,7 @@ in-category.category-aspect.display-label=Aspect de la cat\u00e9gorie
in-category.category-value.display-label=Valeur de la cat\u00e9gorie
is-subtype.title=Contenu du type ou du sous-type
-is-subtype.description=La r\u00e8gle est appliqu\u00e9e \u00e0 tout \u00e9l\u00e9ment appartenant \u00e0 un type ou un sous-type sp\u00e9cifique
+is-subtype.description=La r\u00e8gle est appliqu\u00e9e \u00e0 tout les \u00e9l\u00e9ments pour lesquels l'aspect sp\u00e9cifi\u00e9 est associ\u00e9.
is-subtype.type.display-label=Type
has-aspect.title=Poss\u00e8de un aspect
@@ -184,7 +184,7 @@ simple-avm-promote.title=Simple transfert vers un bac \u00e0 sable
simple-avm-promote.description=Transf\u00e8re tout nouveau noeud de l'\u00e9l\u00e9ment dans le bac \u00e0 sable s\u00e9lectionn\u00e9.
simple-avm-promote.target-store.display-label=Nom du magasin AVM cible.
-avm-revert-store.title=R\u00e9tablir un noeud simple dans un magasin.
+avm-revert-store.title=R\u00e9tablir un noeud unique dans un magasin.
avm-revert-store.description=R\u00e9tablit une version pr\u00e9c\u00e9dente du noeud indiqu\u00e9 et des noeuds inf\u00e9rieurs.
avm-revert-store.version.display-label=Version \u00e0 r\u00e9tablir.
diff --git a/config/alfresco/messages/action-config_it.properties b/config/alfresco/messages/action-config_it.properties
index 3d3c09b4a4..d49f49e776 100755
--- a/config/alfresco/messages/action-config_it.properties
+++ b/config/alfresco/messages/action-config_it.properties
@@ -8,7 +8,7 @@ ac-compare-operations.greater_than_equal=\u00c8 maggiore di o uguale a
ac-compare-operations.less_than=\u00c8 minore di
ac-compare-operations.less_than_equal=\u00c8 minore di o uguale a
-ac-content-properties.mime_type=Mimetype
+ac-content-properties.mime_type=Tipo MIME
ac-content-properties.encoding=Codifica
ac-content-properties.size=Dimensioni
@@ -37,10 +37,10 @@ has-aspect.title=Ha l'aspetto
has-aspect.description=La regola viene applicata a tutti gli elementi con l'aspetto specificato.
has-aspect.aspect.display-label=Aspetto
-compare-mime-type.title=Contenuto di mimetype
-compare-mime-type.description=La regola viene applicata a tutti gli elementi il cui contenuto \u00e8 del mimetype specificato.
+compare-mime-type.title=Contenuto del Tipo MIME
+compare-mime-type.description=La regola viene applicata a tutti gli elementi il cui contenuto \u00e8 del Tipo MIME specificato.
compare-mime-type.property.display-label=Propriet\u00e0
-compare-mime-type.value.display-label=Mimetype
+compare-mime-type.value.display-label=Tipo MIME
composite-condition.title=Condizione composita
composite-condition.description=Combina pi\u00f9 condizioni in modo da creare una condizione pi\u00f9 complessa.
@@ -84,7 +84,7 @@ link-category.category-value.display-label=Valore della categoria
transform.title=Trasforma e copia contenuto
transform.description=Trasforma il contenuto corrispondente e copia il risultato in uno spazio specifico
-transform.mime-type.display-label=Mimetype
+transform.mime-type.display-label=Tipo MIME
transform.destination-folder.display-label=Cartella di destinazione
transform.assoc-type.display-label=Tipo di associazione
transform.assoc-name.display-label=Nome di associazione
@@ -92,7 +92,7 @@ transform.overwrite-copy.display-label=Sovrascrivi copia
transform-image.title=Trasforma e copia immagine
transform-image.description=Trasforma l'immagine corrispondente e copia il risultato in uno spazio specifico
-transform-image.mime-type.display-label=Mimetype
+transform-image.mime-type.display-label=Tipo MIME
transform-image.destination-folder.display-label=Cartella di destinazione
transform-image.assoc-type.display-label=Tipo di associazione
transform-image.assoc-name.display-label=Nome di associazione
diff --git a/config/alfresco/messages/bootstrap-spaces_fr.properties b/config/alfresco/messages/bootstrap-spaces_fr.properties
index 9e71f6d743..53f7d07843 100755
--- a/config/alfresco/messages/bootstrap-spaces_fr.properties
+++ b/config/alfresco/messages/bootstrap-spaces_fr.properties
@@ -102,7 +102,7 @@ version.french=Version fran\u00e7aise
version.german=Version allemande
version.italian=Version italienne
version.japanese=Version japonaise
-version.spanish=Version espagnol
+version.spanish=Version espagnole
spaces.web.client.extension.name=Extension client Web
spaces.web.client.extension.title=Client Web personnalis\u00e9
diff --git a/config/alfresco/messages/content-model_es.properties b/config/alfresco/messages/content-model_es.properties
index f96c805061..a4d8eb0621 100755
--- a/config/alfresco/messages/content-model_es.properties
+++ b/config/alfresco/messages/content-model_es.properties
@@ -34,7 +34,7 @@ cm_contentmodel.type.cm_person.title=Persona
cm_contentmodel.type.cm_person.description=Persona
cm_contentmodel.property.cm_userName.title=Nombre de usuario
-cm_contentmodel.property.cm_userName.description=Nombre de usuario de la persona
+cm_contentmodel.property.cm_userName.description=Nombre de usuario de la user/usuario
cm_contentmodel.property.cm_homeFolder.title=Carpeta de inicio
cm_contentmodel.property.cm_homeFolder.description=Carpeta de inicio de la persona
cm_contentmodel.property.cm_firstName.title=Nombre
@@ -45,12 +45,12 @@ cm_contentmodel.property.cm_middleName.title=Segundo nombre
cm_contentmodel.property.cm_middleName.description=Segundo nombre de la persona
cm_contentmodel.property.cm_email.title=Direcci\u00f3n de correo electr\u00f3nico
cm_contentmodel.property.cm_email.description=Direcci\u00f3n de correo electr\u00f3nico de la persona
-cm_contentmodel.property.cm_homeFolderProvider.title=Carpeta de inicio de proveedor
-cm_contentmodel.property.cm_homeFolderProvider.description=Carpeta de inicio de proveedor
+cm_contentmodel.property.cm_homeFolderProvider.title=Proveedor de carpeta de inicio
+cm_contentmodel.property.cm_homeFolderProvider.description=Proveedor de carpeta de inicio
cm_contentmodel.property.cm_defaultHomeFolderPath.title=Ruta de la carpeta de inicio
cm_contentmodel.property.cm_defaultHomeFolderPath.description=Ruta a la carpeta de inicio de la persona
-cm_contentmodel.property.cm_presenceProvider.title=Proveedor de Presense
-cm_contentmodel.property.cm_presenceProvider.description=Proveedor de Presense
+cm_contentmodel.property.cm_presenceProvider.title=Proveedor de Presencia
+cm_contentmodel.property.cm_presenceProvider.description=Proveedor de Presencia
cm_contentmodel.property.cm_presenceUsername.title=Nombre de usuario de Presense
cm_contentmodel.property.cm_presenceUsername.description=Nombre de usuario de Presense
cm_contentmodel.property.cm_jobtitle.title=Cargo
diff --git a/config/alfresco/messages/content-model_it.properties b/config/alfresco/messages/content-model_it.properties
index 9a74247f84..ff5e50ca14 100755
--- a/config/alfresco/messages/content-model_it.properties
+++ b/config/alfresco/messages/content-model_it.properties
@@ -91,7 +91,7 @@ cm_contentmodel.property.cm_userStatusTime.title=Ora stato
cm_contentmodel.property.cm_userStatusTime.description=Ora ultimo aggiornamento dello stato della persona
cm_contentmodel.property.cm_googleusername.title=Nome utente Google
cm_contentmodel.property.cm_googleusername.description=Nome utente Google della persona
-cm_contentmodel.property.cm_sizeCurrent.title=Uso
+cm_contentmodel.property.cm_sizeCurrent.title=Utilizzo
cm_contentmodel.property.cm_sizeCurrent.description=Quantit\u00e0 di spazio su disco utilizzata dalla persona
cm_contentmodel.property.cm_sizeQuota.title=Quota
cm_contentmodel.property.cm_sizeQuota.description=Quantit\u00e0 massima di spazio su disco utilizzabile dalla persona
@@ -110,8 +110,8 @@ cm_contentmodel.type.cm_category.description=Categoria
cm_contentmodel.association.cm_subcategories.title=Categorie
cm_contentmodel.association.cm_subcategories.description=Sottocategorie della categoria
-cm_contentmodel.aspect.cm_titled.title=Titled
-cm_contentmodel.aspect.cm_titled.description=Titled
+cm_contentmodel.aspect.cm_titled.title=Titolato
+cm_contentmodel.aspect.cm_titled.description=Titolato
cm_contentmodel.property.cm_title.title=Titolo
cm_contentmodel.property.cm_title.description=Titolo del contenuto
cm_contentmodel.property.cm_description.title=Descrizione
diff --git a/config/alfresco/messages/data-list-model.properties b/config/alfresco/messages/data-list-model.properties
index bc679b3897..5a4dd7012d 100755
--- a/config/alfresco/messages/data-list-model.properties
+++ b/config/alfresco/messages/data-list-model.properties
@@ -18,6 +18,7 @@ dl_datalistmodel.property.dl_todoPriority.title=Priority
dl_datalistmodel.property.dl_todoStatus.title=Status
dl_datalistmodel.property.dl_todoNotes.title=Notes
dl_datalistmodel.association.dl_assignee.title=Assignee
+dl_datalistmodel.association.dl_attachments.title=Attachments
# Gantt Aspect
dl_datalistmodel.property.dl_ganttStartDate.title=Start Date
@@ -30,7 +31,7 @@ dl_datalistmodel.type.dl_task.description=Advanced tasks list including title, d
dl_datalistmodel.property.dl_taskPriority.title=Priority
dl_datalistmodel.property.dl_taskStatus.title=Status
dl_datalistmodel.property.dl_taskComments.title=Comments
-dl_datalistmodel.property.dl_taskAssignee.title=Assignee
+dl_datalistmodel.association.dl_taskAssignee.title=Assignee
# Task List (Simple)
dl_datalistmodel.type.dl_simpletask.title=Task List (Simple)
@@ -61,8 +62,7 @@ dl_datalistmodel.property.dl_issuePriority.title=Priority
dl_datalistmodel.property.dl_issueDescription.title=Description
dl_datalistmodel.property.dl_issueDueDate.title=Due Date
dl_datalistmodel.property.dl_issueComments.title=Comments
-dl_datalistmodel.property.dl_issueAssignedTo.title=Assigned To
-dl_datalistmodel.property.dl_issueRelatedIssues.title=Related Issues
+dl_datalistmodel.association.dl_issueAssignedTo.title=Assigned To
# Event
dl_datalistmodel.type.dl_event.title=Event List
diff --git a/config/alfresco/messages/data-list-model_de.properties b/config/alfresco/messages/data-list-model_de.properties
index a45d849d04..b5904a5d66 100755
--- a/config/alfresco/messages/data-list-model_de.properties
+++ b/config/alfresco/messages/data-list-model_de.properties
@@ -11,17 +11,18 @@ dl_datalistmodel.type.dl_dataListItem.description=Elterntyp, von dem Mustertypen
## Simple "To do" List
dl_datalistmodel.type.dl_todoList.title=Liste zu erledigender Aufgaben
-dl_datalistmodel.type.dl_todoList.description=Einfache Liste zu erledigender Aufgaben mit optionalem Bevollm\u00e4chtigten
+dl_datalistmodel.type.dl_todoList.description=Einfache Liste zu erledigender Aufgaben mit optionalem Bevollm\u00e4chtigten.
dl_datalistmodel.property.dl_todoTitle.title=Titel
dl_datalistmodel.property.dl_todoDueDate.title=F\u00e4lligkeitsdatum
dl_datalistmodel.property.dl_todoPriority.title=Priorit\u00e4t
dl_datalistmodel.property.dl_todoStatus.title=Status
dl_datalistmodel.property.dl_todoNotes.title=Notizen
dl_datalistmodel.association.dl_assignee.title=Bevollm\u00e4chtigter
+dl_datalistmodel.association.dl_attachments.title=Anlagen
# Gantt Aspect
dl_datalistmodel.property.dl_ganttStartDate.title=Anfangsdatum
-dl_datalistmodel.property.dl_ganttEndDate.title=Ende Datum
+dl_datalistmodel.property.dl_ganttEndDate.title=Enddatum
dl_datalistmodel.property.dl_ganttPercentComplete.title=% Abgeschlossen
# Task List (Advanced)
@@ -30,11 +31,11 @@ dl_datalistmodel.type.dl_task.description=Erweiterte Aufgabenliste einschlie\u00
dl_datalistmodel.property.dl_taskPriority.title=Priorit\u00e4t
dl_datalistmodel.property.dl_taskStatus.title=Status
dl_datalistmodel.property.dl_taskComments.title=Kommentare
-dl_datalistmodel.property.dl_taskAssignee.title=Bevollm\u00e4chtigter
+dl_datalistmodel.association.dl_taskAssignee.title=Bevollm\u00e4chtigter
# Task List (Simple)
dl_datalistmodel.type.dl_simpletask.title=Aufgabenliste (Einfach)
-dl_datalistmodel.type.dl_simpletask.description=Einfache Aufgabenliste einschlie\u00dflich Titel, Beschreibung, F\u00e4lligkeitsdatum, Priorit\u00e4t, Status, Kommentaren
+dl_datalistmodel.type.dl_simpletask.description=Einfache Aufgabenliste einschlie\u00dflich Titel, Beschreibung, F\u00e4lligkeitsdatum, Priorit\u00e4t, Status, Kommentaren
dl_datalistmodel.property.dl_simpletaskDueDate.title=F\u00e4lligkeitsdatum
dl_datalistmodel.property.dl_simpletaskPriority.title=Priorit\u00e4t
dl_datalistmodel.property.dl_simpletaskStatus.title=Status
@@ -61,13 +62,12 @@ dl_datalistmodel.property.dl_issuePriority.title=Priorit\u00e4t
dl_datalistmodel.property.dl_issueDescription.title=Beschreibung
dl_datalistmodel.property.dl_issueDueDate.title=F\u00e4lligkeitsdatum
dl_datalistmodel.property.dl_issueComments.title=Kommentare
-dl_datalistmodel.property.dl_issueAssignedTo.title=Zugewiesen an
-dl_datalistmodel.property.dl_issueRelatedIssues.title=\u00c4hnliche Elemente
+dl_datalistmodel.association.dl_issueAssignedTo.title=Zugewiesen an
# Event
dl_datalistmodel.type.dl_event.title=Ereignisliste
dl_datalistmodel.type.dl_event.description=Ereignisliste einschlie\u00dflich Titel, Beschreibung, Ort, Anfangs- und Enddatum/-zeit
-dl_datalistmodel.property.dl_eventLocation.title=Ort
+dl_datalistmodel.property.dl_eventLocation.title=Speicherort
dl_datalistmodel.property.dl_eventStartDate.title=Anfangsdatum
dl_datalistmodel.property.dl_eventEndDate.title=Enddatum
dl_datalistmodel.property.dl_eventRegistrations.title=Registrierungen
@@ -100,4 +100,4 @@ dl_datalistmodel.property.dl_eventAgendaEndTime.title=Endzeit
dl_datalistmodel.property.dl_eventAgendaSessionName.title=Name der Sitzung
dl_datalistmodel.property.dl_eventAgendaPresenter.title=Pr\u00e4sentator
dl_datalistmodel.property.dl_eventAgendaAudience.title=Publikum
-dl_datalistmodel.property.dl_eventAgendaNotes.title=Notizen
+dl_datalistmodel.property.dl_eventAgendaNotes.title=Notizen
\ No newline at end of file
diff --git a/config/alfresco/messages/data-list-model_es.properties b/config/alfresco/messages/data-list-model_es.properties
index 9e92d13611..0d980db2fa 100755
--- a/config/alfresco/messages/data-list-model_es.properties
+++ b/config/alfresco/messages/data-list-model_es.properties
@@ -17,7 +17,8 @@ dl_datalistmodel.property.dl_todoDueDate.title=Fecha de vencimiento
dl_datalistmodel.property.dl_todoPriority.title=Prioridad
dl_datalistmodel.property.dl_todoStatus.title=Estado
dl_datalistmodel.property.dl_todoNotes.title=Notas
-dl_datalistmodel.association.dl_assignee.title=Usuario a asignar la tarea
+dl_datalistmodel.association.dl_assignee.title=Asignado a
+dl_datalistmodel.association.dl_attachments.title=Adjuntos
# Gantt Aspect
dl_datalistmodel.property.dl_ganttStartDate.title=Fecha de inicio
@@ -30,7 +31,7 @@ dl_datalistmodel.type.dl_task.description=Lista de tareas avanzada, incluyendo t
dl_datalistmodel.property.dl_taskPriority.title=Prioridad
dl_datalistmodel.property.dl_taskStatus.title=Estado
dl_datalistmodel.property.dl_taskComments.title=Comentarios
-dl_datalistmodel.property.dl_taskAssignee.title=Usuario a asignar la tarea
+dl_datalistmodel.association.dl_taskAssignee.title=Asignado a
# Task List (Simple)
dl_datalistmodel.type.dl_simpletask.title=Lista de tareas (sencillas)
@@ -61,8 +62,7 @@ dl_datalistmodel.property.dl_issuePriority.title=Prioridad
dl_datalistmodel.property.dl_issueDescription.title=Descripci\u00f3n
dl_datalistmodel.property.dl_issueDueDate.title=Fecha de vencimiento
dl_datalistmodel.property.dl_issueComments.title=Comentarios
-dl_datalistmodel.property.dl_issueAssignedTo.title=Asignado a
-dl_datalistmodel.property.dl_issueRelatedIssues.title=Temas relacionados
+dl_datalistmodel.association.dl_issueAssignedTo.title=Asignado a
# Event
dl_datalistmodel.type.dl_event.title=Lista de eventos
@@ -100,4 +100,4 @@ dl_datalistmodel.property.dl_eventAgendaEndTime.title=Hora de fin
dl_datalistmodel.property.dl_eventAgendaSessionName.title=Nombre de sesi\u00f3n
dl_datalistmodel.property.dl_eventAgendaPresenter.title=Participante
dl_datalistmodel.property.dl_eventAgendaAudience.title=Audiencia
-dl_datalistmodel.property.dl_eventAgendaNotes.title=Notas
+dl_datalistmodel.property.dl_eventAgendaNotes.title=Notas
\ No newline at end of file
diff --git a/config/alfresco/messages/data-list-model_fr.properties b/config/alfresco/messages/data-list-model_fr.properties
index ce8a674aa0..d9652382a3 100755
--- a/config/alfresco/messages/data-list-model_fr.properties
+++ b/config/alfresco/messages/data-list-model_fr.properties
@@ -13,14 +13,15 @@ dl_datalistmodel.type.dl_dataListItem.description=Type parent \u00e0 partir duqu
dl_datalistmodel.type.dl_todoList.title=Liste de t\u00e2ches
dl_datalistmodel.type.dl_todoList.description=Une liste de t\u00e2ches avec acteur facultatif.
dl_datalistmodel.property.dl_todoTitle.title=Titre
-dl_datalistmodel.property.dl_todoDueDate.title=Ech\u00e9ance
+dl_datalistmodel.property.dl_todoDueDate.title=Date d'\u00e9ch\u00e9ance
dl_datalistmodel.property.dl_todoPriority.title=Priorit\u00e9
-dl_datalistmodel.property.dl_todoStatus.title=Etat
+dl_datalistmodel.property.dl_todoStatus.title=Statut
dl_datalistmodel.property.dl_todoNotes.title=Notes
dl_datalistmodel.association.dl_assignee.title=Personne assign\u00e9e
+dl_datalistmodel.association.dl_attachments.title=El\u00e9ments attach\u00e9s
# Gantt Aspect
-dl_datalistmodel.property.dl_ganttStartDate.title=Date de d\u00e9but
+dl_datalistmodel.property.dl_ganttStartDate.title=Date de D\u00e9but
dl_datalistmodel.property.dl_ganttEndDate.title=Date de fin
dl_datalistmodel.property.dl_ganttPercentComplete.title=% achev\u00e9
@@ -28,16 +29,16 @@ dl_datalistmodel.property.dl_ganttPercentComplete.title=% achev\u00e9
dl_datalistmodel.type.dl_task.title=Liste de t\u00e2ches (avanc\u00e9es)
dl_datalistmodel.type.dl_task.description=Liste de t\u00e2ches avanc\u00e9es comprenant le titre, la description, les dates de d\u00e9but et de fin, la priorit\u00e9, le statut, les commentaires, les acteurs et les pi\u00e8ces jointes.
dl_datalistmodel.property.dl_taskPriority.title=Priorit\u00e9
-dl_datalistmodel.property.dl_taskStatus.title=Etat
+dl_datalistmodel.property.dl_taskStatus.title=Statut
dl_datalistmodel.property.dl_taskComments.title=Commentaires
-dl_datalistmodel.property.dl_taskAssignee.title=Personne assign\u00e9e
+dl_datalistmodel.association.dl_taskAssignee.title=Personne assign\u00e9e
# Task List (Simple)
dl_datalistmodel.type.dl_simpletask.title=Liste de t\u00e2ches (simples)
dl_datalistmodel.type.dl_simpletask.description=Liste de t\u00e2ches simples comprenant le titre, la description, la date d'\u00e9ch\u00e9ance, la priorit\u00e9, le statut et les commentaires.
-dl_datalistmodel.property.dl_simpletaskDueDate.title=Ech\u00e9ance
+dl_datalistmodel.property.dl_simpletaskDueDate.title=Date d'\u00e9ch\u00e9ance
dl_datalistmodel.property.dl_simpletaskPriority.title=Priorit\u00e9
-dl_datalistmodel.property.dl_simpletaskStatus.title=Etat
+dl_datalistmodel.property.dl_simpletaskStatus.title=Statut
dl_datalistmodel.property.dl_simpletaskComments.title=Commentaires
# Contact
@@ -56,13 +57,12 @@ dl_datalistmodel.property.dl_contactNotes.title=Notes
dl_datalistmodel.type.dl_issue.title=Liste de publications
dl_datalistmodel.type.dl_issue.description=Liste de publications comprenant l'identifiant, le statut, la priorit\u00e9, la description, la date d'\u00e9ch\u00e9ance, les commentaires, l'assignation et les publications apparent\u00e9es.
dl_datalistmodel.property.dl_issueID.title=Identifiant de publication
-dl_datalistmodel.property.dl_issueStatus.title=Etat
+dl_datalistmodel.property.dl_issueStatus.title=Statut
dl_datalistmodel.property.dl_issuePriority.title=Priorit\u00e9
dl_datalistmodel.property.dl_issueDescription.title=Description
-dl_datalistmodel.property.dl_issueDueDate.title=Ech\u00e9ance
+dl_datalistmodel.property.dl_issueDueDate.title=Date d'\u00e9ch\u00e9ance
dl_datalistmodel.property.dl_issueComments.title=Commentaires
-dl_datalistmodel.property.dl_issueAssignedTo.title=Assign\u00e9 \u00e0
-dl_datalistmodel.property.dl_issueRelatedIssues.title=Publications apparent\u00e9es
+dl_datalistmodel.association.dl_issueAssignedTo.title=Assign\u00e9 \u00e0
# Event
dl_datalistmodel.type.dl_event.title=Liste d'\u00e9v\u00e9nements
@@ -77,8 +77,8 @@ dl_datalistmodel.property.dl_eventNote.title=Notes
dl_datalistmodel.type.dl_location.title=Carnet d'adresses
dl_datalistmodel.type.dl_location.description=Carnet d'adresses
dl_datalistmodel.property.dl_locationAddress1.title=Adresse (ligne\u00a01)
-dl_datalistmodel.property.dl_locationAddress2.title=Adresse (ligne\u00a02)
-dl_datalistmodel.property.dl_locationAddress3.title=Adresse (ligne\u00a03)
+dl_datalistmodel.property.dl_locationAddress2.title=Adresse (ligne 2)
+dl_datalistmodel.property.dl_locationAddress3.title=Adresse (ligne 3)
dl_datalistmodel.property.dl_locationZip.title=Code postal
dl_datalistmodel.property.dl_locationState.title=D\u00e9partement
dl_datalistmodel.property.dl_locationCountry.title=Pays
@@ -100,4 +100,4 @@ dl_datalistmodel.property.dl_eventAgendaEndTime.title=Heure de fin
dl_datalistmodel.property.dl_eventAgendaSessionName.title=Nom de la s\u00e9ance
dl_datalistmodel.property.dl_eventAgendaPresenter.title=Intervenant
dl_datalistmodel.property.dl_eventAgendaAudience.title=Auditoire
-dl_datalistmodel.property.dl_eventAgendaNotes.title=Notes
+dl_datalistmodel.property.dl_eventAgendaNotes.title=Notes
\ No newline at end of file
diff --git a/config/alfresco/messages/data-list-model_it.properties b/config/alfresco/messages/data-list-model_it.properties
index 16f6e5598e..26c5ebdf64 100755
--- a/config/alfresco/messages/data-list-model_it.properties
+++ b/config/alfresco/messages/data-list-model_it.properties
@@ -18,6 +18,7 @@ dl_datalistmodel.property.dl_todoPriority.title=Priorit\u00e0
dl_datalistmodel.property.dl_todoStatus.title=Stato
dl_datalistmodel.property.dl_todoNotes.title=Note
dl_datalistmodel.association.dl_assignee.title=Assegnatario
+dl_datalistmodel.association.dl_attachments.title=Allegati
# Gantt Aspect
dl_datalistmodel.property.dl_ganttStartDate.title=Data di inizio
@@ -30,7 +31,7 @@ dl_datalistmodel.type.dl_task.description=Elenco di compiti avanzato contenente
dl_datalistmodel.property.dl_taskPriority.title=Priorit\u00e0
dl_datalistmodel.property.dl_taskStatus.title=Stato
dl_datalistmodel.property.dl_taskComments.title=Commenti
-dl_datalistmodel.property.dl_taskAssignee.title=Assegnatario
+dl_datalistmodel.association.dl_taskAssignee.title=Assegnatario
# Task List (Simple)
dl_datalistmodel.type.dl_simpletask.title=Elenco di compiti (semplice)
@@ -61,8 +62,7 @@ dl_datalistmodel.property.dl_issuePriority.title=Priorit\u00e0
dl_datalistmodel.property.dl_issueDescription.title=Descrizione
dl_datalistmodel.property.dl_issueDueDate.title=Data di scadenza
dl_datalistmodel.property.dl_issueComments.title=Commenti
-dl_datalistmodel.property.dl_issueAssignedTo.title=Assegnato a
-dl_datalistmodel.property.dl_issueRelatedIssues.title=Problemi correlati
+dl_datalistmodel.association.dl_issueAssignedTo.title=Assegnato a
# Event
dl_datalistmodel.type.dl_event.title=Elenco di eventi
@@ -100,4 +100,4 @@ dl_datalistmodel.property.dl_eventAgendaEndTime.title=Ora di fine
dl_datalistmodel.property.dl_eventAgendaSessionName.title=Nome sessione
dl_datalistmodel.property.dl_eventAgendaPresenter.title=Relatore
dl_datalistmodel.property.dl_eventAgendaAudience.title=Destinatari
-dl_datalistmodel.property.dl_eventAgendaNotes.title=Note
+dl_datalistmodel.property.dl_eventAgendaNotes.title=Note
\ No newline at end of file
diff --git a/config/alfresco/messages/data-list-model_ja.properties b/config/alfresco/messages/data-list-model_ja.properties
index 57c21ab98e..195a150ea0 100755
--- a/config/alfresco/messages/data-list-model_ja.properties
+++ b/config/alfresco/messages/data-list-model_ja.properties
@@ -1,103 +1,103 @@
# Display labels for Share Data Lists Model
-dl_datalistmodel.description=Alfresco Share Data List Model
+dl_datalistmodel.description=Alfresco Share\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u30fb\u30e2\u30c7\u30eb
-dl_datalistmodel.type.dl_dataList.title=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u30fb\u30d5\u30a9\u30eb\u30c0\u30bf\u30a4\u30d7
-dl_datalistmodel.type.dl_dataList.description= dl:dataListItemType\u30d7\u30ed\u30d1\u30c6\u30a3\u3067\u6307\u5b9a\u3055\u308c\u308b\u30bf\u30a4\u30d7\u306e\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u30a2\u30a4\u30c6\u30e0\u3092\u4fdd\u6301\u3057\u307e\u3059\u3002
-dl_datalistmodel.property.dl_dataListItemType.title=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u30fb\u30a2\u30a4\u30c6\u30e0\u30bf\u30a4\u30d7
-dl_datalistmodel.property.dl_dataListItemType.description=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u5185\u306b\u65b0\u898f\u30a2\u30a4\u30c6\u30e0\u304c\u4f5c\u3089\u308c\u305f\u6642\u306b\u3001\u3069\u306edl:dataListItem\u306e\u30b5\u30d6\u30bf\u30a4\u30d7\u3092\u4f7f\u7528\u3059\u308b\u304b\u3092\u6c7a\u5b9a\u3057\u307e\u3059\u3002
+dl_datalistmodel.type.dl_dataList.title=\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u30fb\u30d5\u30a9\u30eb\u30c0\u306e\u30bf\u30a4\u30d7
+dl_datalistmodel.type.dl_dataList.description=dl:dataListItemType\u30d7\u30ed\u30d1\u30c6\u30a3\u3067\u6307\u5b9a\u3055\u308c\u305f\u30bf\u30a4\u30d7\u306e\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u30fb\u30a2\u30a4\u30c6\u30e0\u3092\u4fdd\u6301\u3057\u307e\u3059\u3002
+dl_datalistmodel.property.dl_dataListItemType.title=\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u30fb\u30a2\u30a4\u30c6\u30e0\u306e\u30bf\u30a4\u30d7
+dl_datalistmodel.property.dl_dataListItemType.description=\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u306b\u65b0\u898f\u30a2\u30a4\u30c6\u30e0\u3092\u4f5c\u6210\u3059\u308b\u3068\u304d\u306b\u4f7f\u7528\u3059\u308bdl:dataListItem\u306e\u30b5\u30d6\u30bf\u30a4\u30d7\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002
-dl_datalistmodel.type.dl_dataListItem.title=\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u89aa\u30bf\u30a4\u30d7
-dl_datalistmodel.type.dl_dataListItem.description=\u30b5\u30f3\u30d7\u30eb\u306e\u30c7\u30fc\u30bf\u30ea\u30b9\u30c8\u30fb\u30a2\u30a4\u30c6\u30e0\u30bf\u30a4\u30d7\u3092\u6d3e\u751f\u3059\u308b\u89aa\u30bf\u30a4\u30d7\u3002
+dl_datalistmodel.type.dl_dataListItem.title=\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u306e\u89aa\u30bf\u30a4\u30d7
+dl_datalistmodel.type.dl_dataListItem.description=\u89aa\u30bf\u30a4\u30d7\u3068\u306f\u3001\u30b5\u30f3\u30d7\u30eb\u306e\u30c7\u30fc\u30bf\u30fb\u30ea\u30b9\u30c8\u30fb\u30a2\u30a4\u30c6\u30e0\u306e\u30bf\u30a4\u30d7\u304c\u5f93\u5c5e\u3059\u308b\u30bf\u30a4\u30d7\u3092\u6307\u3057\u307e\u3059\u3002
## Simple "To do" List
-dl_datalistmodel.type.dl_todoList.title=\u4e88\u5b9a\u30ea\u30b9\u30c8
-dl_datalistmodel.type.dl_todoList.description=\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u62c5\u5f53\u8005\u3092\u5272\u308a\u5f53\u3066\u308b\u5358\u7d14\u306a\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_todoList.title=To Do\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_todoList.description=\u30b7\u30f3\u30d7\u30eb\u306aTo Do\u30ea\u30b9\u30c8\u3067\u3001\u62c5\u5f53\u8005\u304c\u5272\u308a\u5f53\u3066\u3089\u308c\u3066\u3044\u308b\u5834\u5408\u306f\u305d\u306e\u60c5\u5831\u3082\u8868\u793a\u3055\u308c\u307e\u3059\u3002
dl_datalistmodel.property.dl_todoTitle.title=\u30bf\u30a4\u30c8\u30eb
dl_datalistmodel.property.dl_todoDueDate.title=\u7de0\u5207\u65e5
dl_datalistmodel.property.dl_todoPriority.title=\u512a\u5148
dl_datalistmodel.property.dl_todoStatus.title=\u30b9\u30c6\u30fc\u30bf\u30b9
dl_datalistmodel.property.dl_todoNotes.title=\u30e1\u30e2
dl_datalistmodel.association.dl_assignee.title=\u62c5\u5f53\u8005
+dl_datalistmodel.association.dl_attachments.title=\u6dfb\u4ed8
# Gantt Aspect
dl_datalistmodel.property.dl_ganttStartDate.title=\u958b\u59cb\u65e5
dl_datalistmodel.property.dl_ganttEndDate.title=\u7d42\u4e86\u65e5
-dl_datalistmodel.property.dl_ganttPercentComplete.title=% \u5b8c\u4e86
+dl_datalistmodel.property.dl_ganttPercentComplete.title=%\u5b8c\u4e86
# Task List (Advanced)
-dl_datalistmodel.type.dl_task.title=\u30bf\u30b9\u30af\u30ea\u30b9\u30c8\uff08\u8a73\u7d30\u7248\uff09
-dl_datalistmodel.type.dl_task.description=\u8a73\u7d30\u7248\u30bf\u30b9\u30af\u30ea\u30b9\u30c8\u306b\u306f\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u958b\u59cb\u65e5\u3068\u7d42\u4e86\u65e5\u3001\u512a\u5148\u5ea6\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u62c5\u5f53\u8005\u3001\u6dfb\u4ed8\u306a\u3069\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_task.title=\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\uff08\u30a2\u30c9\u30d0\u30f3\u30b9\u30c9\uff09
+dl_datalistmodel.type.dl_task.description=\u30a2\u30c9\u30d0\u30f3\u30b9\u30c9\u30fb\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u958b\u59cb\u65e5\u3001\u7d42\u4e86\u65e5\u3001\u512a\u5148\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u62c5\u5f53\u8005\u3001\u6dfb\u4ed8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
dl_datalistmodel.property.dl_taskPriority.title=\u512a\u5148
dl_datalistmodel.property.dl_taskStatus.title=\u30b9\u30c6\u30fc\u30bf\u30b9
dl_datalistmodel.property.dl_taskComments.title=\u30b3\u30e1\u30f3\u30c8
-dl_datalistmodel.property.dl_taskAssignee.title=\u62c5\u5f53\u8005
+dl_datalistmodel.association.dl_taskAssignee.title=\u62c5\u5f53\u8005
# Task List (Simple)
-dl_datalistmodel.type.dl_simpletask.title=\u30bf\u30b9\u30af\u30ea\u30b9\u30c8\uff08\u7c21\u6613\u7248\uff09
-dl_datalistmodel.type.dl_simpletask.description=\u7c21\u6613\u7248\u30bf\u30b9\u30af\u30ea\u30b9\u30c8\u306b\u306f\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u7de0\u5207\u65e5\u3001\u512a\u5148\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u30b3\u30e1\u30f3\u30c8\u306a\u3069\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_simpletask.title=\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\uff08\u7c21\u6613\uff09
+dl_datalistmodel.type.dl_simpletask.description=\u7c21\u6613\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u7de0\u5207\u65e5\u3001\u512a\u5148\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u30b3\u30e1\u30f3\u30c8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
dl_datalistmodel.property.dl_simpletaskDueDate.title=\u7de0\u5207\u65e5
dl_datalistmodel.property.dl_simpletaskPriority.title=\u512a\u5148
dl_datalistmodel.property.dl_simpletaskStatus.title=\u30b9\u30c6\u30fc\u30bf\u30b9
dl_datalistmodel.property.dl_simpletaskComments.title=\u30b3\u30e1\u30f3\u30c8
# Contact
-dl_datalistmodel.type.dl_contact.title=\u30b3\u30f3\u30bf\u30af\u30c8\u30ea\u30b9\u30c8
-dl_datalistmodel.type.dl_contact.description=\u30b3\u30f3\u30bf\u30af\u30c8\u30ea\u30b9\u30c8\u306b\u306f\u3001\u59d3\u3001\u540d\u3001\u30d5\u30eb\u30cd\u30fc\u30e0\u3001E\u30e1\u30fc\u30eb\u3001\u5f79\u8077\u540d\u3001\u96fb\u8a71\uff08\u30aa\u30d5\u30a3\u30b9\uff09\u3001\u96fb\u8a71\uff08\u643a\u5e2f\uff09\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_contact.title=\u9023\u7d61\u5148\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_contact.description=\u9023\u7d61\u5148\u30ea\u30b9\u30c8\u306b\u306f\u3001\u59d3\u3001\u540d\u3001\u30d5\u30eb\u30fb\u30cd\u30fc\u30e0\u3001E\u30e1\u30fc\u30eb\u3001\u5f79\u8077\u540d\u3001\u96fb\u8a71\uff08\u4f1a\u793e\uff09\u3001\u96fb\u8a71\uff08\u643a\u5e2f\uff09\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
dl_datalistmodel.property.dl_contactFirstName.title=\u540d
dl_datalistmodel.property.dl_contactLastName.title=\u59d3
dl_datalistmodel.property.dl_contactEmail.title=E\u30e1\u30fc\u30eb
dl_datalistmodel.property.dl_contactCompany.title=\u4f1a\u793e
dl_datalistmodel.property.dl_contactJobTitle.title=\u5f79\u8077\u540d
-dl_datalistmodel.property.dl_contactPhoneOffice.title=\u96fb\u8a71\uff08\u30aa\u30d5\u30a3\u30b9\uff09
+dl_datalistmodel.property.dl_contactPhoneOffice.title=\u96fb\u8a71\uff08\u4f1a\u793e\uff09
dl_datalistmodel.property.dl_contactPhoneMobile.title=\u96fb\u8a71\uff08\u643a\u5e2f\uff09
-dl_datalistmodel.property.dl_contactNotes.title=\u88dc\u8db3
+dl_datalistmodel.property.dl_contactNotes.title=\u30e1\u30e2
# Issues
-dl_datalistmodel.type.dl_issue.title=\u30a4\u30b7\u30e5\u30fc\u30ea\u30b9\u30c8
-dl_datalistmodel.type.dl_issue.description=\u30a4\u30b7\u30e5\u30fc\u30ea\u30b9\u30c8\u306b\u306fID\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u512a\u5148\u3001\u8aac\u660e\u3001\u7de0\u5207\u65e5\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u62c5\u5f53\u8005\u3001\u95a2\u9023\u554f\u984c\u304c\u542b\u307e\u308c\u307e\u3059\u3002
-dl_datalistmodel.property.dl_issueID.title=\u30a4\u30b7\u30e5\u30fcID
+dl_datalistmodel.type.dl_issue.title=\u61f8\u6848\u4e8b\u9805\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_issue.description=\u61f8\u6848\u4e8b\u9805\u30ea\u30b9\u30c8\u306b\u306f\u3001ID\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u3001\u512a\u5148\u3001\u8aac\u660e\u3001\u7de0\u5207\u65e5\u3001\u30b3\u30e1\u30f3\u30c8\u3001\u62c5\u5f53\u8005\u3001\u95a2\u9023\u61f8\u6848\u4e8b\u9805\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
+dl_datalistmodel.property.dl_issueID.title=\u61f8\u6848\u4e8b\u9805ID
dl_datalistmodel.property.dl_issueStatus.title=\u30b9\u30c6\u30fc\u30bf\u30b9
dl_datalistmodel.property.dl_issuePriority.title=\u512a\u5148
dl_datalistmodel.property.dl_issueDescription.title=\u8aac\u660e
dl_datalistmodel.property.dl_issueDueDate.title=\u7de0\u5207\u65e5
dl_datalistmodel.property.dl_issueComments.title=\u30b3\u30e1\u30f3\u30c8
-dl_datalistmodel.property.dl_issueAssignedTo.title=\u62c5\u5f53\u8005
-dl_datalistmodel.property.dl_issueRelatedIssues.title=\u95a2\u9023\u8ab2\u984c
+dl_datalistmodel.association.dl_issueAssignedTo.title=\u62c5\u5f53\u8005
# Event
-dl_datalistmodel.type.dl_event.title=\u30a4\u30d9\u30f3\u30c8\u30ea\u30b9\u30c8
-dl_datalistmodel.type.dl_event.description=\u30a4\u30d9\u30f3\u30c8\u30ea\u30b9\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u5834\u6240\u3001\u958b\u59cb\u65e5\u6642/\u7d42\u4e86\u65e5\u6642\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_event.title=\u30a4\u30d9\u30f3\u30c8\u30fb\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_event.description=\u30a4\u30d9\u30f3\u30c8\u30fb\u30ea\u30b9\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30c8\u30eb\u3001\u8aac\u660e\u3001\u5834\u6240\u3001\u512a\u5148\u3001\u958b\u59cb\u65e5\u3001\u7d42\u4e86\u65e5\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
dl_datalistmodel.property.dl_eventLocation.title=\u5834\u6240
dl_datalistmodel.property.dl_eventStartDate.title=\u958b\u59cb\u65e5
dl_datalistmodel.property.dl_eventEndDate.title=\u7d42\u4e86\u65e5
-dl_datalistmodel.property.dl_eventRegistrations.title=\u767b\u9332
-dl_datalistmodel.property.dl_eventNote.title=\u88dc\u8db3
+dl_datalistmodel.property.dl_eventRegistrations.title=\u767b\u9332\u6570
+dl_datalistmodel.property.dl_eventNote.title=\u30e1\u30e2
# Location
-dl_datalistmodel.type.dl_location.title=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30ea\u30b9\u30c8
-dl_datalistmodel.type.dl_location.description=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3/\u4f4f\u6240\u30ea\u30b9\u30c8
-dl_datalistmodel.property.dl_locationAddress1.title=\u4f4f\u6240\uff081\u884c\u76ee\uff09
-dl_datalistmodel.property.dl_locationAddress2.title=\u4f4f\u6240\uff082\u884c\u76ee\uff09
-dl_datalistmodel.property.dl_locationAddress3.title=\u4f4f\u6240\uff083\u884c\u76ee\uff09
+dl_datalistmodel.type.dl_location.title=\u5834\u6240\u30ea\u30b9\u30c8
+dl_datalistmodel.type.dl_location.description=\u5834\u6240/\u4f4f\u6240\u30ea\u30b9\u30c8
+dl_datalistmodel.property.dl_locationAddress1.title=\u4f4f\u6240\u306e1\u884c\u76ee
+dl_datalistmodel.property.dl_locationAddress2.title=\u4f4f\u6240\u306e2\u884c\u76ee
+dl_datalistmodel.property.dl_locationAddress3.title=\u4f4f\u6240\u306e3\u884c\u76ee
dl_datalistmodel.property.dl_locationZip.title=\u90f5\u4fbf\u756a\u53f7
dl_datalistmodel.property.dl_locationState.title=\u90fd\u9053\u5e9c\u770c
dl_datalistmodel.property.dl_locationCountry.title=\u56fd
-dl_datalistmodel.property.dl_locationNote.title=\u88dc\u8db3
+dl_datalistmodel.property.dl_locationNote.title=\u30e1\u30e2
# Meeting Agenda
dl_datalistmodel.type.dl_meetingAgenda.title=\u4f1a\u8b70\u30a2\u30b8\u30a7\u30f3\u30c0
-dl_datalistmodel.type.dl_meetingAgenda.description=\u4f1a\u8b70\u30a2\u30b8\u30a7\u30f3\u30c0\u306e\u30a2\u30a4\u30c6\u30e0\u306b\u306f\u8aac\u660e\u3001\u6240\u6709\u8005\u3001\u5145\u5f53\u6642\u9593\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_meetingAgenda.description=\u4f1a\u8b70\u30a2\u30b8\u30a7\u30f3\u30c0\u306e\u30a2\u30a4\u30c6\u30e0\uff08\u8aac\u660e\u3001\u6240\u6709\u8005\u3001\u5272\u308a\u5f53\u3066\u6642\u9593\uff09\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002
dl_datalistmodel.property.dl_meetingAgendaRef.title=\u53c2\u7167
dl_datalistmodel.property.dl_meetingAgendaTime.title=\u6642\u9593\uff08\u5206\uff09
dl_datalistmodel.property.dl_meetingAgendaOwner.title=\u6240\u6709\u8005
# Event Agenda
-dl_datalistmodel.type.dl_eventAgenda.title=\u30a4\u30d9\u30f3\u30c8\u30a2\u30b8\u30a7\u30f3\u30c0
-dl_datalistmodel.type.dl_eventAgenda.description=\u30a4\u30d9\u30f3\u30c8\u30a2\u30b8\u30a7\u30f3\u30c0\u7ba1\u7406\u30a2\u30a4\u30c6\u30e0\u306b\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u540d\u3001\u767a\u8868\u8005\u3001\u958b\u59cb/\u7d42\u4e86\u6642\u9593\u304c\u542b\u307e\u308c\u307e\u3059\u3002
+dl_datalistmodel.type.dl_eventAgenda.title=\u30a4\u30d9\u30f3\u30c8\u30fb\u30a2\u30b8\u30a7\u30f3\u30c0
+dl_datalistmodel.type.dl_eventAgenda.description=\u30a4\u30d9\u30f3\u30c8\u30fb\u30a2\u30b8\u30a7\u30f3\u30c0\u306e\u30a2\u30a4\u30c6\u30e0\uff08\u30bb\u30c3\u30b7\u30e7\u30f3\u540d\u3001\u30d7\u30ec\u30bc\u30f3\u30bf\u3001\u958b\u59cb\u6642\u523b\u3001\u7d42\u4e86\u6642\u523b\uff09\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002
dl_datalistmodel.property.dl_eventAgendaRef.title=\u53c2\u7167
-dl_datalistmodel.property.dl_eventAgendaStartTime.title=\u958b\u59cb\u6642\u9593
-dl_datalistmodel.property.dl_eventAgendaEndTime.title=\u7d42\u4e86\u6642\u9593
+dl_datalistmodel.property.dl_eventAgendaStartTime.title=\u958b\u59cb\u6642\u523b
+dl_datalistmodel.property.dl_eventAgendaEndTime.title=\u7d42\u4e86\u6642\u523b
dl_datalistmodel.property.dl_eventAgendaSessionName.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u540d
-dl_datalistmodel.property.dl_eventAgendaPresenter.title=\u767a\u8868\u8005
-dl_datalistmodel.property.dl_eventAgendaAudience.title=\u8074\u8846
-dl_datalistmodel.property.dl_eventAgendaNotes.title=\u88dc\u8db3
+dl_datalistmodel.property.dl_eventAgendaPresenter.title=\u30d7\u30ec\u30bc\u30f3\u30bf
+dl_datalistmodel.property.dl_eventAgendaAudience.title=\u30aa\u30fc\u30c7\u30a3\u30a8\u30f3\u30b9
+dl_datalistmodel.property.dl_eventAgendaNotes.title=\u30e1\u30e2
\ No newline at end of file
diff --git a/config/alfresco/messages/email-server-model_de.properties b/config/alfresco/messages/email-server-model_de.properties
index dbbd1f87d0..bd83f02a55 100755
--- a/config/alfresco/messages/email-server-model_de.properties
+++ b/config/alfresco/messages/email-server-model_de.properties
@@ -1,4 +1,4 @@
-eemailserver_emailserverModel.aspect.emailserver_aliasable.title=E-Mail Alias
+emailserver_emailserverModel.aspect.emailserver_aliasable.title=E-Mail Alias
emailserver_emailserverModel.aspect.emailserver_aliasable.description=E-Mail Alias
emailserver_emailserverModel.property.emailserver_alias.title=Alias
emailserver_emailserverModel.property.emailserver_alias.description=Alias
diff --git a/config/alfresco/messages/invitation-service_de.properties b/config/alfresco/messages/invitation-service_de.properties
index 6755650c59..abaeac262b 100755
--- a/config/alfresco/messages/invitation-service_de.properties
+++ b/config/alfresco/messages/invitation-service_de.properties
@@ -13,7 +13,7 @@ invitation.invite.already_finished="Einladung {0} wurde bereits angenommen, abge
invitation.invite.authentication_chain="Authentifizierungskette l\u00e4sst das Erstellen neuer Konten nicht zu"
# InviteSender messages
-invitation.invitesender.email.subject=Alfresco {0}: Sie wurden aufgefordert, der {1} Site beizutreten
+invitation.invitesender.email.subject=Alfresco {0}: Sie wurden aufgefordert, der {1} Site beizutreten.
invitation.invitesender.email.role.SiteManager=Site Manager
invitation.invitesender.email.role.SiteCollaborator=Site Mitarbeiter
invitation.invitesender.email.role.SiteContributor=Site Beitragender
diff --git a/config/alfresco/messages/invitation-service_es.properties b/config/alfresco/messages/invitation-service_es.properties
index 64081158c6..5684544212 100755
--- a/config/alfresco/messages/invitation-service_es.properties
+++ b/config/alfresco/messages/invitation-service_es.properties
@@ -13,7 +13,7 @@ invitation.invite.already_finished="La invitaci\u00f3n, {0} ya ha sido aceptada,
invitation.invite.authentication_chain="El m\u00e9todo de autenticaci\u00f3n establecido no permite crear nuevas cuentas"
# InviteSender messages
-invitation.invitesender.email.subject={0} Alfresco: Se le ha invitado a unirse al sitio {1}
+invitation.invitesender.email.subject={0} Alfresco: Ha sido invitado a unirse al sitio {1}
invitation.invitesender.email.role.SiteManager=Administrador de sitio
invitation.invitesender.email.role.SiteCollaborator=Colaborador de sitio
invitation.invitesender.email.role.SiteContributor=Contribuidor de sitio
diff --git a/config/alfresco/messages/invitation-service_fr.properties b/config/alfresco/messages/invitation-service_fr.properties
index 8b2ebf946d..e9dcff5225 100755
--- a/config/alfresco/messages/invitation-service_fr.properties
+++ b/config/alfresco/messages/invitation-service_fr.properties
@@ -8,7 +8,7 @@ invitation.error.invalid_inviteId_format="Format de l''identifiant de l''invitat
invitation.invite.already_member="L''utilisateur {0} est d\u00e9j\u00e0 membre de {1} et ne peut pas \u00eatre \u00e0 nouveau invit\u00e9"
invitation.cancel.not_site_manager="L''utilisateur actuel {0} ne peut pas annuler l''invitation suivante : {1}, car il n''est pas un gestionnaire du site suivant : {2}"
invitation.invite.not_site_manager="L''utilisateur actuel {0} n''est pas un gestionnaire du site suivant : {1}"
-invitation.invite.unable_generate_id="Impossible de g\u00e9n\u00e9rer un nom d''utilisateur pour l''invit\u00e9, qui n''appartient pas d\u00e9j\u00e0 \u00e0 une autre personne firstName:{0} lastName:{1} email:{2}"
+invitation.invite.unable_generate_id="Impossible de g\u00e9n\u00e9rer un nom d''invit\u00e9 qui n''appartient pas d\u00e9j\u00e0 \u00e0 une autre personne firstName:{0} lastName:{1} email:{2}"
invitation.invite.already_finished="L''invitation {0} a d\u00e9j\u00e0 \u00e9t\u00e9 accept\u00e9e, annul\u00e9e ou rejet\u00e9e"
invitation.invite.authentication_chain="La cha\u00eene d'authentification ne permet pas la cr\u00e9ation de nouveaux comptes"
diff --git a/config/alfresco/messages/invitation-service_it.properties b/config/alfresco/messages/invitation-service_it.properties
index 42ce52c532..619cf86ac5 100755
--- a/config/alfresco/messages/invitation-service_it.properties
+++ b/config/alfresco/messages/invitation-service_it.properties
@@ -8,7 +8,7 @@ invitation.error.invalid_inviteId_format="Il formato dell''ID di invito non \u00
invitation.invite.already_member="L''utente, {0} \u00e8 gi\u00e0 un membro di {1} e non pu\u00f2 essere invitato di nuovo"
invitation.cancel.not_site_manager="L''utente attuale, {0}, non pu\u00f2 annullare l''invito: {1} perch\u00e9 non \u00e8 un manager del sito: {2}"
invitation.invite.not_site_manager="L''utente attuale, {0}, non \u00e8 un manager del sito: {1}"
-invitation.invite.unable_generate_id="Impossibile generare per l'invitato un nome, utente che non appartiene gi\u00e0 a un altro utente firstName:{0} lastName:{1} email:{2}"
+invitation.invite.unable_generate_id="Impossibile generare per l'invitato un nome utente che non appartenga gi\u00e0 a un altro utente nome:{0} cognome:{1} email:{2}"
invitation.invite.already_finished="L''invito, {0} \u00e8 gi\u00e0 stato accettato, annullato o respinto"
invitation.invite.authentication_chain="La catena di autenticazione non consente la creazione di nuovi account"
diff --git a/config/alfresco/messages/patch-service_ja.properties b/config/alfresco/messages/patch-service_ja.properties
index 6616e74850..bb49df60e8 100755
--- a/config/alfresco/messages/patch-service_ja.properties
+++ b/config/alfresco/messages/patch-service_ja.properties
@@ -148,6 +148,11 @@ patch.versionHistoryPerformance.result=Updated {0} version history objects to im
patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers.
+patch.siteLoadPatch.description=Loads a sample site into the repository.
+patch.siteLoadPatch.exists=The Site {0} already exists and so could not be imported
+patch.siteLoadPatch.noBootstrapViews=No bootstrap views were given for importing Site {0} - please check the bootstrap extension bean configuration
+patch.siteLoadPatch.result=Site {0} imported.
+
patch.wcmFolders.description=Ensures the existance of the WCM specific 'Web Projects' and 'Web Forms' folders.
patch.wcmFolders.webprojects.result.exists=The Web Projects folder already exists: {0}
patch.wcmFolders.webprojects.result.created=The Web Projects folder was successfully created: {0}
@@ -383,3 +388,15 @@ 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
diff --git a/config/alfresco/messages/site-service_de.properties b/config/alfresco/messages/site-service_de.properties
index 22f65ca0b5..1d1498c435 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.
+site_service.site_container_not_folder=Site Container {0} bezieht sich nicht auf einen Ordner.
\ No newline at end of file
diff --git a/config/alfresco/messages/site-service_fr.properties b/config/alfresco/messages/site-service_fr.properties
index ee981a5631..2b438ff82a 100755
--- a/config/alfresco/messages/site-service_fr.properties
+++ b/config/alfresco/messages/site-service_fr.properties
@@ -9,4 +9,4 @@ site_service.do_not_remove_manager=Un site n\u00e9cessite au moins un gestionnai
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.site_container_not_folder=Le conteneur de site {0} ne se r\u00e9f\u00e8re pas \u00e0 un dossier.
+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 f61d98003e..ac1c4b2067 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.
+site_service.site_container_not_folder=Il contenitore del sito {0} non referenzia una cartella.
\ No newline at end of file
diff --git a/config/alfresco/messages/system-messages.properties b/config/alfresco/messages/system-messages.properties
index f19864e74b..03e1508c2e 100644
--- a/config/alfresco/messages/system-messages.properties
+++ b/config/alfresco/messages/system-messages.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -33,6 +36,8 @@ system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt
# Usages
system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
+
+# START TRANSLATION
system.usage.warn.limit_users_approached=The allowable user limit of {0} is being approached. There are {1} users in the system.
system.usage.warn.limit_users_reached=The allowable user limit of {0} has been reached. There are {1} users in the system.
system.usage.warn.limit_documents_approached=The allowable document limit of {0} is being approached. There are {1} documents in the system.
@@ -42,6 +47,7 @@ system.usage.err.limit_users_exceeded_verbose=The allowable user limit of {0} ha
system.usage.err.limit_documents_exceeded=The allowable document limit of {0} has been exceeded. There are currently {1} documents in the system.
system.usage.err.limit_license_expiring=The Alfresco license will expire in {0} days.
system.usage.err.limit_license_expired=The Alfresco license has expired.
+# END TRANSLATION
# License
system.license.msg.reloaded=The Alfresco license has been reloaded.
diff --git a/config/alfresco/messages/system-messages_de.properties b/config/alfresco/messages/system-messages_de.properties
index 15ba99d73c..9a7ae07013 100755
--- a/config/alfresco/messages/system-messages_de.properties
+++ b/config/alfresco/messages/system-messages_de.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -33,15 +36,18 @@ system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt
# Usages
system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
-system.usage.warn.limit_users_approached=The allowable user limit of {0} is being approached. There are {1} users in the system.
-system.usage.warn.limit_users_reached=The allowable user limit of {0} has been reached. There are {1} users in the system.
-system.usage.warn.limit_documents_approached=The allowable document limit of {0} is being approached. There are {1} documents in the system.
-system.usage.warn.limit_documents_reached=The allowable document limit of {0} has been reached. There are {1} documents in the system.
-system.usage.err.limit_users_exceeded=The allowable user limit of {0} has been exceeded. There are currently {1} users in the system.
-system.usage.err.limit_users_exceeded_verbose=The allowable user limit of {0} has been exceeded. Users added: {1}
-system.usage.err.limit_documents_exceeded=The allowable document limit of {0} has been exceeded. There are currently {1} documents in the system.
-system.usage.err.limit_license_expiring=The Alfresco license will expire in {0} days.
-system.usage.err.limit_license_expired=The Alfresco license has expired.
+
+# START TRANSLATION
+system.usage.warn.limit_users_approached=Die zul\u00e4ssige Benutzerzahl von {0} ist nahezu erreicht. Es gibt {1} Benutzer im System.
+system.usage.warn.limit_users_reached=Die zul\u00e4ssige Benutzerzahl von {0} wurde erreicht. Es gibt {1} Benutzer im System.
+system.usage.warn.limit_documents_approached=Die zul\u00e4ssige Dokumentenzahl von {0} ist nahezu erreicht. Es gibt {1} Dokumente im System.
+system.usage.warn.limit_documents_reached=Die zul\u00e4ssige Dokumentenzahl von {0} wurde erreicht. Es gibt {1} Dokumente im System.
+system.usage.err.limit_users_exceeded=Die zul\u00e4ssige Benutzerzahl von {0} wurde \u00fcberschritten. Es gibt derzeit {1} Benutzer im System.
+system.usage.err.limit_users_exceeded_verbose=Die zul\u00e4ssige Benutzerzahl von {0} wurde \u00fcberschritten. Benutzer hinzugef\u00fcgt: {1}
+system.usage.err.limit_documents_exceeded=Die zul\u00e4ssige Dokumentenzahl von {0} wurde \u00fcberschritten. Es gibt derzeit {1} Dokumente im System.
+system.usage.err.limit_license_expiring=Die Alfresco Lizenz l\u00e4uft in {0}\u00a0Tagen ab.
+system.usage.err.limit_license_expired=Die Alfresco Lizenz ist abgelaufen.
+# END TRANSLATION
# License
system.license.msg.reloaded=The Alfresco license has been reloaded.
diff --git a/config/alfresco/messages/system-messages_es.properties b/config/alfresco/messages/system-messages_es.properties
index 15ba99d73c..558cfe25df 100755
--- a/config/alfresco/messages/system-messages_es.properties
+++ b/config/alfresco/messages/system-messages_es.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -33,15 +36,18 @@ system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt
# Usages
system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
-system.usage.warn.limit_users_approached=The allowable user limit of {0} is being approached. There are {1} users in the system.
-system.usage.warn.limit_users_reached=The allowable user limit of {0} has been reached. There are {1} users in the system.
-system.usage.warn.limit_documents_approached=The allowable document limit of {0} is being approached. There are {1} documents in the system.
-system.usage.warn.limit_documents_reached=The allowable document limit of {0} has been reached. There are {1} documents in the system.
-system.usage.err.limit_users_exceeded=The allowable user limit of {0} has been exceeded. There are currently {1} users in the system.
-system.usage.err.limit_users_exceeded_verbose=The allowable user limit of {0} has been exceeded. Users added: {1}
-system.usage.err.limit_documents_exceeded=The allowable document limit of {0} has been exceeded. There are currently {1} documents in the system.
-system.usage.err.limit_license_expiring=The Alfresco license will expire in {0} days.
-system.usage.err.limit_license_expired=The Alfresco license has expired.
+
+# START TRANSLATION
+system.usage.warn.limit_users_approached=Se est\u00e1 llegando al l\u00edmite de usuarios permitidos de {0}. Hay {1} usuarios en el sistema.
+system.usage.warn.limit_users_reached=Se ha alcanzado el l\u00edmite de usuarios permitidos de {0}. Hay {1} usuarios en el sistema.
+system.usage.warn.limit_documents_approached=Se est\u00e1 llegando al l\u00edmite de documentos permitidos de {0}. Hay {1} documentos en el sistema.
+system.usage.warn.limit_documents_reached=Se ha alcanzado el l\u00edmite de documentos permitidos de {0}. Hay {1} documentos en el sistema.
+system.usage.err.limit_users_exceeded=Se ha superado el l\u00edmite de usuarios permitidos de {0}. En estos momentos, hay {1} usuarios en el sistema.
+system.usage.err.limit_users_exceeded_verbose=Se ha superado el l\u00edmite de usuarios permitidos de {0}. Usuarios a\u00f1adidos: {1}
+system.usage.err.limit_documents_exceeded=Se ha superado el l\u00edmite de documentos permitidos de {0}. En estos momentos, hay {1} documentos en el sistema.
+system.usage.err.limit_license_expiring=La licencia de Alfresco caducar\u00e1 en {0} d\u00edas.
+system.usage.err.limit_license_expired=La licencia de Alfresco ha caducado.
+# END TRANSLATION
# License
system.license.msg.reloaded=The Alfresco license has been reloaded.
diff --git a/config/alfresco/messages/system-messages_fr.properties b/config/alfresco/messages/system-messages_fr.properties
index 15ba99d73c..7d64b88e93 100755
--- a/config/alfresco/messages/system-messages_fr.properties
+++ b/config/alfresco/messages/system-messages_fr.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -33,15 +36,18 @@ system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt
# Usages
system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
-system.usage.warn.limit_users_approached=The allowable user limit of {0} is being approached. There are {1} users in the system.
-system.usage.warn.limit_users_reached=The allowable user limit of {0} has been reached. There are {1} users in the system.
-system.usage.warn.limit_documents_approached=The allowable document limit of {0} is being approached. There are {1} documents in the system.
-system.usage.warn.limit_documents_reached=The allowable document limit of {0} has been reached. There are {1} documents in the system.
-system.usage.err.limit_users_exceeded=The allowable user limit of {0} has been exceeded. There are currently {1} users in the system.
-system.usage.err.limit_users_exceeded_verbose=The allowable user limit of {0} has been exceeded. Users added: {1}
-system.usage.err.limit_documents_exceeded=The allowable document limit of {0} has been exceeded. There are currently {1} documents in the system.
-system.usage.err.limit_license_expiring=The Alfresco license will expire in {0} days.
-system.usage.err.limit_license_expired=The Alfresco license has expired.
+
+# START TRANSLATION
+system.usage.warn.limit_users_approached=Le nombre maximum d''utilisateurs autoris\u00e9s de {0} est presque atteint. Il y a {1} utilisateurs dans le syst\u00e8me.
+system.usage.warn.limit_users_reached=Le nombre maximum d''utilisateurs autoris\u00e9s de {0} a \u00e9t\u00e9 atteint. Il y a {1} utilisateurs dans le syst\u00e8me.
+system.usage.warn.limit_documents_approached=Le nombre maximum de documents autoris\u00e9s de {0} est presque atteint. Il y a {1} documents dans le syst\u00e8me.
+system.usage.warn.limit_documents_reached=Le nombre maximum de documents autoris\u00e9s de {0} a \u00e9t\u00e9 atteint. Il y a {1} documents dans le syst\u00e8me.
+system.usage.err.limit_users_exceeded=Le nombre maximum d''utilisateurs autoris\u00e9s de {0} a \u00e9t\u00e9 d\u00e9pass\u00e9. Il y a actuellement {1} utilisateurs dans le syst\u00e8me.
+system.usage.err.limit_users_exceeded_verbose=Le nombre maximum d''utilisateurs autoris\u00e9s de {0} a \u00e9t\u00e9 d\u00e9pass\u00e9. Utilisateurs ajout\u00e9s : {1}
+system.usage.err.limit_documents_exceeded=Le nombre maximum de documents autoris\u00e9s de {0} a \u00e9t\u00e9 d\u00e9pass\u00e9. Il y a actuellement {1} documents dans le syst\u00e8me.
+system.usage.err.limit_license_expiring=La licence Alfresco expirera dans {0} jours.
+system.usage.err.limit_license_expired=La licence Alfresco a expir\u00e9.
+# END TRANSLATION
# License
system.license.msg.reloaded=The Alfresco license has been reloaded.
diff --git a/config/alfresco/messages/system-messages_it.properties b/config/alfresco/messages/system-messages_it.properties
index 15ba99d73c..2483c61a03 100755
--- a/config/alfresco/messages/system-messages_it.properties
+++ b/config/alfresco/messages/system-messages_it.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -33,15 +36,18 @@ system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt
# Usages
system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
-system.usage.warn.limit_users_approached=The allowable user limit of {0} is being approached. There are {1} users in the system.
-system.usage.warn.limit_users_reached=The allowable user limit of {0} has been reached. There are {1} users in the system.
-system.usage.warn.limit_documents_approached=The allowable document limit of {0} is being approached. There are {1} documents in the system.
-system.usage.warn.limit_documents_reached=The allowable document limit of {0} has been reached. There are {1} documents in the system.
-system.usage.err.limit_users_exceeded=The allowable user limit of {0} has been exceeded. There are currently {1} users in the system.
-system.usage.err.limit_users_exceeded_verbose=The allowable user limit of {0} has been exceeded. Users added: {1}
-system.usage.err.limit_documents_exceeded=The allowable document limit of {0} has been exceeded. There are currently {1} documents in the system.
-system.usage.err.limit_license_expiring=The Alfresco license will expire in {0} days.
-system.usage.err.limit_license_expired=The Alfresco license has expired.
+
+# START TRANSLATION
+system.usage.warn.limit_users_approached=Il limite utenti disponibile di {0} sta per essere raggiunto. Esistono {1} utenti nel sistema.
+system.usage.warn.limit_users_reached=Il limite utenti disponibile di {0} \u00e8 stato raggiunto. Esistono {1} utenti nel sistema.
+system.usage.warn.limit_documents_approached=Il limite documenti disponibile di {0} sta per essere raggiunto. Esistono {1} documenti nel sistema.
+system.usage.warn.limit_documents_reached=Il limite documenti disponibile di {0} \u00e8 stato raggiunto. Esistono {1} documenti nel sistema.
+system.usage.err.limit_users_exceeded=Il limite utenti disponibile di {0} \u00e8 stato superato. Attualmente esistono {1} utenti nel sistema.
+system.usage.err.limit_users_exceeded_verbose=Il limite utenti disponibile di {0} \u00e8 stato superato. Utenti aggiunti: {1}
+system.usage.err.limit_documents_exceeded=Il limite documenti disponibile di {0} \u00e8 stato superato. Attualmente esistono {1} documenti nel sistema.
+system.usage.err.limit_license_expiring=La licenza Alfresco scade tra {0} giorni.
+system.usage.err.limit_license_expired=La licenza Alfresco \u00e8 scaduta.
+# END TRANSLATION
# License
system.license.msg.reloaded=The Alfresco license has been reloaded.
diff --git a/config/alfresco/messages/system-messages_ja.properties b/config/alfresco/messages/system-messages_ja.properties
index b84511f727..858bb984ee 100755
--- a/config/alfresco/messages/system-messages_ja.properties
+++ b/config/alfresco/messages/system-messages_ja.properties
@@ -1,5 +1,8 @@
# System-related messages
+# Note to Translators: Only some of the strings below should be localised
+# Those that should be localised are between START TRANSLATION and END TRANSLATION comment lines.
+
system.err.property_not_set=Property ''{0}'' has not been set: {1} ({2})
system.err.duplicate_name=Duplicate child name not allowed: {0}
@@ -29,3 +32,27 @@ system.locks.err.excl_lock_exists=Failed to get lock ''{0}'' using token ''{1}''
# Multi-Tenant
system.mt.warn.upgrade_mt_admin_context=Please update your alfresco/extension/mt/mt-admin-context.xml (to use latest alfresco/extension/mt/mt-admin-context.xml.sample).
+
+# Usages
+system.usage.err.no_txn=RepoUsageComponent must be called in a transaction.
+system.usage.err.no_txn_readwrite=RepoUsageComponent must be called in a read-write transaction.
+
+# START TRANSLATION
+system.usage.warn.limit_users_approached=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e{0}\u4eba\u306e\u30e6\u30fc\u30b6\u304c\u30a2\u30d7\u30ed\u30fc\u30c1\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u30b7\u30b9\u30c6\u30e0\u306b{1}\u4eba\u306e\u30e6\u30fc\u30b6\u304c\u3044\u307e\u3059\u3002
+system.usage.warn.limit_users_reached=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e\u30e6\u30fc\u30b6\u6570\u3067\u3042\u308b{0}\u4eba\u306b\u9054\u3057\u307e\u3057\u305f\u3002 \u30b7\u30b9\u30c6\u30e0\u306b{1}\u4eba\u306e\u30e6\u30fc\u30b6\u304c\u3044\u307e\u3059\u3002
+system.usage.warn.limit_documents_approached=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e{0}\u306e\u6587\u66f8\u304c\u30a2\u30d7\u30ed\u30fc\u30c1\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u30b7\u30b9\u30c6\u30e0\u306b{1}\u306e\u6587\u66f8\u304c\u3042\u308a\u307e\u3059\u3002
+system.usage.warn.limit_documents_reached=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e\u6587\u66f8\u6570\u3067\u3042\u308b{0}\u306b\u9054\u3057\u307e\u3057\u305f\u3002 \u30b7\u30b9\u30c6\u30e0\u306b{1}\u306e\u6587\u66f8\u304c\u3042\u308a\u307e\u3059\u3002
+system.usage.err.limit_users_exceeded=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e\u30e6\u30fc\u30b6\u6570\u3067\u3042\u308b{0}\u4eba\u3092\u8d85\u3048\u307e\u3057\u305f\u3002 \u73fe\u5728\u30b7\u30b9\u30c6\u30e0\u306b{1}\u4eba\u306e\u30e6\u30fc\u30b6\u304c\u3044\u307e\u3059\u3002
+system.usage.err.limit_users_exceeded_verbose=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e\u30e6\u30fc\u30b6\u6570\u3067\u3042\u308b{0}\u4eba\u3092\u8d85\u3048\u307e\u3057\u305f\u3002 \u30e6\u30fc\u30b6\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f: {1}
+system.usage.err.limit_documents_exceeded=\u8a31\u53ef\u3055\u308c\u308b\u9650\u754c\u306e\u6587\u66f8\u6570{0}\u3092\u8d85\u3048\u307e\u3057\u305f\u3002 \u73fe\u5728\u30b7\u30b9\u30c6\u30e0\u306b{1}\u306e\u6587\u66f8\u304c\u3042\u308a\u307e\u3059\u3002
+system.usage.err.limit_license_expiring=Alfresco\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u304c\u3042\u3068{0}\u65e5\u3067\u671f\u9650\u5207\u308c\u306b\u306a\u308a\u307e\u3059\u3002
+system.usage.err.limit_license_expired=Alfresco\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f\u3002
+# END TRANSLATION
+
+# License
+system.license.msg.reloaded=The Alfresco license has been reloaded.
+system.license.err.reloadFailed=Failed to reload license: {0}
+
+# Startup message
+system.info.startup=Alfresco started ({0}{1}{2}). Current version: {3} schema {4}. Originally installed version: {5} schema {6}.
+system.warn.readonly=Alfresco is currently in read-only mode. Please check your license.
\ No newline at end of file
diff --git a/config/alfresco/messages/transfer-model_de.properties b/config/alfresco/messages/transfer-model_de.properties
index 699fbd3a8a..fffa9f0772 100755
--- a/config/alfresco/messages/transfer-model_de.properties
+++ b/config/alfresco/messages/transfer-model_de.properties
@@ -6,13 +6,13 @@ trx_applicationmodel.type.trx_transferGroup.title=\u00dcbertragungsgruppe
trx_applicationmodel.type.trx_transferGroup.description=Definition einer \u00dcbertragungsgruppe
trx_applicationmodel.type.trx_transferLock.title=\u00dcbertragungssperre
-trx_applicationmodel.type.trx_transferLock.description=Knoten-Typ, der f\u00fcr den \u00dcbertragungssperrknoten verwendet wurde
+trx_applicationmodel.type.trx_transferLock.description=Node-Typ, der f\u00fcr den \u00dcbertragungssperrknoten verwendet wurde
trx_applicationmodel.type.trx_transferRecord.title=\u00dcbertragungsaufzeichnung
-trx_applicationmodel.type.trx_transferRecord.description=Knoten-Typ, der f\u00fcr die Aufzeichnung der \u00dcbertragungsinformation verwendet wurde
+trx_applicationmodel.type.trx_transferRecord.description=Node-Typ, der f\u00fcr die Aufzeichnung der \u00dcbertragungsinformation verwendet wurde
trx_applicationmodel.type.trx_tempTransferStore.title=Tempor\u00e4rer \u00dcbertragungsspeicher
-trx_applicationmodel.type.trx_tempTransferStore.description=Knoten-Typ, der f\u00fcr die Speicherung tempor\u00e4r verwaister eingehender Knoten verwendet wird
+trx_applicationmodel.type.trx_tempTransferStore.description=Node-Typ, der f\u00fcr die Speicherung tempor\u00e4r verwaister eingehender Knoten verwendet wird
trx_applicationmodel.type.trx_transferReport.title=\u00dcbertragungsbericht
trx_applicationmodel.type.trx_transferReport.description=\u00dcbertragungsbericht
@@ -60,27 +60,27 @@ trx_applicationmodel.property.trx_transferId.title=\u00dcbertragungs-ID
trx_applicationmodel.property.trx_transferId.description=\u00dcbertragungs-ID
trx_applicationmodel.property.trx_invadedBy.title=Invasion von
-trx_applicationmodel.property.trx_invadedBy.description=Die Repositorys, die in diesen Knoten eingedrungen sind
+trx_applicationmodel.property.trx_invadedBy.description=Die Repositories, die in diesen Node beinflusst sind
-trx_applicationmodel.property.trx_repositoryId.title=Quell-Repository.
-trx_applicationmodel.property.trx_repositoryId.description=Die Repository-ID, von der der Knoten stammt.
+trx_applicationmodel.property.trx_repositoryId.title=Quell-Repository
+trx_applicationmodel.property.trx_repositoryId.description=Die Repository-ID, von der der Node stammt.
trx_applicationmodel.property.trx_fromRepositoryId.title=Von Repository-ID
-trx_applicationmodel.property.trx_fromContent.description=Die Inhalts-URLs, die mit diesem Knoten \u00fcbertragen werden
+trx_applicationmodel.property.trx_fromContent.description=Die Inhalts-URLs, die mit diesem Node \u00fcbertragen werden
trx_applicationmodel.association.trx_orphan.title=Verwaiste \u00fcbertragen
trx_applicationmodel.association.trx_orphan.description=Verwaiste \u00fcbertragen
trx_applicationmodel.aspect.trx_transferRelated.title=Zugeh\u00f6rige \u00fcbertragen
-trx_applicationmodel.aspect.trx_transferRelated.description=Knoten mit diesem Aspekt geh\u00f6ren zu einer bestimmten \u00dcbertragung.
+trx_applicationmodel.aspect.trx_transferRelated.description=Node mit diesem Aspekt geh\u00f6ren zu einer bestimmten \u00dcbertragung
trx_applicationmodel.aspect.trx_enableable.title=Aktivierbar
trx_applicationmodel.aspect.trx_enableable.description=Aktivierbar
trx_applicationmodel.aspect.trx_transferred.name=\u00dcbertragen
-trx_applicationmodel.aspect.trx_transferred.description=Knoten mit diesem Aspekt wurden von einem Repository zu einem anderen \u00fcbertragen
+trx_applicationmodel.aspect.trx_transferred.description=Node mit diesem Aspekt wurden von einem Repository zu einem anderen \u00fcbertragen
trx_applicationmodel.aspect.trx_alien.name=Fremde \u00fcbertragen
-trx_applicationmodel.aspect.trx_alien.description=Knoten mit diesem Aspekt sind entweder fremde Knoten oder andere fremde Knoten sind eingedrungen
+trx_applicationmodel.aspect.trx_alien.description=Node mit diesem Aspekt sind entweder fremde Knoten oder andere fremde Knoten sind eingedrungen
diff --git a/config/alfresco/messages/transfer-model_es.properties b/config/alfresco/messages/transfer-model_es.properties
index 115e438659..7d117b41ae 100755
--- a/config/alfresco/messages/transfer-model_es.properties
+++ b/config/alfresco/messages/transfer-model_es.properties
@@ -59,8 +59,8 @@ trx_applicationmodel.property.trx_transferError.description=Error de transferenc
trx_applicationmodel.property.trx_transferId.title=Identificador de transferencia
trx_applicationmodel.property.trx_transferId.description=Identificador de transferencia
-trx_applicationmodel.property.trx_invadedBy.title=Invadido por
-trx_applicationmodel.property.trx_invadedBy.description=Los repositorios que han invadido este nodo
+trx_applicationmodel.property.trx_invadedBy.title=Transferido desde por
+trx_applicationmodel.property.trx_invadedBy.description=Los repositorios que han transferido desde este nodo
trx_applicationmodel.property.trx_repositoryId.title=Repositorio de origen.
trx_applicationmodel.property.trx_repositoryId.description=El identificador del repositorio desde donde se origina este nodo.
@@ -81,6 +81,6 @@ trx_applicationmodel.aspect.trx_transferred.name=Transferido
trx_applicationmodel.aspect.trx_transferred.description=Los nodos con este aspecto han sido transferidos de un repositorio a otro
trx_applicationmodel.aspect.trx_alien.name=Ajeno a transferencia
-trx_applicationmodel.aspect.trx_alien.description=Los nodos con este aspecto son nodos ajenos o han sido invadidos por otros nodos ajenos
+trx_applicationmodel.aspect.trx_alien.description=Los nodos con este aspecto son nodos ajenos o han sido transferido desde por otros nodos ajenos
diff --git a/config/alfresco/messages/transfer-model_fr.properties b/config/alfresco/messages/transfer-model_fr.properties
index 1dd0cfcaab..5b236734af 100644
--- a/config/alfresco/messages/transfer-model_fr.properties
+++ b/config/alfresco/messages/transfer-model_fr.properties
@@ -1,86 +1,84 @@
-# 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=Hte de destination
-trx_applicationmodel.property.trx_endpointhost.description=Hte 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
-
-
+# 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
diff --git a/config/alfresco/messages/transfer-service_de.properties b/config/alfresco/messages/transfer-service_de.properties
index 6fcc9a430b..6eaa901b2f 100755
--- a/config/alfresco/messages/transfer-service_de.properties
+++ b/config/alfresco/messages/transfer-service_de.properties
@@ -9,14 +9,14 @@ transfer_service.comms.unsupported_protocol=Nicht unterst\u00fctztes Protokoll:
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.no_nodes=Keine zu \u00fcbertragenden Knoten
+transfer_service.no_nodes=Keine zu \u00fcbertragenden Nodes
transfer_service.target_not_enabled=\u00dcbertragungsziel nicht aktiviert {0}
transfer_service.cancelled=\u00dcbertragung abgebrochen
transfer_service.failed_to_get_transfer_status=Abrufen des \u00dcbertragungsstatus von Ziel {0} fehlgeschlagen
transfer_service.target_error=\u00dcbertragungsziel mit {0} fehlgeschlagen
transfer_service.unknown_target_error=Unbekannter Fehler
transfer_service.receiver.no_primary_parent_supplied=\u00dcbertragung nicht m\u00f6glich, kein Prim\u00e4relternteil angegeben.
-transfer_service.receiver.orphans_exist=\u00dcbertragung nicht m\u00f6glich, Waisen vorhanden
+transfer_service.receiver.orphans_exist=\u00dcbertragung nicht m\u00f6glich, Waisen vorhanden.
transfer_service.receiver.content_file_missing=\u00dcbertragung nicht m\u00f6glich, Inhaltsdateien fehlen.
transfer_service.receiver.failed_to_create_staging_folder=Staging-Verzeichnis f\u00fcr \u00dcbertragung {0} kann nicht erstellt werden
transfer_service.receiver.lock_folder_not_found=Angegebener Sperr-Ordner ist nicht auffindbar: {0}
@@ -26,7 +26,7 @@ transfer_service.receiver.record_folder_not_found=Angegebener Ordner f\u00fcr Pr
transfer_service.receiver.not_lock_owner=Fehlgeschlagener Versuch, eine \u00dcbertragung auszuf\u00fchren. Sperre nicht von angegebener \u00dcbertragung gehalten: {0}
transfer_service.receiver.error_ending_transfer=Anforderung zur Beendigung einer \u00dcbertragung ({0}) hat zu einem Fehler gef\u00fchrt.
transfer_service.receiver.error_staging_snapshot=Beim Staging der Momentaufnahme einer Datei zur \u00dcbertragung {0} ist ein Fehler aufgetreten
-transfer_service.receiver.error_staging_content=Beim Staging der Content-Datei zur \u00dcbertragung {0} ist ein Fehler aufgetreten. Feld-ID ist {1}
+transfer_service.receiver.error_staging_content=Beim Staging der Content-Datei zur \u00dcbertragung {0} ist ein Fehler aufgetreten Feld-ID ist {1}
transfer_service.receiver.no_snapshot_received=Eine Anfrage nach Ausf\u00fchrung einer \u00dcbertragung ({0}) ist eingegangen, es ist aber keine passende Momentaufnahmen-Datei eingegangen.
transfer_service.receiver.error_committing_transfer=Beim Versuch der Ausf\u00fchrung der \u00dcbertragung {0} ist ein Fehler aufgetreten
transfer_service.receiver.transfer_not_found=Konnte kein Protokoll einer \u00dcbertragungsanfrage finden: {0}
diff --git a/config/alfresco/model/bpmModel.xml b/config/alfresco/model/bpmModel.xml
index 010bab12a8..786bdac5e8 100644
--- a/config/alfresco/model/bpmModel.xml
+++ b/config/alfresco/model/bpmModel.xml
@@ -77,7 +77,7 @@
Package Foldercm:systemfolder
- true
+ false
diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml
index c7ac00137e..d7d1dc0bd5 100644
--- a/config/alfresco/model/contentModel.xml
+++ b/config/alfresco/model/contentModel.xml
@@ -443,6 +443,7 @@
Rating
+ sys:baseRating
diff --git a/config/alfresco/model/siteModel.xml b/config/alfresco/model/siteModel.xml
index a96a7d51d9..ce2319ba63 100644
--- a/config/alfresco/model/siteModel.xml
+++ b/config/alfresco/model/siteModel.xml
@@ -47,6 +47,8 @@
cm:titled
+
+ sys:undeletable
diff --git a/config/alfresco/model/systemModel.xml b/config/alfresco/model/systemModel.xml
index f53335bfc4..3e2792aaf7 100644
--- a/config/alfresco/model/systemModel.xml
+++ b/config/alfresco/model/systemModel.xml
@@ -155,6 +155,11 @@
false
+
+
+ Undeletable
+
+
NoContent
diff --git a/config/alfresco/node-services-context.xml b/config/alfresco/node-services-context.xml
index f45b86ee63..856d9f5f7c 100644
--- a/config/alfresco/node-services-context.xml
+++ b/config/alfresco/node-services-context.xml
@@ -216,33 +216,16 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ ${spaces.archive.store}
@@ -260,4 +243,9 @@
+
+
+
+
+
diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml
index 96818dba05..9bb96341f4 100644
--- a/config/alfresco/patch/patch-services-context.xml
+++ b/config/alfresco/patch/patch-services-context.xml
@@ -2708,6 +2708,7 @@
+ swsdp
diff --git a/config/alfresco/site-services-context.xml b/config/alfresco/site-services-context.xml
index d7a8c04cae..932b701437 100644
--- a/config/alfresco/site-services-context.xml
+++ b/config/alfresco/site-services-context.xml
@@ -90,7 +90,9 @@
-
+
+
+
@@ -107,5 +109,13 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/config/alfresco/subsystems/ActivitiesFeed/default/activities-jobs.properties b/config/alfresco/subsystems/ActivitiesFeed/default/activities-jobs.properties
index 5b811f8fcf..61c2f78565 100644
--- a/config/alfresco/subsystems/ActivitiesFeed/default/activities-jobs.properties
+++ b/config/alfresco/subsystems/ActivitiesFeed/default/activities-jobs.properties
@@ -10,7 +10,7 @@ activities.feed.max.ageMins=44640
# - refer to "sysAdmin" subsystem for Share url/ctx properties (share.*)
activities.feed.notifier.startDelayMins=0
# Feed notification period (eg. 1440 mins => every 24 hours)
-activities.feed.notifier.repeatIntervalMins=1
+activities.feed.notifier.repeatIntervalMins=1440
activities.feed.notifier.enabled=true
# activities feed generator
diff --git a/config/alfresco/subsystems/googledocs/default/googledocs.properties b/config/alfresco/subsystems/googledocs/default/googledocs.properties
index e262d205da..b6c63421fb 100755
--- a/config/alfresco/subsystems/googledocs/default/googledocs.properties
+++ b/config/alfresco/subsystems/googledocs/default/googledocs.properties
@@ -10,8 +10,8 @@ googledocs.url=http://docs.google.com/feeds/default/private/full
googledocs.downloadurl=https://docs.google.com/feeds/download
# System google docs authentication credentials
-#googledocs.username=
-#googledocs.password=
+googledocs.username=
+googledocs.password=
# Google docs spreadsheet service name
googledocs.spreadsheet.service.name=wise
\ No newline at end of file
diff --git a/config/alfresco/subsystems/thirdparty/default/swf-transform-context.xml b/config/alfresco/subsystems/thirdparty/default/swf-transform-context.xml
index 104c47f891..a709a87530 100644
--- a/config/alfresco/subsystems/thirdparty/default/swf-transform-context.xml
+++ b/config/alfresco/subsystems/thirdparty/default/swf-transform-context.xml
@@ -50,6 +50,14 @@
application/x-shockwave-flash
+
+
+ application/illustrator
+
+
+ application/x-shockwave-flash
+
+
diff --git a/config/alfresco/templates/activities-email-templates.acp b/config/alfresco/templates/activities-email-templates.acp
index 148cc4a5b6..de1f1a4bbb 100644
Binary files a/config/alfresco/templates/activities-email-templates.acp and b/config/alfresco/templates/activities-email-templates.acp differ
diff --git a/config/alfresco/templates/email_templates2.acp b/config/alfresco/templates/email_templates2.acp
index 69cf847361..5e6bd60121 100644
Binary files a/config/alfresco/templates/email_templates2.acp and b/config/alfresco/templates/email_templates2.acp differ
diff --git a/config/alfresco/templates/invite-email-templates.acp b/config/alfresco/templates/invite-email-templates.acp
index 3e6148173e..d8080c15cd 100644
Binary files a/config/alfresco/templates/invite-email-templates.acp and b/config/alfresco/templates/invite-email-templates.acp differ
diff --git a/config/alfresco/templates/new-user-templates.acp b/config/alfresco/templates/new-user-templates.acp
index f82e6de74d..6356ca6040 100644
Binary files a/config/alfresco/templates/new-user-templates.acp and b/config/alfresco/templates/new-user-templates.acp differ
diff --git a/config/alfresco/thumbnail-service-context.xml b/config/alfresco/thumbnail-service-context.xml
index d36c0d0b99..e867b0118e 100644
--- a/config/alfresco/thumbnail-service-context.xml
+++ b/config/alfresco/thumbnail-service-context.xml
@@ -263,6 +263,7 @@
+
diff --git a/config/alfresco/thumbnail/thumbnail_placeholder_doclib_m4v.png b/config/alfresco/thumbnail/thumbnail_placeholder_doclib_m4v.png
new file mode 100644
index 0000000000..9c033a2d0c
Binary files /dev/null and b/config/alfresco/thumbnail/thumbnail_placeholder_doclib_m4v.png differ
diff --git a/source/java/org/alfresco/repo/action/executer/MailActionExecuter.java b/source/java/org/alfresco/repo/action/executer/MailActionExecuter.java
index 11bf09d1ed..7d3b945c34 100644
--- a/source/java/org/alfresco/repo/action/executer/MailActionExecuter.java
+++ b/source/java/org/alfresco/repo/action/executer/MailActionExecuter.java
@@ -47,6 +47,7 @@ import org.alfresco.service.cmr.security.AuthenticationService;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PersonService;
+import org.alfresco.util.UrlUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.EmailValidator;
@@ -566,7 +567,10 @@ public class MailActionExecuter extends ActionExecuterAbstractBase
model.put("hasAspect", new HasAspectMethod());
model.put("message", new I18NMessageMethod());
model.put("dateCompare", new DateCompareMethod());
+
+ // add URLs
model.put("url", new URLHelper(repoRemoteUrl));
+ model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(this.serviceRegistry.getSysAdminParams()));
// if the caller specified a model, use it without overriding
if(suppliedModel != null && suppliedModel.size() > 0)
diff --git a/source/java/org/alfresco/repo/activities/feed/FeedNotifierImpl.java b/source/java/org/alfresco/repo/activities/feed/FeedNotifierImpl.java
index 3d09386cf3..65cf74bdae 100644
--- a/source/java/org/alfresco/repo/activities/feed/FeedNotifierImpl.java
+++ b/source/java/org/alfresco/repo/activities/feed/FeedNotifierImpl.java
@@ -440,7 +440,6 @@ public class FeedNotifierImpl implements FeedNotifier
model.put("feedItemsCount", activityFeedModels.size());
// add Share info to model
- model.put(TemplateService.KEY_SHARE_URL, shareUrl);
model.put(TemplateService.KEY_PRODUCT_NAME, ModelUtil.getProductName(repoAdminService));
Map personPrefixProps = new HashMap(personProps.size());
diff --git a/source/java/org/alfresco/repo/admin/patch/impl/SiteLoadPatch.java b/source/java/org/alfresco/repo/admin/patch/impl/SiteLoadPatch.java
index d9394a4b23..d5c51cbc7f 100644
--- a/source/java/org/alfresco/repo/admin/patch/impl/SiteLoadPatch.java
+++ b/source/java/org/alfresco/repo/admin/patch/impl/SiteLoadPatch.java
@@ -35,7 +35,9 @@ import org.alfresco.model.ContentModel;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.importer.AVMZipBootstrap;
import org.alfresco.repo.importer.ImporterBootstrap;
+import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.site.SiteModel;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
@@ -77,6 +79,7 @@ public class SiteLoadPatch extends AbstractPatch
private static final Log logger = LogFactory.getLog(SiteLoadPatch.class);
private AuthorityService authorityService;
+ private BehaviourFilter behaviourFilter;
private SiteService siteService;
private String siteName;
@@ -144,6 +147,11 @@ public class SiteLoadPatch extends AbstractPatch
this.authorityService = authorityService;
}
+ public void setBehaviourFilter(BehaviourFilter behaviourFilter)
+ {
+ this.behaviourFilter = behaviourFilter;
+ }
+
@Override
protected void checkProperties()
{
@@ -284,11 +292,21 @@ public class SiteLoadPatch extends AbstractPatch
// Load the Main (ACP) Contents
if(bootstrapViews.containsKey(PROPERTIES_CONTENTS))
{
- // Clear up the stub content that createSite gave us, first
- // apply the temporary aspect though to prevent the node from
- // being archived
- nodeService.addAspect(site.getNodeRef(), ContentModel.ASPECT_TEMPORARY, null);
- nodeService.deleteNode(site.getNodeRef());
+ // Disable the behaviour which prevents site deletion.
+ behaviourFilter.disableBehaviour(site.getNodeRef(), ContentModel.ASPECT_UNDELETABLE);
+ try
+ {
+ // Clear up the stub content that createSite gave us, first
+ // apply the temporary aspect though to prevent the node from
+ // being archived
+ nodeService.addAspect(site.getNodeRef(), ContentModel.ASPECT_TEMPORARY, null);
+ nodeService.deleteNode(site.getNodeRef());
+ }
+ finally
+ {
+ behaviourFilter.enableBehaviour(site.getNodeRef(), ContentModel.ASPECT_UNDELETABLE);
+ }
+
// Now load in the real content from the ACP
List views = new ArrayList(1);
diff --git a/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracter.java b/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracter.java
index 61c9951e25..c1d56c5965 100644
--- a/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracter.java
+++ b/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracter.java
@@ -46,7 +46,7 @@ public class PdfBoxMetadataExtracter extends TikaPoweredMetadataExtracter
protected static Log pdfLogger = LogFactory.getLog(PdfBoxMetadataExtracter.class);
public static ArrayList SUPPORTED_MIMETYPES = buildSupportedMimetypes(
- new String[] { MimetypeMap.MIMETYPE_PDF },
+ new String[] { MimetypeMap.MIMETYPE_PDF, MimetypeMap.MIMETYPE_APPLICATION_ILLUSTRATOR },
new PDFParser()
);
diff --git a/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracterTest.java b/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracterTest.java
index b1f2f0d996..7b58d4114b 100644
--- a/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracterTest.java
+++ b/source/java/org/alfresco/repo/content/metadata/PdfBoxMetadataExtracterTest.java
@@ -67,7 +67,16 @@ public class PdfBoxMetadataExtracterTest extends AbstractMetadataExtracterTest
{
testExtractFromMimetype(MimetypeMap.MIMETYPE_PDF);
}
-
+
+ /**
+ * This test method extracts metadata from an Adobe Illustrator file (which in recent versions is a pdf file).
+ * @since 3.5.0
+ */
+ public void testAiExtraction() throws Exception
+ {
+ testExtractFromMimetype(MimetypeMap.MIMETYPE_APPLICATION_ILLUSTRATOR);
+ }
+
/**
* We can also return a created date
*/
diff --git a/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformer.java b/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformer.java
index 21d06e91f2..d904a66a65 100644
--- a/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformer.java
+++ b/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformer.java
@@ -55,9 +55,11 @@ public class PdfBoxPdfToImageContentTransformer extends AbstractContentTransform
public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options)
{
- // only support PDF -> PNG
- return (MimetypeMap.MIMETYPE_PDF.equals(sourceMimetype) == true &&
- MimetypeMap.MIMETYPE_IMAGE_PNG.equals(targetMimetype) == true);
+ // only support PDF -> PNG OR Adobe Illustrator -> PNG.
+ // Recent .ai file format is a .pdf file.
+ return ( (MimetypeMap.MIMETYPE_PDF.equals(sourceMimetype) ||
+ MimetypeMap.MIMETYPE_APPLICATION_ILLUSTRATOR.equals(sourceMimetype))
+ && MimetypeMap.MIMETYPE_IMAGE_PNG.equals(targetMimetype));
}
@SuppressWarnings("unchecked")
diff --git a/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformerTest.java b/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformerTest.java
index 803846ffd5..2cb042393a 100644
--- a/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformerTest.java
+++ b/source/java/org/alfresco/repo/content/transform/PdfBoxPdfToImageContentTransformerTest.java
@@ -61,7 +61,7 @@ public class PdfBoxPdfToImageContentTransformerTest extends AbstractContentTrans
}
/**
- * This test method checks that the PDFBox-based transformer is able to extract text content from a secured PDF file.
+ * This test method checks that the PDFBox-based transformer is able to extract image content from a secured PDF file.
* See ALF-6650.
*
* @since 3.4.2
@@ -86,4 +86,33 @@ public class PdfBoxPdfToImageContentTransformerTest extends AbstractContentTrans
checkReader.setMimetype(MimetypeMap.MIMETYPE_IMAGE_PNG);
assertTrue("PNG output was empty", checkReader.getContentData().getSize() != 0l);
}
+
+ /**
+ * This test method checks that the PDFBox-based transformer is able to transform an Adobe Illustrator file to image.
+ * Adobe Illustrator files (.ai) have been PostScript files in the past, but are now just pdf files.
+ *
+ * @since 3.5.0
+ */
+ public void testTransformAdobeIllustrator() throws Exception
+ {
+ for (String quickFile : new String[]{"quickCS3.ai", "quickCS5.ai"})
+ {
+ File aiFile = loadNamedQuickTestFile(quickFile);
+ assertNotNull("test file was null.", aiFile);
+ ContentReader reader = new FileContentReader(aiFile);
+ reader.setMimetype(MimetypeMap.MIMETYPE_APPLICATION_ILLUSTRATOR);
+ reader.setEncoding("UTF-8");
+ ContentWriter writer = new FileContentWriter(TempFileProvider
+ .createTempFile(this.getClass().getSimpleName()
+ + System.currentTimeMillis(), "txt"));
+ writer.setMimetype(MimetypeMap.MIMETYPE_IMAGE_PNG);
+ writer.setEncoding("UTF-8");
+ transformer.transform(reader, writer);
+ // get a reader onto the transformed content and check - although the real test here is that exceptions weren't thrown during transformation.
+ ContentReader checkReader = writer.getReader();
+ checkReader.setMimetype(MimetypeMap.MIMETYPE_IMAGE_PNG);
+ assertTrue("PNG output was empty", checkReader.getContentData()
+ .getSize() != 0l);
+ }
+ }
}
diff --git a/source/java/org/alfresco/repo/content/transform/PdfToImageContentTransformer.java b/source/java/org/alfresco/repo/content/transform/PdfToImageContentTransformer.java
index 49c57979a2..4cf9a442ac 100644
--- a/source/java/org/alfresco/repo/content/transform/PdfToImageContentTransformer.java
+++ b/source/java/org/alfresco/repo/content/transform/PdfToImageContentTransformer.java
@@ -55,16 +55,11 @@ public class PdfToImageContentTransformer extends AbstractContentTransformer2
*/
public boolean isTransformable(String sourceMimetype, String targetMimetype, TransformationOptions options)
{
- if (MimetypeMap.MIMETYPE_PDF.equals(sourceMimetype) == true &&
- MimetypeMap.MIMETYPE_IMAGE_PNG.equals(targetMimetype) == true)
- {
- // only support PDF -> PNG
- return true;
- }
- else
- {
- return false;
- }
+ // only support PDF -> PNG OR Adobe Illustrator -> PNG.
+ // .ai is really just a .pdf file anyway
+ return ( (MimetypeMap.MIMETYPE_PDF.equals(sourceMimetype) ||
+ MimetypeMap.MIMETYPE_APPLICATION_ILLUSTRATOR.equals(sourceMimetype))
+ && MimetypeMap.MIMETYPE_IMAGE_PNG.equals(targetMimetype));
}
protected void transformInternal(
diff --git a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java
index 0be9ddc5e2..59ad25db8f 100644
--- a/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java
+++ b/source/java/org/alfresco/repo/content/transform/magick/AbstractImageMagickContentTransformerWorker.java
@@ -137,12 +137,17 @@ public abstract class AbstractImageMagickContentTransformerWorker extends Conten
*/
public static boolean isSupported(String mimetype)
{
- // ImageMagick supports the transformation of Encapsulated PostScript images,
- // whose MIME type is defined in mimetype-map.xml as "application/eps".
+ // There are a few mimetypes in the system that do not start with "image/" but which
+ // nevertheless are supported by this transformer.
if (mimetype.equals(MimetypeMap.MIMETYPE_APPLICATION_EPS))
{
- return true; // This is an image although it doesn't start with "image/"
+ return true;
}
+ else if (mimetype.equals(MimetypeMap.MIMETYPE_APPLICATION_PHOTOSHOP))
+ {
+ return true;
+ }
+
else if (!mimetype.startsWith(MIMETYPE_IMAGE_PREFIX))
{
return false; // not an image
diff --git a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java
index e53da732ca..9bea800ded 100755
--- a/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java
+++ b/source/java/org/alfresco/repo/googledocs/GoogleDocsServiceImpl.java
@@ -352,6 +352,12 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter
}
}
+ // Hack to modify the mimetype of ods file so GDoc upload works
+ if ("application/vnd.oasis.opendocument.spreadsheet".equals(mimetype) == true)
+ {
+ mimetype = "application/x-vnd.oasis.opendocument.spreadsheet";
+ }
+
// Check that we support the mimetype
if (isSupportedMimetype(mimetype) == false)
{
@@ -534,25 +540,22 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter
{
// Get the parent folder
DocumentListEntry parentFolder = getParentFolder(parentNodeRef);
-
- if (parentFolder != null)
+
+ // Determine the name of the new google folder
+ String name = null;
+ QName parentNodeType = nodeService.getType(parentNodeRef);
+ if (dictionaryService.isSubClass(parentNodeType, ContentModel.TYPE_STOREROOT) == true)
{
- // Determine the name of the new google folder
- String name = null;
- QName parentNodeType = nodeService.getType(parentNodeRef);
- if (dictionaryService.isSubClass(parentNodeType, ContentModel.TYPE_STOREROOT) == true)
- {
- name = parentNodeRef.getStoreRef().getIdentifier();
- }
- else
- {
- name = (String)nodeService.getProperty(parentNodeRef, ContentModel.PROP_NAME);
- }
-
- // Create the folder and set the meta data in Alfresco
- folder = createGoogleFolder(name, parentFolder);
- setResourceDetails(parentNodeRef, folder);
+ name = parentNodeRef.getStoreRef().getIdentifier();
}
+ else
+ {
+ name = (String)nodeService.getProperty(parentNodeRef, ContentModel.PROP_NAME);
+ }
+
+ // Create the folder and set the meta data in Alfresco
+ folder = createGoogleFolder(name, parentFolder);
+ setResourceDetails(parentNodeRef, folder);
}
}
@@ -623,6 +626,10 @@ public class GoogleDocsServiceImpl extends TransactionListenerAdapter
{
fileExtension = "doc";
}
+ else if (fileExtension.equals("xlsx"))
+ {
+ fileExtension = "xls";
+ }
if (docType.equals(TYPE_DOCUMENT) || docType.equals(TYPE_PRESENTATION))
{
diff --git a/source/java/org/alfresco/repo/invitation/site/InviteSender.java b/source/java/org/alfresco/repo/invitation/site/InviteSender.java
index d510e7658b..b0e455d70b 100644
--- a/source/java/org/alfresco/repo/invitation/site/InviteSender.java
+++ b/source/java/org/alfresco/repo/invitation/site/InviteSender.java
@@ -163,7 +163,6 @@ public class InviteSender
Map model = new HashMap();
model.put(TemplateService.KEY_COMPANY_HOME, repository.getCompanyHome());
model.put(TemplateService.KEY_USER_HOME, repository.getUserHome(repository.getPerson()));
- model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(sysAdminParams) + "/");
model.put(TemplateService.KEY_PRODUCT_NAME, ModelUtil.getProductName(repoAdminService));
// Build up the args for rendering inside the template
diff --git a/source/java/org/alfresco/repo/invitation/site/InviteSenderTest.java b/source/java/org/alfresco/repo/invitation/site/InviteSenderTest.java
index 55353bbc2c..cc9283b589 100644
--- a/source/java/org/alfresco/repo/invitation/site/InviteSenderTest.java
+++ b/source/java/org/alfresco/repo/invitation/site/InviteSenderTest.java
@@ -131,8 +131,9 @@ public class InviteSenderTest extends TestCase
// Check the model
Map model = modelC.getValue();
assertNotNull(model);
+ assertEquals(false, model.isEmpty());
assertEquals(null, model.get("userhome"));
- assertNotNull(model.get("shareUrl"));
+ assertNotNull(model.get("productName"));
// And the args within it
Map argsMap = (Map)model.get("args");
@@ -184,8 +185,9 @@ public class InviteSenderTest extends TestCase
// Check the model
Map model = modelC.getValue();
assertNotNull(model);
+ assertEquals(false, model.isEmpty());
assertEquals(null, model.get("userhome"));
- assertNotNull(model.get("shareUrl"));
+ assertNotNull(model.get("productName"));
// And the args within it
Map argsMap = (Map)model.get("args");
@@ -211,8 +213,9 @@ public class InviteSenderTest extends TestCase
// Check the model
Map model = modelC.getValue();
assertNotNull(model);
+ assertEquals(false, model.isEmpty());
assertEquals(null, model.get("userhome"));
- assertNotNull(model.get("shareUrl"));
+ assertNotNull(model.get("productName"));
// And the args within it
Map argsMap = (Map)model.get("args");
diff --git a/source/java/org/alfresco/repo/jscript/ScriptUtils.java b/source/java/org/alfresco/repo/jscript/ScriptUtils.java
index e3357ae46d..72a192ebda 100644
--- a/source/java/org/alfresco/repo/jscript/ScriptUtils.java
+++ b/source/java/org/alfresco/repo/jscript/ScriptUtils.java
@@ -19,6 +19,7 @@
package org.alfresco.repo.jscript;
import java.util.Date;
+import java.util.Map;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.module.ModuleDetails;
@@ -26,6 +27,7 @@ import org.alfresco.service.cmr.module.ModuleService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
+import org.alfresco.util.PagingDetails;
import org.springframework.extensions.surf.util.I18NUtil;
import org.springframework.extensions.surf.util.ISO8601DateFormat;
@@ -166,6 +168,46 @@ public final class ScriptUtils extends BaseScopableProcessorExtension
{
return createQName(s).toString();
}
+
+ /**
+ * Builds a paging object, from the supplied
+ * Max Items and Skip Count
+ */
+ public PagingDetails createPaging(int maxItems, int skipCount)
+ {
+ return new PagingDetails(maxItems, skipCount);
+ }
+
+ /**
+ * Builds a paging object, from the supplied Args object.
+ * Requires that the parameters have their standard names,
+ * i.e. "maxItems" and "skipCount"
+ */
+ public PagingDetails createPaging(Map args)
+ {
+ int maxItems = -1;
+ int skipCount = -1;
+ if(args.containsKey("maxItems"))
+ {
+ try
+ {
+ maxItems = Integer.parseInt(args.get("maxItems"));
+ }
+ catch(NumberFormatException e)
+ {}
+ }
+ if(args.containsKey("skipCount"))
+ {
+ try
+ {
+ skipCount = Integer.parseInt(args.get("skipCount"));
+ }
+ catch(NumberFormatException e)
+ {}
+ }
+
+ return new PagingDetails(maxItems, skipCount);
+ }
/**
* Helper to create a QName from either a fully qualified or short-name QName string
diff --git a/source/java/org/alfresco/repo/management/subsystems/AbstractPropertyBackedBean.java b/source/java/org/alfresco/repo/management/subsystems/AbstractPropertyBackedBean.java
index ca35411440..ec45a3a23c 100644
--- a/source/java/org/alfresco/repo/management/subsystems/AbstractPropertyBackedBean.java
+++ b/source/java/org/alfresco/repo/management/subsystems/AbstractPropertyBackedBean.java
@@ -21,11 +21,15 @@ package org.alfresco.repo.management.subsystems;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
@@ -90,6 +94,9 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
/** Lock for concurrent access. */
protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+ /** The logger. */
+ private static Log logger = LogFactory.getLog(AbstractPropertyBackedBean.class);
+
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.
@@ -461,6 +468,12 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
{
start(false);
}
+ catch (Exception e)
+ {
+ // Let's log and swallow auto-start exceptions so that they are non-fatal. This means that the system
+ // can hopefully be brought up to a level where its configuration can be edited and corrected
+ logger.error("Error auto-starting subsystem", e);
+ }
finally
{
this.lock.writeLock().unlock();
@@ -551,6 +564,55 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
}
}
+ public void setProperties(Map properties)
+ {
+ this.lock.writeLock().lock();
+ try
+ {
+ // Bring down the bean across the cluster
+ stop(true);
+ doInit();
+
+ Map previousValues = new HashMap(properties.size() * 2);
+ try
+ {
+ // Set each of the properties and back up their previous values just in case
+ for (Map.Entry entry : properties.entrySet())
+ {
+ String property = entry.getKey();
+ String previousValue = this.state.getProperty(property);
+ this.state.setProperty(property, entry.getValue());
+ previousValues.put(property, previousValue);
+ }
+
+ // Attempt to start locally
+ start(false);
+
+ // We still haven't broadcast the start - a persist is required first
+ }
+ catch (Exception e)
+ {
+ // Oh dear - something went wrong. So restore previous state before rethrowing
+ for (Map.Entry entry : previousValues.entrySet())
+ {
+ this.state.setProperty(entry.getKey(), entry.getValue());
+ }
+
+ // Bring the bean back up across the cluster
+ start(true);
+ if (e instanceof RuntimeException)
+ {
+ throw (RuntimeException) e;
+ }
+ throw new IllegalStateException(e);
+ }
+ }
+ finally
+ {
+ this.lock.writeLock().unlock();
+ }
+
+ }
/**
* {@inheritDoc}
*/
@@ -575,6 +637,10 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
*/
protected void start(boolean broadcast)
{
+ if (broadcast)
+ {
+ this.registry.broadcastStart(this);
+ }
boolean hadWriteLock = this.lock.isWriteLockedByCurrentThread();
if (!this.isStarted)
{
@@ -588,10 +654,6 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
if (!this.isStarted)
{
doInit();
- if (broadcast)
- {
- this.registry.broadcastStart(this);
- }
this.state.start();
this.isStarted = true;
}
@@ -631,6 +693,10 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
*/
protected void stop(boolean broadcast)
{
+ if (broadcast)
+ {
+ this.registry.broadcastStop(this);
+ }
boolean hadWriteLock = this.lock.isWriteLockedByCurrentThread();
if (this.isStarted)
{
@@ -643,10 +709,6 @@ public abstract class AbstractPropertyBackedBean implements PropertyBackedBean,
{
if (this.isStarted)
{
- if (broadcast)
- {
- this.registry.broadcastStop(this);
- }
this.state.stop();
this.isStarted = false;
}
diff --git a/source/java/org/alfresco/repo/management/subsystems/PropertyBackedBean.java b/source/java/org/alfresco/repo/management/subsystems/PropertyBackedBean.java
index d1a3c5fcc5..ae631f8e45 100644
--- a/source/java/org/alfresco/repo/management/subsystems/PropertyBackedBean.java
+++ b/source/java/org/alfresco/repo/management/subsystems/PropertyBackedBean.java
@@ -19,6 +19,7 @@
package org.alfresco.repo.management.subsystems;
import java.util.List;
+import java.util.Map;
/**
* A PropertyBackedBean is a reconfigurable sub-component or subsystem in the Alfresco server. It exposes
@@ -60,4 +61,14 @@ public interface PropertyBackedBean extends PropertyBackedBeanState
* Reverts this component to its original default start state, removing any previously persisted state changes.
*/
public void revert();
+
+ /**
+ * Tries setting the given properties on this component. Will leave the component in a started state consisting of
+ * the new properties if they are valid, or the previous state otherwise. Note that the new state still has to be
+ * confirmed to the entire cluster with {@link #start()}, presumably after persistence of the new state has been
+ * completed.
+ *
+ * @param properties
+ */
+ public void setProperties(Map properties);
}
diff --git a/source/java/org/alfresco/repo/node/UndeletableAspect.java b/source/java/org/alfresco/repo/node/UndeletableAspect.java
new file mode 100644
index 0000000000..aec2692f1d
--- /dev/null
+++ b/source/java/org/alfresco/repo/node/UndeletableAspect.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2005-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.repo.node;
+
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.model.ContentModel;
+import org.alfresco.repo.node.NodeServicePolicies;
+import org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy;
+import org.alfresco.repo.policy.Behaviour;
+import org.alfresco.repo.policy.JavaBehaviour;
+import org.alfresco.repo.policy.PolicyComponent;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.site.SiteService;
+import org.alfresco.service.namespace.QName;
+
+/**
+ * Undeletable aspect behaviour bean.
+ *
+ * Deletions of nodes with the {@link ContentModel#ASPECT_UNDELETABLE} are not allowed by default.
+ * This class registers the behaviour that prevents the deletion.
+ *
+ * This aspect/behaviour combination allows for detailed application control of when node deletion is allowed
+ * or disallowed for particular nodes. It is not related to the normal permissions controls, which of course apply.
+ *
+ * An example of its usage is in the {@link SiteService}, where {@link SiteModel#TYPE_SITE} nodes are given the
+ * {@link ContentModel#ASPECT_UNDELETABLE} as a mandatory aspect. Therefore any attempt to delete such a node will
+ * result in an exception. However, this behaviour is disabled within the {@link SiteService} in order to allow
+ * site node deletion from within that service but from no other code.
+ *
+ * @author Neil Mc Erlean
+ * @since 3.5.0
+ */
+public class UndeletableAspect implements NodeServicePolicies.BeforeDeleteNodePolicy
+{
+ private PolicyComponent policyComponent;
+ private NodeService nodeService;
+
+ /**
+ * Set the policy component
+ *
+ * @param policyComponent policy component
+ */
+ public void setPolicyComponent(PolicyComponent policyComponent)
+ {
+ this.policyComponent = policyComponent;
+ }
+
+ /**
+ * Set the node service
+ *
+ * @param nodeService node service
+ */
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ /**
+ * Initialise method
+ */
+ public void init()
+ {
+ this.policyComponent.bindClassBehaviour(BeforeDeleteNodePolicy.QNAME,
+ ContentModel.ASPECT_UNDELETABLE,
+ new JavaBehaviour(this, "beforeDeleteNode", Behaviour.NotificationFrequency.EVERY_EVENT));
+ }
+
+ /**
+ * Ensures that undeletable nodes cannot be deleted by default.
+ */
+ @Override
+ public void beforeDeleteNode(NodeRef nodeRef)
+ {
+ QName nodeType = nodeService.getType(nodeRef);
+ throw new AlfrescoRuntimeException(nodeType.toPrefixString() + " deletion is not allowed. Attempted to delete " + nodeRef);
+ }
+}
diff --git a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
index d7e9f56bf6..37c09296bb 100644
--- a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
+++ b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java
@@ -20,6 +20,7 @@ package org.alfresco.repo.node.archive;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -34,6 +35,7 @@ import org.alfresco.repo.node.StoreArchiveMap;
import org.alfresco.repo.node.archive.RestoreNodeReport.RestoreStatus;
import org.alfresco.repo.node.integrity.IntegrityChecker;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -168,6 +170,7 @@ public class ArchiveAndRestoreTest extends TestCase
{
e.printStackTrace();
}
+ AuthenticationUtil.clearCurrentSecurityContext();
}
/**
@@ -673,7 +676,6 @@ public class ArchiveAndRestoreTest extends TestCase
* Check that the existence of the node in the archive store doesn't prevent archival.
* It is possible to restore a node to the SpacesStore from some other source. When
* that node is archived, the currently archived node must be overwritten.
- * @throws Exception
*/
public void testAR1519ArchiveCleansDuplicateUuid() throws Exception
{
@@ -717,4 +719,42 @@ public class ArchiveAndRestoreTest extends TestCase
verifyNodeExistence(a_, true);
verifyNodeExistence(b_, true);
}
+
+ /**
+ * ALF-7889
+ */
+ public synchronized void testAR7889ArchiveAndRestoreMustNotModifyAuditable() throws Exception
+ {
+ AuthenticationUtil.setFullyAuthenticatedUser(USER_A);
+ nodeService.addAspect(b, ContentModel.ASPECT_AUDITABLE, null);
+
+ // Do a little wait to ensure that the cm:auditable modified date is at least 1s old
+ wait(2000L);
+
+ // Get the cm:auditable modified time
+ String modifierOriginal = (String) nodeService.getProperty(b, ContentModel.PROP_MODIFIER);
+ Date modifiedOriginal = (Date) nodeService.getProperty(b, ContentModel.PROP_MODIFIED);
+
+ nodeService.deleteNode(b);
+ verifyNodeExistence(b_, true);
+
+ // Check that the cm:auditable modified did not change
+ String modifierArchived = (String) nodeService.getProperty(b_, ContentModel.PROP_MODIFIER);
+ Date modifiedArchived = (Date) nodeService.getProperty(b_, ContentModel.PROP_MODIFIED);
+ assertEquals("cm:modifier should not have changed", modifierOriginal, modifierArchived);
+ assertEquals("cm:modified should not have changed", modifiedOriginal, modifiedArchived);
+
+ // Restore is done using clean txn
+ commitAndBeginNewTransaction();
+
+ // Restore and check cm:auditable
+ RestoreNodeReport report = nodeArchiveService.restoreArchivedNode(b_);
+ assertEquals("Restore failed", RestoreStatus.SUCCESS, report.getStatus());
+
+ // Check that the cm:auditable modified did not change
+ String modifierRestored = (String) nodeService.getProperty(b, ContentModel.PROP_MODIFIER);
+ Date modifiedRestored = (Date) nodeService.getProperty(b, ContentModel.PROP_MODIFIED);
+ assertEquals("cm:modifier should not have changed", modifierOriginal, modifierRestored);
+ assertEquals("cm:modified should not have changed", modifiedOriginal, modifiedRestored);
+ }
}
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
index a023c53838..8f1e25832e 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
@@ -42,6 +42,7 @@ import org.alfresco.repo.node.AbstractNodeServiceImpl;
import org.alfresco.repo.node.StoreArchiveMap;
import org.alfresco.repo.node.archive.NodeArchiveService;
import org.alfresco.repo.node.index.NodeIndexer;
+import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.TransactionalResourceHelper;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
@@ -87,7 +88,8 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
private NodeDAO nodeDAO;
private StoreArchiveMap storeArchiveMap;
private NodeService avmNodeService;
- private NodeIndexer nodeIndexer;
+ private NodeIndexer nodeIndexer;
+ private BehaviourFilter policyBehaviourFilter;
private final static String KEY_PRE_COMMIT_ADD_NODE = "DbNodeServiceImpl.PreCommitAddNode";
private final static String KEY_DELETED_NODES = "DbNodeServiceImpl.DeletedNodes";
@@ -125,6 +127,15 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
this.nodeIndexer = nodeIndexer;
}
+ /**
+ *
+ * @param policyBehaviourFilter component used to enable and disable behaviours
+ */
+ public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter)
+ {
+ this.policyBehaviourFilter = policyBehaviourFilter;
+ }
+
/**
* Performs a null-safe get of the node
*
@@ -1984,7 +1995,26 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
return nodeDAO.getPaths(nodePair, primaryOnly);
}
+ /**
+ * Archives the node without the cm:auditable aspect behaviour
+ */
private void archiveNode(NodeRef nodeRef, StoreRef archiveStoreRef)
+ {
+ boolean wasDisabled = policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
+ try
+ {
+ archiveNodeImpl(nodeRef, archiveStoreRef);
+ }
+ finally
+ {
+ if (!wasDisabled)
+ {
+ policyBehaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE);
+ }
+ }
+ }
+
+ private void archiveNodeImpl(NodeRef nodeRef, StoreRef archiveStoreRef)
{
Pair nodePair = getNodePairNotNull(nodeRef);
Long nodeId = nodePair.getFirst();
@@ -2024,7 +2054,28 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
NodeArchiveService.QNAME_ARCHIVED_ITEM);
}
+ /**
+ * {@inheritDoc}
+ *
+ * Archives the node without the cm:auditable aspect behaviour
+ */
public NodeRef restoreNode(NodeRef archivedNodeRef, NodeRef destinationParentNodeRef, QName assocTypeQName, QName assocQName)
+ {
+ boolean wasDisabled = policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
+ try
+ {
+ return restoreNodeImpl(archivedNodeRef, destinationParentNodeRef, assocTypeQName, assocQName);
+ }
+ finally
+ {
+ if (!wasDisabled)
+ {
+ policyBehaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE);
+ }
+ }
+ }
+
+ private NodeRef restoreNodeImpl(NodeRef archivedNodeRef, NodeRef destinationParentNodeRef, QName assocTypeQName, QName assocQName)
{
Pair archivedNodePair = getNodePairNotNull(archivedNodeRef);
Long archivedNodeId = archivedNodePair.getFirst();
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
index e75d34fda6..50c6320abc 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
@@ -926,6 +926,12 @@ public class RuleServiceImpl
{
enableRules(nodeRef);
}
+
+ // If this was the last rule on the node, remove the aspect
+ if(countRules(nodeRef) == 0)
+ {
+ this.nodeService.removeAspect(nodeRef, RuleModel.ASPECT_RULES);
+ }
}
// Drop the rules from the cache
nodeRulesCache.remove(nodeRef);
@@ -972,6 +978,9 @@ public class RuleServiceImpl
this.nodeService.removeChild(folder, ruleChildAssoc.getChildRef());
}
}
+
+ // As this was the last rule on the node, remove the aspect
+ this.nodeService.removeAspect(nodeRef, RuleModel.ASPECT_RULES);
}
// Drop the rules from the cache
nodeRulesCache.remove(nodeRef);
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
index 6cacae1507..88461c0704 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
@@ -96,7 +96,12 @@ public class RuleServiceImplTest extends BaseRuleTest
*/
public void testAddRule()
{
- Rule newRule = createTestRule();
+ Rule newRule = createTestRule();
+
+ // The node it's going on won't have the aspect yet
+ assertEquals(false, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+ // Attach the rule to the node
this.ruleService.saveRule(this.nodeRef, newRule);
assertNotNull(newRule.getNodeRef());
@@ -104,6 +109,10 @@ public class RuleServiceImplTest extends BaseRuleTest
assertNotNull(this.ruleService.getOwningNodeRef(newRule));
assertEquals(this.nodeRef, this.ruleService.getOwningNodeRef(newRule));
+ // Check the aspect was applied to the owning node
+ assertEquals(true, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+ // Check we can retrieve it
Rule savedRule = this.ruleService.getRule(newRule.getNodeRef());
assertNotNull(savedRule);
assertFalse(savedRule.isAppliedToChildren());
@@ -116,6 +125,64 @@ public class RuleServiceImplTest extends BaseRuleTest
assertTrue(savedRule2.isAppliedToChildren());
}
+ public void testRemoveRule()
+ {
+ this.ruleService.removeAllRules(this.nodeRef);
+ List rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(0, rules.size());
+ assertEquals(false, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+
+ // Add a rule + check
+ Rule newRule = createTestRule(); //this.ruleService.createRule(ruleType.getName());
+ this.ruleService.saveRule(this.nodeRef, newRule);
+
+ rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(1, rules.size());
+ assertEquals(true, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+
+ // Remove it
+ this.ruleService.removeRule(nodeRef, newRule);
+
+ // And check
+ rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(0, rules.size());
+ assertEquals(false, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+
+ // Add two rules
+ Rule newRule2 = createTestRule(); //this.ruleService.createRule(ruleType.getName());
+ this.ruleService.saveRule(this.nodeRef, newRule2);
+ Rule newRule3 = createTestRule(); //this.ruleService.createRule(ruleType.getName());
+ this.ruleService.saveRule(this.nodeRef, newRule3);
+
+ rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(2, rules.size());
+ assertEquals(true, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+
+ // Remove each in turn
+ this.ruleService.removeRule(nodeRef, newRule3);
+
+ rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(1, rules.size());
+ assertEquals(true, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+
+ this.ruleService.removeRule(nodeRef, newRule2);
+
+ rules = this.ruleService.getRules(this.nodeRef);
+ assertNotNull(rules);
+ assertEquals(0, rules.size());
+ assertEquals(false, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+ }
+
public void testRemoveAllRules()
{
this.ruleService.removeAllRules(this.nodeRef);
@@ -128,15 +195,22 @@ public class RuleServiceImplTest extends BaseRuleTest
Rule newRule2 = createTestRule(); //this.ruleService.createRule(ruleType.getName());
this.ruleService.saveRule(this.nodeRef, newRule2);
+ // Check the rules are showing up as expected
List rules2 = this.ruleService.getRules(this.nodeRef);
assertNotNull(rules2);
assertEquals(2, rules2.size());
-
+ assertEquals(true, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
+
+ // Remove all the rules from the node
this.ruleService.removeAllRules(this.nodeRef);
+ // Check they've gone
List rules3 = this.ruleService.getRules(this.nodeRef);
assertNotNull(rules3);
assertEquals(0, rules3.size());
+
+ // Removing the rules will have removed the aspect from the node
+ assertEquals(false, nodeService.hasAspect(nodeRef, RuleModel.ASPECT_RULES));
}
/**
diff --git a/source/java/org/alfresco/repo/rule/RuleTypeImpl.java b/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
index c035be5a64..d7a1ce0bbe 100644
--- a/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
+++ b/source/java/org/alfresco/repo/rule/RuleTypeImpl.java
@@ -121,7 +121,9 @@ public class RuleTypeImpl extends CommonResourceAbstractBase implements RuleType
{
if (ruleService.isEnabled() == true &&
nodeService.exists(actionedUponNodeRef) == true &&
- nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_TEMPORARY) == false &&
+ nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_TEMPORARY) == false &&
+ // Temporary workaround to prevent rules running on cm:rating nodes (which happened for 'liked' folders ALF-8308 & ALF-8382)
+ ContentModel.TYPE_RATING.equals(nodeService.getType(actionedUponNodeRef)) == false &&
ruleService.isRuleTypeEnabled(this.getName()) == true)
{
List rules = ruleService.getRules(
diff --git a/source/java/org/alfresco/repo/security/authority/script/Authority.java b/source/java/org/alfresco/repo/security/authority/script/Authority.java
index d91306e5cc..54ab7cedba 100644
--- a/source/java/org/alfresco/repo/security/authority/script/Authority.java
+++ b/source/java/org/alfresco/repo/security/authority/script/Authority.java
@@ -18,6 +18,10 @@
*/
package org.alfresco.repo.security.authority.script;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
public interface Authority
{
public enum ScriptAuthorityType { GROUP, USER };
@@ -26,4 +30,51 @@ public interface Authority
public String getFullName();
public String getDisplayName();
+
+ /**
+ * Does case insensitive sorting of ScriptGroups and ScriptUsers.
+ */
+ public static class AuthorityComparator implements Comparator
+ {
+ private Map nameCache;
+ private String sortBy;
+
+ public AuthorityComparator(String sortBy)
+ {
+ this.sortBy = sortBy;
+ this.nameCache = new HashMap();
+ }
+
+ @Override
+ public int compare(Authority g1, Authority g2)
+ {
+ return get(g1).compareTo( get(g2) );
+ }
+
+ private String get(Authority g)
+ {
+ String v = nameCache.get(g);
+ if(v == null)
+ {
+ // Get the value from the group
+ if("displayName".equals(sortBy))
+ {
+ v = g.getDisplayName();
+ }
+ else if("shortName".equals(sortBy))
+ {
+ v = g.getShortName();
+ }
+ else
+ {
+ v = g.getFullName();
+ }
+ // Lower case it for case insensitive search
+ v = v.toLowerCase();
+ // Cache it
+ nameCache.put(g, v);
+ }
+ return v;
+ }
+ }
}
diff --git a/source/java/org/alfresco/repo/security/authority/script/ScriptAuthorityService.java b/source/java/org/alfresco/repo/security/authority/script/ScriptAuthorityService.java
index 618cda3c3c..b540be5365 100644
--- a/source/java/org/alfresco/repo/security/authority/script/ScriptAuthorityService.java
+++ b/source/java/org/alfresco/repo/security/authority/script/ScriptAuthorityService.java
@@ -27,6 +27,8 @@ import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
import org.alfresco.repo.security.authority.UnknownAuthorityException;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
+import org.alfresco.util.PagingDetails;
+
/**
* Script object representing the authority service.
*
@@ -61,9 +63,23 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
/**
* Search the root groups, those without a parent group.
*
+ * @param maxItems Maximum number of items returned.
+ * @param skipCount number of items to skip.
* @return The root groups (empty if there are no root groups)
*/
public ScriptGroup[] searchRootGroupsInZone(String displayNamePattern, String zone, int maxItems, int skipCount)
+ {
+ return searchRootGroupsInZone(displayNamePattern, zone, new PagingDetails(maxItems, skipCount), null);
+ }
+
+ /**
+ * Search the root groups, those without a parent group.
+ *
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ * @return The root groups (empty if there are no root groups)
+ */
+ public ScriptGroup[] searchRootGroupsInZone(String displayNamePattern, String zone, PagingDetails paging, String sortBy)
{
Set authorities;
try {
@@ -74,9 +90,9 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
{
authorities = Collections.emptySet();
}
- return makeScriptGroups(authorities, maxItems, skipCount, authorityService);
+ return makeScriptGroups(authorities, paging, sortBy, authorityService);
}
-
+
/**
* Search the root groups, those without a parent group.
* @return The root groups (empty if there are no root groups)
@@ -101,16 +117,26 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
*/
public ScriptGroup[] getAllRootGroups(int maxItems, int skipCount)
{
- Set authorities;
- try{
- authorities = authorityService.getAllRootAuthorities(AuthorityType.GROUP);
- }
+ return getAllRootGroups(new PagingDetails(maxItems, skipCount));
+ }
+
+ /**
+ * Search the root groups, those without a parent group. Searches in all zones.
+ * @return The root groups (empty if there are no root groups)
+ */
+ public ScriptGroup[] getAllRootGroups(PagingDetails paging)
+ {
+ Set authorities;
+ try{
+ authorities = authorityService.getAllRootAuthorities(AuthorityType.GROUP);
+ }
catch(UnknownAuthorityException e)
{
authorities = Collections.emptySet();
}
- return makeScriptGroups(authorities, maxItems, skipCount, authorityService);
- }
+ return makeScriptGroups(authorities, paging, authorityService);
+ }
+
/**
* Get the root groups, those without a parent group.
* @param zone zone to search in.
@@ -124,6 +150,8 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
/**
* Get the root groups, those without a parent group.
* @param zone zone to search in.
+ * @param maxItems Maximum number of items returned.
+ * @param skipCount number of items to skip.
* @return The root groups (empty if there are no root groups)
*/
public ScriptGroup[] getAllRootGroupsInZone(String zone, int maxItems, int skipCount)
@@ -138,9 +166,31 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
authorities = Collections.emptySet();
}
- return makeScriptGroups(authorities, maxItems, skipCount, authorityService);
+ return makeScriptGroups(authorities, new PagingDetails(maxItems, skipCount), null, authorityService);
}
+ /**
+ * Get the root groups, those without a parent group.
+ * @param zone zone to search in.
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ * @return The root groups (empty if there are no root groups)
+ */
+ public ScriptGroup[] getAllRootGroupsInZone(String zone, PagingDetails paging, String sortBy)
+ {
+ Set authorities;
+ try
+ {
+ authorities= authorityService.getAllRootAuthoritiesInZone(zone, AuthorityType.GROUP);
+ }
+ catch(UnknownAuthorityException e)
+ {
+ authorities = Collections.emptySet();
+ }
+
+ return makeScriptGroups(authorities, paging, sortBy, authorityService);
+ }
+
/**
* Get a group given its short name
* @param shortName, the shortName of the group
@@ -208,7 +258,7 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
{
return searchGroupsInZone(shortNameFilter, zone, -1, -1);
}
-
+
/**
* Search for groups in a specific zone
* Includes paging parameters to limit size of results returned.
@@ -220,6 +270,21 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
* @return the groups matching the query
*/
public ScriptGroup[] searchGroupsInZone(String shortNameFilter, String zone, int maxItems, int skipCount)
+ {
+ return searchGroupsInZone(shortNameFilter, zone, new PagingDetails(maxItems, skipCount), null);
+ }
+
+ /**
+ * Search for groups in a specific zone
+ * Includes paging parameters to limit size of results returned.
+ *
+ * @param shortNameFilter partial match on shortName (* and ?) work. If empty then matches everything.
+ * @param zone zone to search in.
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ * @return the groups matching the query
+ */
+ public ScriptGroup[] searchGroupsInZone(String shortNameFilter, String zone, PagingDetails paging, String sortBy)
{
String filter = shortNameFilter;
@@ -240,8 +305,6 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
// Return an empty set if unrecognised authority.
authorities = Collections.emptySet();
}
- return makeScriptGroups(authorities, maxItems, skipCount, authorityService);
+ return makeScriptGroups(authorities, paging, sortBy, authorityService);
}
-
-
}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/security/authority/script/ScriptGroup.java b/source/java/org/alfresco/repo/security/authority/script/ScriptGroup.java
index 8ddc17d161..e7798f2a9f 100644
--- a/source/java/org/alfresco/repo/security/authority/script/ScriptGroup.java
+++ b/source/java/org/alfresco/repo/security/authority/script/ScriptGroup.java
@@ -20,14 +20,21 @@ package org.alfresco.repo.security.authority.script;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
+import org.alfresco.util.ModelUtil;
+import org.alfresco.util.PagingDetails;
/**
* The Script group is a GROUP authority exposed to the scripting API.
@@ -37,8 +44,8 @@ import org.alfresco.service.cmr.security.AuthorityType;
*/
public class ScriptGroup implements Authority, Serializable
{
- private static final long serialVersionUID = 6073732221341647273L;
- private transient AuthorityService authorityService;
+ private static final long serialVersionUID = 6073732221341647273L;
+ private transient AuthorityService authorityService;
private ScriptAuthorityType authorityType = ScriptAuthorityType.GROUP;
private String shortName;
private String fullName;
@@ -59,200 +66,263 @@ public class ScriptGroup implements Authority, Serializable
displayName = authorityService.getAuthorityDisplayName(fullName);
}
- /**
- * Delete this group
- */
- public void deleteGroup()
- {
- authorityService.deleteAuthority(fullName);
- }
+ /**
+ * Delete this group
+ */
+ public void deleteGroup()
+ {
+ authorityService.deleteAuthority(fullName);
+ }
- public void setAuthorityType(ScriptAuthorityType authorityType) {
- this.authorityType = authorityType;
- }
+ public void setAuthorityType(ScriptAuthorityType authorityType) {
+ this.authorityType = authorityType;
+ }
- public ScriptAuthorityType getAuthorityType() {
- return authorityType;
- }
+ public ScriptAuthorityType getAuthorityType() {
+ return authorityType;
+ }
- public void setShortName(String shortName) {
- this.shortName = shortName;
- }
+ public void setShortName(String shortName) {
+ this.shortName = shortName;
+ }
- public String getShortName() {
- return shortName;
- }
+ /**
+ * Get the short name
+ */
+ public String getShortName() {
+ return shortName;
+ }
- public void setFullName(String fullName) {
- this.fullName = fullName;
- }
+ public void setFullName(String fullName) {
+ this.fullName = fullName;
+ }
- public String getFullName() {
- return fullName;
- }
+ /**
+ * Get the full internal name, also known
+ * as the Authority Name
+ */
+ public String getFullName() {
+ return fullName;
+ }
- /**
- * Change the display name for this group. Need administrator permission to call this method to change a display name.
- * @param displayName
- */
- public void setDisplayName(String displayName) {
- if(this.displayName != null && !this.displayName.equals(displayName))
- {
- authorityService.setAuthorityDisplayName(fullName, displayName);
- }
- this.displayName = displayName;
- }
+ /**
+ * Change the display name for this group. Need administrator permission to call this method to change a display name.
+ * @param displayName
+ */
+ public void setDisplayName(String displayName) {
+ if (this.displayName != null && !this.displayName.equals(displayName))
+ {
+ authorityService.setAuthorityDisplayName(fullName, displayName);
+ }
+ this.displayName = displayName;
+ }
- public String getDisplayName() {
- return displayName;
- }
+ public String getDisplayName() {
+ return displayName;
+ }
- /**
- * Get all users contained in this group
- * @return
- */
- public ScriptUser[] getAllUsers()
- {
- Set children = authorityService.getContainedAuthorities(AuthorityType.USER, fullName, false);
- Set users = new LinkedHashSet();
- for(String authority : children)
- {
- ScriptUser user = new ScriptUser(authority, authorityService);
- users.add(user);
- }
- return users.toArray(new ScriptUser[users.size()]);
- }
+ /**
+ * Get all users contained in this group
+ * @return
+ */
+ public ScriptUser[] getAllUsers()
+ {
+ Set children = authorityService.getContainedAuthorities(AuthorityType.USER, fullName, false);
+ Set users = new LinkedHashSet();
+ for (String authority : children)
+ {
+ ScriptUser user = new ScriptUser(authority, authorityService);
+ users.add(user);
+ }
+ return users.toArray(new ScriptUser[users.size()]);
+ }
- /**
- * Get all sub groups (all decendants)
- * @return the descenants of this group
- */
- public ScriptGroup[] getAllGroups()
- {
- Set children = authorityService.getContainedAuthorities(AuthorityType.GROUP, fullName, false);
- Set groups = new LinkedHashSet();
- for(String authority : children)
- {
- ScriptGroup group = new ScriptGroup(authority, authorityService);
- groups.add(group);
- }
- return groups.toArray(new ScriptGroup[groups.size()]);
+ /**
+ * Get all sub groups (all decendants)
+ * @return the descenants of this group
+ */
+ public ScriptGroup[] getAllGroups()
+ {
+ Set children = authorityService.getContainedAuthorities(AuthorityType.GROUP, fullName, false);
+ Set groups = new LinkedHashSet();
+ for (String authority : children)
+ {
+ ScriptGroup group = new ScriptGroup(authority, authorityService);
+ groups.add(group);
+ }
+ return groups.toArray(new ScriptGroup[groups.size()]);
+ }
- }
+ /**
+ * Get child groups of this group
+ */
+ private ScriptUser[] childUsers;
- /**
- * Get child groups of this group
- */
- private ScriptUser[] childUsers;
+ private Set getChildAuthorityNames()
+ {
+ if (childAuthorityNames == null)
+ {
+ childAuthorityNames = authorityService.getContainedAuthorities(null, fullName, true);
+ }
+ return childAuthorityNames;
+ }
+
+ private Set getChildNamesOfType(AuthorityType type)
+ {
+ Set authorities = getChildAuthorityNames();
+ Set result = new TreeSet();
+ for (String authority : authorities)
+ {
+ if (AuthorityType.getAuthorityType(authority) == type)
+ {
+ result.add(authority);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get child users of this group
+ */
+ public ScriptUser[] getChildUsers()
+ {
+ return getChildUsers(new PagingDetails(), null);
+ }
+
+ /**
+ * Get child users of this group
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ */
+ public ScriptUser[] getChildUsers(PagingDetails paging, String sortBy)
+ {
+ if (childUsers == null)
+ {
+ Set children = getChildNamesOfType(AuthorityType.USER);
+ Set users = new LinkedHashSet();
+ for (String authority : children)
+ {
+ ScriptUser user = new ScriptUser(authority, authorityService);
+ users.add(user);
+ }
+ childUsers = users.toArray(new ScriptUser[users.size()]);
+ }
+ return makePagedAuthority(paging, sortBy, childUsers);
+ }
- private Set getChildAuthorityNames()
- {
- if (childAuthorityNames == null)
- {
- childAuthorityNames = authorityService.getContainedAuthorities(null, fullName, true);
- }
- return childAuthorityNames;
- }
+ /**
+ * Get child groups of this group
+ */
+ private ScriptGroup[] childGroups;
+ public ScriptGroup[] getChildGroups()
+ {
+ return getChildGroups(new PagingDetails(), null);
+ }
- private Set getChildNamesOfType(AuthorityType type)
- {
- Set authorities = getChildAuthorityNames();
- Set result = new TreeSet();
- for (String authority : authorities)
- {
- if (AuthorityType.getAuthorityType(authority) == type)
- {
- result.add(authority);
- }
- }
- return result;
- }
-
- public ScriptUser[] getChildUsers()
- {
- if(childUsers == null)
- {
- Set children = getChildNamesOfType(AuthorityType.USER);
- Set users = new LinkedHashSet();
- for(String authority : children)
- {
- ScriptUser user = new ScriptUser(authority, authorityService);
- users.add(user);
- }
- childUsers = users.toArray(new ScriptUser[users.size()]);
- }
- return childUsers;
- }
+ /**
+ * Get child groups of this group
+ * @param maxItems Maximum number of groups to return.
+ * @param skipCount number of groups to skip before returning the first result.
+ */
+ public ScriptGroup[] getChildGroups(int maxItems, int skipCount)
+ {
+ return getChildGroups(new PagingDetails(maxItems, skipCount), null);
+ }
- /**
- * Get child groups of this group
- */
- private ScriptGroup[] childGroups;
- public ScriptGroup[] getChildGroups()
- {
- return getChildGroups(-1, -1);
- }
+ /**
+ * Get child groups of this group
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ */
+ public ScriptGroup[] getChildGroups(PagingDetails paging, String sortBy)
+ {
+ if (childGroups == null)
+ {
+ Set children = getChildNamesOfType(AuthorityType.GROUP);
+ Set groups =makeScriptGroups(children);
+ childGroups = groups.toArray(new ScriptGroup[groups.size()]);
+ }
+ return makePagedAuthority(paging, sortBy, childGroups);
+ }
+
+ /**
+ * Get all the children of this group, regardless of type
+ */
+ public Authority[] getChildAuthorities()
+ {
+ return getChildAuthorities(new PagingDetails(), null);
+ }
+
+ /**
+ * Get all the children of this group, regardless of type
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ */
+ public Authority[] getChildAuthorities(PagingDetails paging, String sortBy)
+ {
+ Authority[] groups = getChildGroups();
+ Authority[] users = getChildUsers();
+
+ Authority[] ret = new Authority[groups.length + users.length];
+ System.arraycopy(groups, 0, ret, 0, groups.length);
+ System.arraycopy(users, 0, ret, groups.length, users.length);
+
+ return makePagedAuthority(paging, sortBy, ret);
+ }
+
+ /**
+ * Get the parents of this this group
+ */
+ private ScriptGroup[] parentCache;
- /**
- * Get child groups of this group
- */
- public ScriptGroup[] getChildGroups(int maxItems, int skipCount)
- {
- if(childGroups == null)
- {
- Set children = getChildNamesOfType(AuthorityType.GROUP);
- Set groups =makeScriptGroups(children);
- childGroups = groups.toArray(new ScriptGroup[groups.size()]);
- }
- return makePagedGroups(maxItems, skipCount, childGroups);
- }
-
- /**
- * Get the parents of this this group
- */
- private ScriptGroup[] parentCache;
-
/**
* Get the immediate parents of this group
* @return the immediate parents of this group
*/
public ScriptGroup[] getParentGroups()
{
- return getParentGroups(-1, -1);
+ return getParentGroups(new PagingDetails(), null);
}
-
- /**
- * Get the immediate parents of this group
- * @return the immediate parents of this group
- */
- public ScriptGroup[] getParentGroups(int maxItems, int skipCount)
- {
- if(parentCache == null)
- {
- Set parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, fullName, true);
- Set groups = makeScriptGroups(parents);
- parentCache = groups.toArray(new ScriptGroup[groups.size()]);
- }
- return makePagedGroups(maxItems, skipCount, parentCache);
- }
- private ScriptGroup[] makePagedGroups(int maxItems, int skipCount, ScriptGroup[] groups)
+ /**
+ * Get the immediate parents of this group
+ * @param maxItems Maximum number of groups to return.
+ * @param skipCount number of groups to skip before returning the first result.
+ * @return the immediate parents of this group
+ */
+ public ScriptGroup[] getParentGroups(int maxItems, int skipCount)
{
- boolean invalidSkipCount = skipCount <1 || skipCount>= groups.length;
- skipCount = invalidSkipCount ? 0 : skipCount;
- int maxSize = groups.length - skipCount;
- boolean invalidMaxItems = maxItems <1 || maxItems>=maxSize;
+ return getParentGroups(new PagingDetails(maxItems, skipCount), null);
+ }
- if(invalidMaxItems && invalidSkipCount)
- {
- return groups;
- }
-
- maxItems = invalidMaxItems ? maxSize : maxItems;
- ScriptGroup[] results = new ScriptGroup[maxItems];
- System.arraycopy(groups, skipCount, results, 0, maxItems);
- return results;
+ /**
+ * Get the immediate parents of this group
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ * @return the immediate parents of this group
+ */
+ public ScriptGroup[] getParentGroups(PagingDetails paging, String sortBy)
+ {
+ if (parentCache == null)
+ {
+ Set parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, fullName, true);
+ Set groups = makeScriptGroups(parents);
+ parentCache = groups.toArray(new ScriptGroup[groups.size()]);
+ }
+ return makePagedAuthority(paging, sortBy, parentCache);
+ }
+
+ private T[] makePagedAuthority(PagingDetails paging, String sortBy, T[] groups)
+ {
+ // Sort the groups
+ Arrays.sort(groups, new AuthorityComparator(sortBy));
+
+ // Now page
+ int maxItems = paging.getMaxItems();
+ int skipCount = paging.getSkipCount();
+ paging.setTotalItems(groups.length);
+ return ModelUtil.page(groups, maxItems, skipCount);
}
private Set makeScriptGroups(Set parents)
@@ -260,23 +330,23 @@ public class ScriptGroup implements Authority, Serializable
ArrayList sortedParents = new ArrayList(parents);
Collections.sort(sortedParents);
LinkedHashSet groups = new LinkedHashSet();
- for(String authority : sortedParents)
+ for (String authority : sortedParents)
{
- ScriptGroup group = new ScriptGroup(authority, authorityService);
- groups.add(group);
-
+ ScriptGroup group = new ScriptGroup(authority, authorityService);
+ groups.add(group);
+
}
return groups;
}
- /**
- * Get all the parents of this this group
- * @return all the parents of this group
- */
- public ScriptGroup[] getAllParentGroups()
- {
- return getAllParentGroups(-1, -1);
- }
+ /**
+ * Get all the parents of this this group
+ * @return all the parents of this group
+ */
+ public ScriptGroup[] getAllParentGroups()
+ {
+ return getAllParentGroups(new PagingDetails(), null);
+ }
/**
* Get all the parents of this this group
@@ -287,38 +357,36 @@ public class ScriptGroup implements Authority, Serializable
*/
public ScriptGroup[] getAllParentGroups(int maxItems, int skipCount)
{
- Set parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, fullName, false);
- return makeScriptGroups(parents, maxItems, skipCount, authorityService);
- }
+ return getAllParentGroups(new PagingDetails(maxItems, skipCount), null);
+ }
- /**
- * Get all the children of this group, regardless of type
- */
- public Authority[] getChildAuthorities()
- {
- Authority[] groups = getChildGroups();
- Authority[] users = getChildUsers();
-
- Authority[] ret = new Authority[groups.length + users.length];
- System.arraycopy(groups, 0, ret, 0, groups.length);
- System.arraycopy(users, 0, ret, groups.length, users.length);
- return ret;
- }
+ /**
+ * Get all the parents of this this group
+ *
+ * @param paging Paging object with max number to return, and items to skip
+ * @param sortBy What to sort on (authorityName, shortName or displayName)
+ * @return all the parents of this group
+ */
+ public ScriptGroup[] getAllParentGroups(PagingDetails paging, String sortBy)
+ {
+ Set parents = authorityService.getContainingAuthorities(AuthorityType.GROUP, fullName, false);
+ return makeScriptGroups(parents, paging, sortBy, authorityService);
+ }
+
+ /**
+ * Is this a root group?
+ * @return
+ */
+ public boolean isRootGroup()
+ {
+ ScriptGroup[] groups = getParentGroups();
+ return (groups.length == 0);
+ }
- /**
- * Is this a root group?
- * @return
- */
- public boolean isRootGroup()
- {
- ScriptGroup[] groups = getParentGroups();
- return (groups.length == 0);
- }
-
- /**
- * Is this an admin group?
- * @return
- */
+ /**
+ * Is this an admin group?
+ * @return
+ */
public boolean isAdminGroup()
{
if (this.isAdmin == null)
@@ -328,119 +396,152 @@ public class ScriptGroup implements Authority, Serializable
return this.isAdmin;
}
- /**
- * Get the number of users contained within this group.
- * @return the number of users contained within this group.
- */
- public int getUserCount()
- {
- return getChildNamesOfType(AuthorityType.USER).size();
- }
-
- /**
- * Get the number of child groups contained within this group.
- * @return the number of child groups contained within this group.
- */
- public int getGroupCount()
- {
+ /**
+ * Get the number of users contained within this group.
+ * @return the number of users contained within this group.
+ */
+ public int getUserCount()
+ {
+ return getChildNamesOfType(AuthorityType.USER).size();
+ }
+
+ /**
+ * Get the number of child groups contained within this group.
+ * @return the number of child groups contained within this group.
+ */
+ public int getGroupCount()
+ {
return getChildNamesOfType(AuthorityType.GROUP).size();
- }
-
- /**
- * Create a new group as a child of this group.
- * @return the new group
- */
- public ScriptGroup createGroup(String newShortName, String newDisplayName)
- {
- String authorityName = authorityService.createAuthority(AuthorityType.GROUP, newShortName, newDisplayName, authorityService.getDefaultZones());
- authorityService.addAuthority(fullName, authorityName);
- ScriptGroup childGroup = new ScriptGroup(authorityName, authorityService);
- clearCaches();
- return childGroup;
- }
+ }
+
+ /**
+ * Create a new group as a child of this group.
+ * @return the new group
+ */
+ public ScriptGroup createGroup(String newShortName, String newDisplayName)
+ {
+ String authorityName = authorityService.createAuthority(AuthorityType.GROUP, newShortName, newDisplayName, authorityService.getDefaultZones());
+ authorityService.addAuthority(fullName, authorityName);
+ ScriptGroup childGroup = new ScriptGroup(authorityName, authorityService);
+ clearCaches();
+ return childGroup;
+ }
- /**
- * remove sub group from this group
- * @param newShortName the shortName of the sub group to remove from this group.
- */
- public void removeGroup(String newShortName)
- {
- String fullAuthorityName = authorityService.getName(AuthorityType.GROUP, newShortName);
-
- authorityService.removeAuthority(fullName, fullAuthorityName);
- clearCaches();
- }
+ /**
+ * remove sub group from this group
+ * @param newShortName the shortName of the sub group to remove from this group.
+ */
+ public void removeGroup(String newShortName)
+ {
+ String fullAuthorityName = authorityService.getName(AuthorityType.GROUP, newShortName);
+
+ authorityService.removeAuthority(fullName, fullAuthorityName);
+ clearCaches();
+ }
- /**
- * Remove child user from this group
- * @param newShortName the shortName of the user to remove from this group.
- */
- public void removeUser(String newShortName)
- {
- String fullAuthorityName = authorityService.getName(AuthorityType.USER, newShortName);
-
- authorityService.removeAuthority(fullName, fullAuthorityName);
- clearCaches();
- }
+ /**
+ * Remove child user from this group
+ * @param newShortName the shortName of the user to remove from this group.
+ */
+ public void removeUser(String newShortName)
+ {
+ String fullAuthorityName = authorityService.getName(AuthorityType.USER, newShortName);
+
+ authorityService.removeAuthority(fullName, fullAuthorityName);
+ clearCaches();
+ }
+
+ /**
+ * AddAuthority as a child of this group
+ * @param fullAuthorityName the full name of the authority to add to this group.
+ */
+ public void addAuthority(String fullAuthorityName)
+ {
+ authorityService.addAuthority(fullName, fullAuthorityName);
+ clearCaches();
+ }
+
+ /**
+ * Remove child Authority from this group
+ * @param fullAuthorityName the full name of the authority to remove from this group.
+ */
+ public void removeAuthority(String fullAuthorityName)
+ {
+ authorityService.removeAuthority(fullName, fullAuthorityName);
+ clearCaches();
+ }
- /**
- * AddAuthority as a child of this group
- * @param fullAuthorityName the full name of the authority to add to this group.
- */
- public void addAuthority(String fullAuthorityName)
- {
- authorityService.addAuthority(fullName, fullAuthorityName);
- clearCaches();
- }
-
- /**
- * Remove child Authority from this group
- * @param fullAuthorityName the full name of the authority to remove from this group.
- */
- public void removeAuthority(String fullAuthorityName)
- {
- authorityService.removeAuthority(fullName, fullAuthorityName);
- clearCaches();
- }
-
- /**
- * clear the caches
- */
- private void clearCaches()
- {
- childUsers = null;
- childGroups = null;
- childAuthorityNames = null;
- }
+ /**
+ * clear the caches
+ */
+ private void clearCaches()
+ {
+ childUsers = null;
+ childGroups = null;
+ childAuthorityNames = null;
+ }
public static ScriptGroup[] makeScriptGroups(Collection authorities,
- int maxItems, int skipCount, AuthorityService authorityService)
+ PagingDetails paging, AuthorityService authorityService)
{
- ArrayList authList = new ArrayList(authorities);
- Collections.sort(authList);
- int totalItems = authList.size();
- if(maxItems<1 || maxItems>totalItems)
+ return makeScriptGroups(authorities, paging, null, authorityService);
+ }
+ public static ScriptGroup[] makeScriptGroups(Collection authorities,
+ PagingDetails paging, final String sortBy, AuthorityService authorityService)
+ {
+
+ final ArrayList authList = new ArrayList(authorities);
+ final Map scriptGroupCache = new HashMap();
+
+ // Depending on what we're sorting on, we may
+ // need to get the details now
+ if("shortName".equals(sortBy) || "displayName".equals(sortBy))
{
- maxItems = totalItems;
+ for(String authority : authorities)
+ {
+ scriptGroupCache.put(authority, new ScriptGroup(authority, authorityService));
+ }
+ final AuthorityComparator c2 = new AuthorityComparator(sortBy);
+ Collections.sort(authList, new Comparator() {
+ @Override
+ public int compare(String g1, String g2)
+ {
+ ScriptGroup sg1 = scriptGroupCache.get(g1);
+ ScriptGroup sg2 = scriptGroupCache.get(g2);
+ return c2.compare(sg1, sg2);
+ }
+ });
}
- if(skipCount<0)
+ else
{
- skipCount = 0;
+ // Default is to sort by authority name,
+ // in lower case, so it's a case insensitive sort
+ Collections.sort(authList, new Comparator() {
+ @Override
+ public int compare(String g1, String g2)
+ {
+ return g1.toLowerCase().compareTo( g2.toLowerCase() );
+ }
+ });
}
- int endPoint = skipCount + maxItems;
- if(endPoint > totalItems)
+
+ // Do the paging
+ List paged = ModelUtil.page(authList, paging);
+ ScriptGroup[] groups = new ScriptGroup[paged.size()];
+ for (int i=0; i endPoint ? 0 : endPoint - skipCount;
- ScriptGroup[] groups = new ScriptGroup[size];
- for (int i = skipCount; i < endPoint; i++)
- {
- String authority = authList.get(i);
- ScriptGroup group = new ScriptGroup(authority, authorityService);
- groups[i-skipCount] = group;
+ String authority = paged.get(i);
+ ScriptGroup group;
+ if (scriptGroupCache.containsKey(authority))
+ {
+ group = scriptGroupCache.get(authority);
+ }
+ else
+ {
+ group = new ScriptGroup(authority, authorityService);
+ }
+ groups[i] = group;
}
return groups;
}
-
}
diff --git a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
index 7896fd5004..320d637757 100644
--- a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
+++ b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java
@@ -939,7 +939,6 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
// Set share information into the model
String productName = ModelUtil.getProductName(repoAdminService);
- model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(serviceRegistry.getSysAdminParams()) + "/");
model.put(TemplateService.KEY_PRODUCT_NAME, productName);
// Set the details for the action
diff --git a/source/java/org/alfresco/repo/site/SiteAspect.java b/source/java/org/alfresco/repo/site/SiteAspect.java
index 0508100eba..6f3a25e62b 100644
--- a/source/java/org/alfresco/repo/site/SiteAspect.java
+++ b/source/java/org/alfresco/repo/site/SiteAspect.java
@@ -35,7 +35,7 @@ import org.alfresco.service.cmr.repository.NodeService;
*
* @author Nick Burch
*/
-public class SiteAspect implements NodeServicePolicies.OnMoveNodePolicy
+public class SiteAspect implements NodeServicePolicies.OnMoveNodePolicy
{
/** Services */
private PolicyComponent policyComponent;
diff --git a/source/java/org/alfresco/repo/site/SiteModel.java b/source/java/org/alfresco/repo/site/SiteModel.java
index 1364ef5385..226c2d0921 100644
--- a/source/java/org/alfresco/repo/site/SiteModel.java
+++ b/source/java/org/alfresco/repo/site/SiteModel.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2010 Alfresco Software Limited.
+ * Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -18,6 +18,10 @@
*/
package org.alfresco.repo.site;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
import org.alfresco.service.namespace.QName;
/**
@@ -48,4 +52,13 @@ public interface SiteModel
public static final String SITE_COLLABORATOR = "SiteCollaborator";
public static final String SITE_CONTRIBUTOR = "SiteContributor";
public static final String SITE_CONSUMER = "SiteConsumer";
+
+ /**
+ * Convenience collection of default site permissions
+ * @since 3.5.0
+ */
+ public static final List STANDARD_PERMISSIONS =
+ Collections.unmodifiableList(
+ Arrays.asList(
+ new String[] {SITE_MANAGER, SITE_COLLABORATOR, SITE_CONTRIBUTOR, SITE_CONSUMER} ));
}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/site/SiteServiceImpl.java b/source/java/org/alfresco/repo/site/SiteServiceImpl.java
index dff70398c5..f8f32aa080 100644
--- a/source/java/org/alfresco/repo/site/SiteServiceImpl.java
+++ b/source/java/org/alfresco/repo/site/SiteServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2010 Alfresco Software Limited.
+ * Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -35,6 +35,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.activities.ActivityType;
import org.alfresco.repo.admin.SysAdminParams;
+import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.search.impl.lucene.LuceneQueryParser;
import org.alfresco.repo.security.authentication.AuthenticationContext;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
@@ -134,6 +135,8 @@ public class SiteServiceImpl implements SiteService, SiteModel
private RetryingTransactionHelper retryingTransactionHelper;
private Comparator roleComparator;
private SysAdminParams sysAdminParams;
+ private BehaviourFilter behaviourFilter;
+ private SitesPermissionCleaner sitesPermissionsCleaner;
/**
@@ -274,7 +277,18 @@ public class SiteServiceImpl implements SiteService, SiteModel
{
this.sysAdminParams = sysAdminParams;
}
+
+ public void setBehaviourFilter(BehaviourFilter behaviourFilter)
+ {
+ this.behaviourFilter = behaviourFilter;
+ }
+ public void setSitesPermissionsCleaner(SitesPermissionCleaner sitesPermissionsCleaner)
+ {
+ this.sitesPermissionsCleaner = sitesPermissionsCleaner;
+ }
+
+
public Comparator getRoleComparator()
{
return roleComparator;
@@ -1081,10 +1095,23 @@ public class SiteServiceImpl implements SiteService, SiteModel
String cacheKey = this.tenantAdminService.getCurrentUserDomain() + '_' + shortName;
this.siteNodeRefs.remove(cacheKey);
- // Delete the site node, marking it as "not to be archived" on the way.
- // The site node will be permanently deleted immediately. See ALF-7888 for info on why
- this.nodeService.addAspect(siteNodeRef, ContentModel.ASPECT_TEMPORARY, null);
- this.nodeService.deleteNode(siteNodeRef);
+ // The default behaviour is that sites cannot be deleted. But we disable that behaviour here
+ // in order to allow site deletion only via this service. Share calls this service for deletion.
+ //
+ // See ALF-7888 for some background on this issue
+ behaviourFilter.disableBehaviour(siteNodeRef, ContentModel.ASPECT_UNDELETABLE);
+ try
+ {
+ // Delete the site node, marking it as "not to be archived" on the way.
+ // The site node will be permanently deleted.
+
+ this.nodeService.addAspect(siteNodeRef, ContentModel.ASPECT_TEMPORARY, null);
+ this.nodeService.deleteNode(siteNodeRef);
+ }
+ finally
+ {
+ behaviourFilter.enableBehaviour(siteNodeRef, ContentModel.ASPECT_UNDELETABLE);
+ }
// Delete the associated groups
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork