From a7b885a1c657710739f0b9115bd1330c1ce406f0 Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Mon, 25 Jul 2011 19:32:17 +0000 Subject: [PATCH] Merged V3.4-BUG-FIX to HEAD 29057: ALF-9491: Bitrock 7.2.2 29063: ALF-8766 Concatenated strings in EN webclient file 29066: Merge DEV/DEV/BELARUS/V3.4-BUG-FIX-2011_07_13 to DEV/V3.4-BUG-FIX 29010: ALF-7396: Japanese- Untranslated 29072: HomeFolderProvider work - Changes as a result of Dave Ward's comments (HomeFolderManager not fully done as there is a spring issue with using NodeService, FileFolderService, fileFolderService, SearchService or searchService) 29074: ALF-7637 - Share displays incorrect folder contents after copy-on-outbound rule against working copy 29075: ALF-8406 - Configuring the datalist display for sub-types does not work 29082: ALF-6847 translation: "Collega" should be reverted to English: "Link" as per term list. 29087: ALF-5717 property names for wcm quickstart website-model had an invalid format or did not end in .description or .title 29093: Merge V3.3 to DEV/V3.4-BUG-FIX (28596) 28596: Remove dependency between subsystems and all the object factories in the parent context! - Do not allow eager initialization when looking up parent post processors - Removes circular dependencies from sysAdmin subsystem 29094: Merge HEAD to DEV/V3.4-BUG-FIX () 28892: Broke circular references between NodeService beans, NodeIndexer, Lucene and back to NodeService. - NodeIndexer is now bootstrapped to pull out reference to the Lucene beans 29100: Revert Merge V3.3 to DEV/V3.4-BUG-FIX (28596) Caused RepositoryStartupTest to fail 28596: Remove dependency between subsystems and all the object factories in the parent context! - Do not allow eager initialization when looking up parent post processors - Removes circular dependencies from sysAdmin subsystem 29102: ALF-9048: Make apply_amps.bat work from its installed location 29103: ALF-8746: Restored Japanese choice format translations 29104: Merged V3.3 to V3.4-BUG-FIX (Reinstated this revision as it is required) 28596: Remove dependency between subsystems and all the object factories in the parent context! - Do not allow eager initialization when looking up parent post processors - Removes circular dependencies from sysAdmin subsystem 29105: Use org.springframework.aop.target.LazyInitTargetSource in the NodeService public proxy to break a circular dependency 29106: Make PersonService interact with HomeFolderManager via a lazy proxy to prevent another circular dependency - Simple HomeFolderManager interface created - Implementation class renamed to PortableHomeFolderManager - Removed TODOs from authentication-services-context.xml 29107: Forgot to remove the serviceRegistry dependency from homeFolderManager 29108: ALF-9529: Installer memory consumption and startup time improvements - Bitrock discover the for loop! 29109: ALF-9530: Postgres installed as Windows service should run as a postgres user, not System - Fix from Bitrock 29118: Fix for ALF-6737 - It's impossible to view any version of the wiki page if it was renamed with native characters 29119: Fix for ALF-5787 - strings extracted for L10N in Web form creation help text 29124: ALF-9530: Follow up fix from Bitrock 29126: Fix for ALF-8344 - Incorrect message is displayed while recover deleted file 29127: Fix for ALF-9445 - French - Share, translation on Transfer Target configuration 29129: ALF-9476: Make FTPS work on IBM JDK 29133: Fix failing DictionaryRestApiTest 29136: Fix build issues from 29104: - run as system when creating home folders (PortableHomeFolderManager) - re-factored onCreateNode out of PortableHomeFolderManager into PersonServiceImpl - re-factored property PortableHomeFolderManager.enableHomeFolderCreationAsPeopleAreCreated to PersonServiceImpl.homeFolderCreationEager 29137: Fix for ALF-8831 - Internal error occurs in My Tasks Webscripts component 29138: Fix for ALF-8765 - Layout is displaced if translated string occupies more than 1 line 29140: Fix for ALF-8668 - Deleting author account causes Failed to load the forum posts 29142: - PortableHomeFolderManager: Moved code to run as System into PersonServiceImpl so that one must have a valid authority to call the publick makeHomeFolder method. The authority should already be valid if called via PersonServiceImpl. - Removed unused policyBehaviourFilter property from PersonServiceImpl 29146: ALF-8701: partially translated string in html-upload.get_fr 29147: ALF-8727: DE - changes to Root Category 29149: ALF-8731: DE - Wiki changes (space before full stop) 29152: ALF-9503: Add space after colon in strings in file wdr-messages.properties 29153: Fixed ALF-7899: association.ftl does not render when showTargetLink=true in workflow 29165: ALF-8749: on submit action properties in wcn-workflow-messages.properties 29166: Fix for ALF-6220 - Language pack - .ftl localization 29167: ALF-9550 - Typos in new section of webclient.properties 29169: Fix for ALF-7844 - W3C: Impossible to activate 'Choose from popular tags in this site' link by Enter/Space keys 29170: Merge V3.4-TEAM to V3.4-BUG-FIX (3.4.4) 27471: Fix for ALF-8150 - check for visibility before applying focus to element for IE. 29171: Fixes: ALF-8922, removes date formatting from API (now returns ISO8601) and instead formats it on the client, using L10N strings. 29172: Fix for ALF-2023 - Repository Action - Copy item to specific space doesn not include content. The option to 'deep copy' is now exposed in the UI for Run Action and Rules in Explorer. 29173: Fix for ALF-1446 - Sorting of inline descendants is not observed 29175: ALF-241 - The item is not coppied via 'Paste All' in Shelf when 'Details' page is opened 29177: Fix for ALF-9520 - confusing sample config. Reordered sample config file as suggested. 29178: Fixed ALF-6400: GERMAN: Explorer mouse over hints for TinyMCE are not localized Fixed ALF-5766: ALL translations errors in Explorer - Calendars are not localizable for content based on webforms 29202: Merge DEV/BELARUS/V3.4-BUG-FIX-2011_04_12 to V3.4-BUG-FIX (3.4.4) 27836: ALF-8524: CLONE - Sharepoint doesn't work with HTTPS Changes in url links required for HTTPS support. 29203: Restored removal of postgresCreateSymLinksLinuxBuildingFromWindows tag (32 bit Linux) from revision 26582 29211: Fix for ALF-1051 - It is impossible to find link by tag from link details page 29212: Fix for ALF-5301 - TinyMCE is replacing carriage return with white spaces 29250: Latest L10N update for all languages (DE, ES, FR, IT, JA) from Gloria (based on r29172) 29253: L10N Update from Gloria 29270: Fixed ALF-516: Unable to add content/delete tables in webform content when using FireFox 29271: Update from Gloria 29272: Merged BRANCHES/DEV/BELARUS/V3.4-BUG-FIX-2011_07_13 to BRANCHES/DEV/V3.4-BUG-FIX: (with minor modification) 29223: ALF-7619: When document A has an association with a document B editing A's properties fails if user has no permission to edit B 29274: ALF-9517 Incorrect behaviour of versions on Copy action. Version is 0.1 rather than 1.0 29283: Resolve ALF-8273: Valid datetime value cannot be parsed by CMIS AtomPub interface 29284: Update from Gloria 29286: ALF-9596: Merged PATCHES/V3.4.1 to V3.4-BUG-FIX 28150: ALF-8607: Detailed debug logging when out of sync transaction detected by index checker / tracker 28177: ALF-8607: Corrections to debug logging in AbstractReindexComponent 28213: ALF-8607: Further corrections to debug logging in AbstractReindexComponent - Log attributes from indexes, rather than nodeService properties 28341: ALF-8607: Stop index checker from 'lying' - isTxnPresentInIndex() call must be made in a new transaction in order to get a database view in sync with the current indexes 28352: ALF-8607: Revisit transaction delineation. Nested transaction only required in checkTxnsImpl() 28403: ALF-8607: Merged PATCHES/V3.3.4 to PATCHES/V3.4.1 27823: ALF-7237: Index tracker needs to perform a cascade reindex on updated nodes in order to cope with node moves 28406: ALF-8607: Improvement to FTS fix. Prevent FTS from restoring documents that have been deleted! 28412: ALF-8607: Invalidate properties and aspects as well as parent assocs when stale cache entry dected during transaction tracking 28427: ALF-8607: Prevent NPE with bad NodeRef in ADMLuceneIndexerImpl.createDocumentsImpl() 28705: ALF-8607: Validate transaction IDs when fetching parent associations - Compare the cached child node transaction ID against one fetched from the DB - Stops us from pairing up the cached node for an older or newer transaction with the wrong parent associations 28707: ALF-8607: Merged PATCHES/V3.3.4 to PATCHES/V3.4.1 28588: ALF-7237: Prevent FTS from ever wiping out a document that still exists and ignore duplicates 28708: ALF-8607: Make FTS capable of recovering from cache concurrency issues by using a RetryingTransactionHelper and better exception handling. - Also avoids skipping the entire batch when the reindexing of a particular document fails. 28710: ALF-8607: Corrected transaction delineation 28753: ALF-8607: Prevent errors caused by AbstractReindexComponent diagnostics trying to parse FTSREF document IDs as NodeRefs (which they aren't!) 28755: ALF-8607: When 'failing over' during FTS indexing, don't bother adding a FTS status document so we don't get stuck in a loop with a problematic document 28815: ALF-8607: Do two way validation of cached / fetched nodes and their parent associations to avoid skew - Should resolve problem of tracking moves to the archive store and moves in general 28862: ALF-8607: Lucene indexers now support 'read through' behaviour for FTS and Index tracking batches - Small discrete read only transactions used to read each reindexed node from the database / cache - Avoids cache 'drift' and 'skew' after long running indexing transactions 28863: ALF-8607: Missing file 28869: ALF-8607: isTxnPresentInIndex() needs to 'read through' so index tracker and checker don't pollute the cache 28872: ALF-8607: Optimization to prevent constant writing to AVM indexes whilst 'ticking over'. 28950: ALF-8607: Improved logic in AbstractReindexComponent.isTxnPresentInIndex() so that we can reliably cope with multi-store transactions (e.g. archive store + spaces store) - Due to FTS, the txn ID may have 'drifted in' to one store but not the other so we must validate all stores in the txn 29098: ALF-8607: Use getNodeRefStatus as a cache validation point for reindexing 'read through' transactions - Guarantees that FTS reindexed node will see correct state (well if we had consistent read behaviour it would!) - Removes stale nodeRef -> ID mappings (e.g. when original node moved to archive store and substituted with deleted node) - Inexplicably seems to produce a ~30x speedup in performance tests on MySQL! Appears to remove a contention point. More investigation required to find out what! 29287: ALF-9598: Merged PATCHES/V3.4.1 to V3.4-BUG-FIX 28653: ALF-9189: More efficient usage of IndexReaders to avoid huge memory churn with large indexes - A single reading thread could block out all other reading threads because a write lock is obtained whilst constructing a set of FilterIndexReaderByStringId readers and all deletions across all indexes have to be evaluated. We now cache a FilterIndexReaderByStringId for each 'layer' of the index so that we get some reuse. We also defer evaluation of deletions to AFTER the write lock is returned and in some cases never have to evaluate the deletions at all. - When merging deletions we now make use of a cached index reader for locating the documents, and only resort to a new reader if deletions have to be performed. Hopefully this will mean that the reader for the largest indexes, containing the least recently used stuff, will get left alone most of the time. 28690: ALF-9189: Corrections to previous fix - Forgot to remove non-lazy reader initialization - Fixed NPE - Reinstated correct looping behaviour - each processed delta must be considered as one of the indexes to search for the next processed delta 29099: ALF-9189: Avoid having to allocate a byte array full of number ones for all occurrences of a term to 'fake' norms. - Severe Lucene memory hog during FTS 29262: ALF-9189: Fixed memory leak during index tracking / reindexing and further memory leak regression - Fixed up Lucene refcounting again - remember to propagate through decrefs on ReferenceCounting readers - Refined ALF-9189 fix to guarantee mainreader clean up - Remember to flush the delta during reindexing / tracking - Some extra trace diagnostics to help 29288: ALF-9600: Merged PATCHES/V3.4.1 to V3.4-BUG_FIX 28876: ALF-9041: Merged HEAD to PATCHES/V3.4.1 28850: Latest SpringSurf libs - Fix to SSO connector passing empty username 29289: ALF-8241: assemble-tomcat populates endorsed directory with xalan.jar and serializer.jar and Bitrock installer installs these too 29291: Merged DEV/SWIFT to V3.4-BUG-FIX (3.4.4) - already merged to HEAD as part of a larger merge 26104: RM: Remove incomplete and unnecessary unit test 29302: Fix for ALF-8885 - Unable to paste item due to system error:null git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29325 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../authentication-services-context.xml | 1136 +++++++++-------- config/alfresco/bootstrap-context.xml | 10 +- config/alfresco/core-services-context.xml | 7 +- .../node-common-SqlMap.xml | 11 +- .../messages/action-config_de.properties | 2 +- .../messages/action-config_fr.properties | 2 +- .../messages/action-config_ja.properties | 2 +- .../messages/bootstrap-spaces_it.properties | 5 - .../messages/content-model_de.properties | 4 +- .../messages/content-service_de.properties | 2 +- .../messages/content-service_es.properties | 2 +- .../messages/content-service_fr.properties | 2 +- .../messages/content-service_it.properties | 2 +- .../messages/content-service_ja.properties | 2 +- .../messages/email-service_de.properties | 7 +- .../messages/email-service_es.properties | 9 +- .../messages/email-service_fr.properties | 14 +- .../messages/email-service_it.properties | 4 +- .../messages/email-service_ja.properties | 40 +- .../messages/invitation-service_de.properties | 2 +- .../messages/invitation-service_es.properties | 2 +- .../messages/invitation-service_fr.properties | 2 +- .../messages/invitation-service_it.properties | 2 +- .../messages/patch-service_de.properties | 393 ++++++ .../messages/patch-service_es.properties | 393 ++++++ .../messages/patch-service_fr.properties | 393 ++++++ .../messages/patch-service_it.properties | 393 ++++++ .../messages/patch-service_ja.properties | 393 ++++++ .../messages/templates-messages.properties | 12 +- .../messages/templates-messages_de.properties | 6 +- .../messages/templates-messages_es.properties | 6 + .../messages/templates-messages_fr.properties | 6 + .../messages/templates-messages_it.properties | 6 + .../messages/templates-messages_ja.properties | 6 + .../messages/transfer-model_fr.properties | 114 +- .../alfresco/messages/wcmapp-model.properties | 209 +++ .../messages/wcmapp-model_de.properties | 209 +++ .../messages/wcmapp-model_es.properties | 209 +++ .../messages/wcmapp-model_fr.properties | 209 +++ .../messages/wcmapp-model_it.properties | 209 +++ .../messages/wcmapp-model_ja.properties | 209 +++ .../alfresco/messages/wdr-messages.properties | 4 +- .../messages/wdr-messages_de.properties | 4 +- .../messages/wdr-messages_es.properties | 4 +- .../messages/wdr-messages_fr.properties | 4 +- .../messages/wdr-messages_it.properties | 4 +- .../messages/wdr-messages_ja.properties | 4 +- config/alfresco/public-services-context.xml | 11 +- config/alfresco/repository.properties | 5 + .../Search/lucene/index-recovery-context.xml | 2 +- .../Search/lucene/lucene-search-context.xml | 30 +- .../Search/lucene/scheduled-jobs-context.xml | 2 +- .../workflow/wcm-workflow-messages.properties | 2 + .../wcm-workflow-messages_de.properties | 2 + .../wcm-workflow-messages_es.properties | 2 + .../wcm-workflow-messages_fr.properties | 2 + .../wcm-workflow-messages_it.properties | 2 + .../wcm-workflow-messages_ja.properties | 2 + .../action/executer/CopyActionExecuter.java | 61 +- .../repo/domain/node/AbstractNodeDAOImpl.java | 157 ++- .../repo/domain/node/ParentAssocsInfo.java | 28 +- .../org/alfresco/repo/jscript/ScriptNode.java | 9 +- .../node/index/AbstractReindexComponent.java | 327 +++-- .../index/FullIndexRecoveryComponent.java | 7 +- .../node/index/IndexTransactionTracker.java | 4 +- .../org/alfresco/repo/search/Indexer.java | 11 +- .../repo/search/IndexerComponent.java | 40 +- .../repo/search/impl/NoActionIndexer.java | 4 + .../ADMLuceneIndexerAndSearcherFactory.java | 11 +- .../impl/lucene/ADMLuceneIndexerImpl.java | 146 +-- .../search/impl/lucene/ADMLuceneTest.java | 12 + ...uceneUnIndexedIndexAndSearcherFactory.java | 1 + .../AVMLuceneIndexerAndSearcherFactory.java | 9 + .../impl/lucene/AVMLuceneIndexerImpl.java | 9 +- .../lucene/AbstractLuceneIndexerImpl.java | 71 +- .../lucene/FilterIndexReaderByStringId.java | 107 +- .../search/impl/lucene/LuceneResultSet.java | 12 +- .../lucene/fts/FullTextSearchIndexerImpl.java | 59 +- .../search/impl/lucene/index/IndexInfo.java | 300 +++-- .../impl/lucene/index/ReferenceCounting.java | 5 + ...nceCountingReadOnlyIndexReaderFactory.java | 30 + .../repo/security/SecurityTestSuite.java | 1 - .../person/AbstractHomeFolderProvider.java | 6 +- .../person/AbstractHomeFolderProvider2.java | 8 +- .../security/person/HomeFolderManager.java | 475 +------ .../security/person/HomeFolderProvider2.java | 6 +- .../HomeFolderProviderSynchronizer.java | 43 +- .../HomeFolderProviderSynchronizerTest.java | 34 +- .../security/person/PersonServiceImpl.java | 43 +- .../person/PortableHomeFolderManager.java | 442 +++++++ .../org/apache/lucene/search/TermQuery.java | 180 +++ .../org/apache/lucene/search/TermScorer.java | 190 +++ 92 files changed, 5905 insertions(+), 1675 deletions(-) create mode 100755 config/alfresco/messages/patch-service_de.properties create mode 100755 config/alfresco/messages/patch-service_es.properties create mode 100755 config/alfresco/messages/patch-service_fr.properties create mode 100755 config/alfresco/messages/patch-service_it.properties create mode 100755 config/alfresco/messages/patch-service_ja.properties create mode 100644 config/alfresco/messages/wcmapp-model.properties create mode 100755 config/alfresco/messages/wcmapp-model_de.properties create mode 100755 config/alfresco/messages/wcmapp-model_es.properties create mode 100755 config/alfresco/messages/wcmapp-model_fr.properties create mode 100755 config/alfresco/messages/wcmapp-model_it.properties create mode 100755 config/alfresco/messages/wcmapp-model_ja.properties create mode 100644 source/java/org/alfresco/repo/security/person/PortableHomeFolderManager.java create mode 100644 source/java/org/apache/lucene/search/TermQuery.java create mode 100644 source/java/org/apache/lucene/search/TermScorer.java diff --git a/config/alfresco/authentication-services-context.xml b/config/alfresco/authentication-services-context.xml index 6184cae3e4..3cc770f437 100644 --- a/config/alfresco/authentication-services-context.xml +++ b/config/alfresco/authentication-services-context.xml @@ -1,273 +1,278 @@ - - - + + + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - + + + - + - - + + - - - - ${authentication.chain} - - + + + + ${authentication.chain} + + - - - - - - - - org.alfresco.repo.security.authentication.MutableAuthenticationDao - - - - - - - - - - - - + + + + + + + + org.alfresco.repo.security.authentication.MutableAuthenticationDao + + + + + + + + + + + + - - - - - - - - org.alfresco.jlan.server.SessionListener - - - - - - - + + + + + + + + org.alfresco.jlan.server.SessionListener + + + + + + + - - - - - - cifsAuthenticator - - - - org.alfresco.jlan.server.auth.ICifsAuthenticator - org.alfresco.repo.management.subsystems.ActivateableBean - - - + + + + + + cifsAuthenticator + + + + org.alfresco.jlan.server.auth.ICifsAuthenticator + org.alfresco.repo.management.subsystems.ActivateableBean + + + - - - - - - ftpAuthenticator - - - - org.alfresco.jlan.ftp.FTPAuthenticator - org.alfresco.repo.management.subsystems.ActivateableBean - - - - - - - - - - - + + + + + + ftpAuthenticator + + + + org.alfresco.jlan.ftp.FTPAuthenticator + org.alfresco.repo.management.subsystems.ActivateableBean + + + + + + + - + + + + + - - - + + + - - - - - - - - - localAuthenticationService - - + + + + + + + + + localAuthenticationService + + - + - - - org.alfresco.repo.security.authentication.AuthenticationComponent - - - - - - - - - - ${server.transaction.mode.default} - - - + + + org.alfresco.repo.security.authentication.AuthenticationComponent + + + + + + + + + + ${server.transaction.mode.default} + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - authenticationComponent - - + + + + + + + + + + + + + + + + authenticationComponent + + - - - - - - - - org.alfresco.repo.security.sync.UserRegistrySynchronizer - - - + + + + + + + + org.alfresco.repo.security.sync.UserRegistrySynchronizer + + + - - - - - + + + + + - - - + + + - + - - - - - ${user.name.caseSensitive} - - - ${domain.name.caseSensitive} - - - ${domain.separator} - - - - + + + + + ${user.name.caseSensitive} + + + ${domain.name.caseSensitive} + + + ${domain.separator} + + + + @@ -280,54 +285,55 @@ - - + - - - - - - - - - - ${spaces.store} - - - - - - - - - - - ${server.transaction.allow-writes} - - - - - - - true - - - - SPLIT - - - true - - - false - - + + + ${home.folder.creation.eager} + + + + + + + + + ${spaces.store} + + + + + + + + + + + ${server.transaction.allow-writes} + + + + + + + true + + + + SPLIT + + + true + + + false + + @@ -346,288 +352,310 @@ - - - - - - - - - All - - - - - All - - - - - - - - - - - - - - - - ${home.folder.creation.eager} - - - - - - - - - + + + + + + + + + All + + + + + All + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + org.alfresco.repo.security.person.HomeFolderManager + + + + + + + + + + + - - + + + + + + + + + + + + + - - - - - - - - + + + + + - - - ${spaces.user_homes.regex.key} - - - ${spaces.user_homes.regex.pattern} - - - ${spaces.user_homes.regex.group_order} - - + + + + + + + + + + + + + + + ${spaces.user_homes.regex.key} + + + ${spaces.user_homes.regex.pattern} + + + ${spaces.user_homes.regex.group_order} + + - - - /${spaces.company_home.childname} - - - ${spaces.store} - - + + + /${spaces.company_home.childname} + + + ${spaces.store} + + - - - - - - - - - - Consumer - - - - - - - - /${spaces.company_home.childname}/${spaces.guest_home.childname} - - - ${spaces.store} - - - - - - - - + + + + + + + + + + Consumer + + + - - - - - - - - - - false - - - - All - - - - - All - - - - - - - - - - - - - - All - - - - - - - /${spaces.company_home.childname} - - - ${spaces.store} - - + + + /${spaces.company_home.childname}/${spaces.guest_home.childname} + + + ${spaces.store} + + + + + + + + + + + + + + + + + + + + false + + + + All + + + + + All + + + + + + + + + + + + + + All + + + + + + + /${spaces.company_home.childname} + + + ${spaces.store} + + + + + + /${spaces.company_home.childname}/${spaces.user_homes.childname} + + + ${spaces.store} + + + + + + /${spaces.company_home.childname}/${spaces.user_homes.childname} + + + ${spaces.store} + + + + + + + + + org.alfresco.repo.security.authentication.TicketComponent + + + + + + + + + + ${authentication.ticket.validDuration} + + + + ${authentication.ticket.ticketsExpire} + + + + false + + + + + + ${authentication.ticket.expiryMode} + + + + + + + + + + + + + + + %firstName%_%lastName% + + + + 10 + + + + + + + + + + + + + + + + + 8 + + + + + + + ${alfresco_user_store.adminusername} + + + ${alfresco_user_store.guestusername} + + - - - /${spaces.company_home.childname}/${spaces.user_homes.childname} - - - ${spaces.store} - - - - - - /${spaces.company_home.childname}/${spaces.user_homes.childname} - - - ${spaces.store} - - - - - - - - - org.alfresco.repo.security.authentication.TicketComponent - - - - - - - - - - ${authentication.ticket.validDuration} - - - - ${authentication.ticket.ticketsExpire} - - - - false - - - - - - ${authentication.ticket.expiryMode} - - - - - - - - - - - - - - - %firstName%_%lastName% - - - - 10 - - - - - - - - - - - - - - - - - 8 - - - - - - ${alfresco_user_store.adminusername} - ${alfresco_user_store.guestusername} - - diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index 30224b04f3..cfcc721df1 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -695,7 +695,6 @@ - @@ -703,6 +702,15 @@ + + ${home_folder_provider_synchronizer.enabled} + + + ${home_folder_provider_synchronizer.override_provider} + + + ${home_folder_provider_synchronizer.keep_empty_parents} + diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index 439a6745c4..79899178cf 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -758,8 +758,9 @@ alfresco/messages/forum-model alfresco/messages/email-server-model alfresco/messages/data-list-model - alfresco/messages/transfer-model - alfresco/messages/publishing-model + alfresco/messages/transfer-model + alfresco/messages/wcmapp-model + alfresco/messages/publishing-model @@ -1235,7 +1236,7 @@ - search.LuceneFullTextSearchIndexer + search.luceneFullTextSearchIndexer diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml index 1a24475249..6da6cd4f01 100644 --- a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml +++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml @@ -132,6 +132,9 @@ + + + @@ -847,6 +850,10 @@ assoc.is_primary as is_primary, assoc.assoc_index as assoc_index + + + ,childNode.transaction_id as childNodeTxnId + from alf_child_assoc assoc @@ -1070,8 +1077,8 @@ ) - + where childNode.id = #{childNode.id} diff --git a/config/alfresco/messages/action-config_de.properties b/config/alfresco/messages/action-config_de.properties index 013e4f32c2..23e4a3754a 100755 --- a/config/alfresco/messages/action-config_de.properties +++ b/config/alfresco/messages/action-config_de.properties @@ -122,7 +122,7 @@ mail.text.display-label=Body mail.from.display-label=Von mail.template.display-label=E-Mail-Mustervorlage mail.template_model.display-label=Zus\u00e4tzliche Parameter f\u00fcr die E-Mail-Mustervorlage -mail.ignore_send_failure.display-label=Ignoriere Fehler +mail.ignore_send_failure.display-label=Sendefehler ignorieren check-in.title=Einchecken check-in.description=Damit wird der passende Inhalt eingecheckt. diff --git a/config/alfresco/messages/action-config_fr.properties b/config/alfresco/messages/action-config_fr.properties index d5385a330e..0dd38727c7 100755 --- a/config/alfresco/messages/action-config_fr.properties +++ b/config/alfresco/messages/action-config_fr.properties @@ -122,7 +122,7 @@ mail.text.display-label=Corps mail.from.display-label=De mail.template.display-label=Mod\u00e8le d'e-mail mail.template_model.display-label=Param\u00e8tres suppl\u00e9mentaires pour le mod\u00e8le d'e-mail -mail.ignore_send_failure.display-label=Ignorer les \u00c8chec lors de l\u00edenvoi +mail.ignore_send_failure.display-label=Ignorer les erreurs d'envoi check-in.title=Lib\u00e9rer check-in.description=Cette action enregistre l'\u00e9l\u00e9ment. diff --git a/config/alfresco/messages/action-config_ja.properties b/config/alfresco/messages/action-config_ja.properties index 78cfa3d49e..c546c90f11 100755 --- a/config/alfresco/messages/action-config_ja.properties +++ b/config/alfresco/messages/action-config_ja.properties @@ -122,7 +122,7 @@ mail.text.display-label=\u672c\u6587 mail.from.display-label=\u958b\u59cb\u65e5 mail.template.display-label=E\u30e1\u30fc\u30eb\u30fb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 mail.template_model.display-label=E\u30e1\u30fc\u30eb\u30fb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u8ffd\u52a0\u306e\u30d1\u30e9\u30e1\u30fc\u30bf -mail.ignore_send_failure.display-label=\u9001\u4fe1\u5931\u6557\u3092\u7121\u8996\u3059\u308b +mail.ignore_send_failure.display-label=\u9001\u4fe1\u5931\u6557\u3092\u7121\u8996\u3057\u307e\u3059 check-in.title=\u30c1\u30a7\u30c3\u30af\u30a4\u30f3 check-in.description=\u3053\u308c\u306b\u3088\u308a\u3001\u30de\u30c3\u30c1\u3057\u305f\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u30c1\u30a7\u30c3\u30af\u30a4\u30f3\u3055\u308c\u307e\u3059\u3002 diff --git a/config/alfresco/messages/bootstrap-spaces_it.properties b/config/alfresco/messages/bootstrap-spaces_it.properties index 6f2d790f79..83fa09ef8e 100755 --- a/config/alfresco/messages/bootstrap-spaces_it.properties +++ b/config/alfresco/messages/bootstrap-spaces_it.properties @@ -120,11 +120,6 @@ spaces.workflow.definitions.name=Definizioni di workflow spaces.workflow.definitions.title=Definizioni del processo di workflow personalizzate spaces.workflow.definitions.description=Definizioni del processo di workflow personalizzate -spaces.templates.email.activities.name=attivit\u00e0 -spaces.templates.email.activities.description=Modelli di e-mail attivit\u00e0 - -spaces.templates.email.generate_the_activities_email.description=Modello di e-mail utilizzato per generare l'e-mail delle attivit\u00e0 per Alfresco Share - spaces.transfers.name=Trasferimenti spaces.transfers.title=Trasferimenti spaces.transfers.description=Cartella utilizzata dal sottosistema di trasferimento diff --git a/config/alfresco/messages/content-model_de.properties b/config/alfresco/messages/content-model_de.properties index ecc7d85b03..f9cd9152ee 100755 --- a/config/alfresco/messages/content-model_de.properties +++ b/config/alfresco/messages/content-model_de.properties @@ -101,14 +101,14 @@ cm_contentmodel.association.cm_avatar.title=Avatar cm_contentmodel.association.cm_avatar.description=Das Avatar-Bild der Person cm_contentmodel.type.cm_category_root.title=Kategorie Root -cm_contentmodel.type.cm_category_root.description=Root-Kategorie +cm_contentmodel.type.cm_category_root.description=Kategorie Wurzelknoten cm_contentmodel.association.cm_categories.title=Kategorien cm_contentmodel.association.cm_categories.description=Kategorien innerhalb der Kategorie Root cm_contentmodel.type.cm_category.title=Kategorie cm_contentmodel.type.cm_category.description=Kategorie cm_contentmodel.association.cm_subcategories.title=Kategorien -cm_contentmodel.association.cm_subcategories.description=Subkategorien innerhalb der Kategorie +cm_contentmodel.association.cm_subcategories.description=Unterkategorien innerhalb der Kategorie cm_contentmodel.aspect.cm_titled.title=Betitelt cm_contentmodel.aspect.cm_titled.description=Betitelt diff --git a/config/alfresco/messages/content-service_de.properties b/config/alfresco/messages/content-service_de.properties index 4b4b86b907..a32712f8ee 100755 --- a/config/alfresco/messages/content-service_de.properties +++ b/config/alfresco/messages/content-service_de.properties @@ -23,4 +23,4 @@ metadata.extraction.err.type_conversion=Metadata extraction failed because an ex transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. -content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/content-service_es.properties b/config/alfresco/messages/content-service_es.properties index 4b4b86b907..a32712f8ee 100755 --- a/config/alfresco/messages/content-service_es.properties +++ b/config/alfresco/messages/content-service_es.properties @@ -23,4 +23,4 @@ metadata.extraction.err.type_conversion=Metadata extraction failed because an ex transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. -content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/content-service_fr.properties b/config/alfresco/messages/content-service_fr.properties index 4b4b86b907..a32712f8ee 100755 --- a/config/alfresco/messages/content-service_fr.properties +++ b/config/alfresco/messages/content-service_fr.properties @@ -23,4 +23,4 @@ metadata.extraction.err.type_conversion=Metadata extraction failed because an ex transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. -content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/content-service_it.properties b/config/alfresco/messages/content-service_it.properties index 4b4b86b907..a32712f8ee 100755 --- a/config/alfresco/messages/content-service_it.properties +++ b/config/alfresco/messages/content-service_it.properties @@ -23,4 +23,4 @@ metadata.extraction.err.type_conversion=Metadata extraction failed because an ex transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. -content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/content-service_ja.properties b/config/alfresco/messages/content-service_ja.properties index 4b4b86b907..a32712f8ee 100755 --- a/config/alfresco/messages/content-service_ja.properties +++ b/config/alfresco/messages/content-service_ja.properties @@ -23,4 +23,4 @@ metadata.extraction.err.type_conversion=Metadata extraction failed because an ex transform.err.format_or_password=Failed to convert content, possibly due to an incorrectly formatted or password protected file. -content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). +content.routing.err.invalid_default_store=The ''defaultStoreName'', ''{0}'' does not refer to a store in ''storesByName'' ({1}). \ No newline at end of file diff --git a/config/alfresco/messages/email-service_de.properties b/config/alfresco/messages/email-service_de.properties index e86246b45e..55bdc1a7c0 100755 --- a/config/alfresco/messages/email-service_de.properties +++ b/config/alfresco/messages/email-service_de.properties @@ -5,7 +5,7 @@ email.server.err.sender_blocked=''{0}'' wurde der Zugriff verweigert. email.server.err.inbound_mail_disabled=Der Alfresco Server ist nicht f\u00fcr die Annahme eingehender E-Mails konfiguriert. email.server.err.access_denied=''{0}'' wurde der Zugriff auf ''{1}'' verweigert. email.server.err.invalid_subject=Die Betreffzeile muss ein g\u00fcltiger Dateiname sein. -email.server.err.unknown_source_address=Die E-Mail Adresse ''von'' wurde nicht erkannt: {0}. +email.server.err.unknown_source_address=Die E-Mail-Adresse ''von'' wurde nicht erkannt: {0}. email.server.err.user_not_email_contributor=Der Benutzer ''{0}'' ist nicht in der E-Mail Gruppe Beitragender. email.server.err.no_email_contributor_group=Die E-Mail Gruppe Beitragender existiert nicht. email.server.err.invalid_node_address=Die E-Mail Adresse ''{0}'' referenziert keinen g\u00fcltigen, zug\u00e4nglichen Node. @@ -13,13 +13,12 @@ email.server.err.handler_not_found=Der E-Mail Nachrichten-Handler wurde f\u00fcr email.server.err.mail_read_error=Es ist ein Fehler beim Lesen der Mail-Nachricht aufgetreten: {0} email.server.err.failed_to_create_mime_message=MIME-Nachricht konnte vom Input Datenstrom nicht erstellt werden: {0} email.server.err.extracting_from_address=Die Adresse ''von'' konnte nicht extrahiert werden: {0} -email.server.err.no_from_address=Diese Nachricht beinhaltet keine 'von' Adresse. +email.server.err.no_from_address=Diese Nachricht beinhaltet keine "von" Adresse. email.server.err.extracting_to_address=Die Adresse ''an'' konnte nicht extrahiert werden: {0} -email.server.err.no_to_address=Diese Nachricht beinhaltet keine 'an' Adresse. +email.server.err.no_to_address=Diese Nachricht beinhaltet keine "an" Adresse. email.server.err.extracting_subject=Der Betreff der Nachricht konnte nicht extrahiert werden: {0} email.server.err.extracting_sent_date=Das Datum ''gesendet am'' konnte nicht extrahiert werden: {0} email.server.err.parse_message=Die E-Mail Nachricht konnte nicht geparst werden: {0} email.server.err.usupported_encoding=Zeichencodierung ''{0}'' wird nicht unterst\u00fctzt email.server.err.failed_to_read_content_stream=Teilinhalt der Nachricht konnte nicht gelesen werden: {0} email.server.err.incorrect_message_part=Fehlerhafter Nachrichtenteil: {0} - diff --git a/config/alfresco/messages/email-service_es.properties b/config/alfresco/messages/email-service_es.properties index 0f6416644c..563c26f10b 100755 --- a/config/alfresco/messages/email-service_es.properties +++ b/config/alfresco/messages/email-service_es.properties @@ -5,21 +5,20 @@ email.server.err.sender_blocked=A ''{0}'' le fue denegado el acceso. email.server.err.inbound_mail_disabled=El servidor Alfresco no est\u00e1 configurado para aceptar correos entrantes. email.server.err.access_denied=El acceso a ''{1}'' le fue denegado a ''{0}''. email.server.err.invalid_subject=La l\u00ednea de asunto debe ser un nombre de fichero v\u00e1lido. -email.server.err.unknown_source_address=La direcci\u00f3n de correo electr\u00f3nico ''desde'' no fue reconocida: {0}. +email.server.err.unknown_source_address=La direcci\u00f3n de correo electr\u00f3nico "desde" no fue reconocida: {0}. email.server.err.user_not_email_contributor=El usuario ''{0}'' no est\u00e1 en el grupo contribuidor de correos. email.server.err.no_email_contributor_group=El grupo Contribuidor de correos no existe. email.server.err.invalid_node_address=La direcci\u00f3n correo electr\u00f3nico ''{0}'' no hace referencia a un nodo de acceso v\u00e1lido. email.server.err.handler_not_found=No se ha encontrado el controlador de mensajes de correo para el tipo de nodo ''{0}''. email.server.err.mail_read_error=Se produjo un error al leer el mensaje de correo: {0} email.server.err.failed_to_create_mime_message=No se pudo crear el mensaje MIME desde la corriente de entrada: {0} -email.server.err.extracting_from_address=No se pudo extraer la direcci\u00f3n ''desde'': {0} +email.server.err.extracting_from_address=No se pudo extraer la direcci\u00f3n "desde": {0} email.server.err.no_from_address=El mensaje no tiene direcci\u00f3n 'desde'. -email.server.err.extracting_to_address=No se pudo extraer la direcci\u00f3n ''a'': {0} +email.server.err.extracting_to_address=No se pudo extraer la direcci\u00f3n "a": {0} email.server.err.no_to_address=El mensaje no tiene direcci\u00f3n 'a'. email.server.err.extracting_subject=No se pudo extraer el asunto del mensaje: {0} -email.server.err.extracting_sent_date=No se pudo extraer la fecha ''enviado el'': {0} +email.server.err.extracting_sent_date=No se pudo extraer la fecha ''enviado el': {0} email.server.err.parse_message=No se pudo analizar sint\u00e1cticamente el mensaje correo: {0} email.server.err.usupported_encoding=Codificaci\u00f3n ''{0}'' no soportada email.server.err.failed_to_read_content_stream=No se pudo leer el contenido de la parte de mensaje: {0} email.server.err.incorrect_message_part=Parte de mensaje incorrecta: {0} - diff --git a/config/alfresco/messages/email-service_fr.properties b/config/alfresco/messages/email-service_fr.properties index 4dec00ff97..67ed8a493d 100755 --- a/config/alfresco/messages/email-service_fr.properties +++ b/config/alfresco/messages/email-service_fr.properties @@ -5,19 +5,19 @@ email.server.err.sender_blocked=''{0}'' s''est vu refuser l''acc\u00e8s. email.server.err.inbound_mail_disabled=La configuration du serveur Alfresco ne permet pas d'accepter les E-mails entrants. email.server.err.access_denied=''{0}'' s''est vu refuser l''acc\u00e8s \u00e0 ''{1}''. email.server.err.invalid_subject=La ligne d'objet doit \u00eatre un nom de fichier valide. -email.server.err.unknown_source_address=L''adresse E-mail ''from'' n''est pas reconnue\u00a0: {0}. +email.server.err.unknown_source_address=L''adresse E-mail ''from'' n''est pas reconnue : {0}. email.server.err.user_not_email_contributor=L''utilisateur ''{0}'' ne fait pas partie du groupe des contributeurs par E-mail. email.server.err.no_email_contributor_group=Le groupe de contributeurs par E-mail n'existe pas. -email.server.err.invalid_node_address=L''adresse E-mail ''{0}'' ne fait pas r\u00e9f\u00e9rence \u00e0 un n\u009cud accessible valide. -email.server.err.handler_not_found=Le gestionnaire des E-mails est introuvable pour le type de n\u009cud ''{0}''. +email.server.err.invalid_node_address=L''adresse E-mail ''{0}'' ne fait pas r\u00e9f\u00e9rence \u00e0 un n\u0153ud accessible valide. +email.server.err.handler_not_found=Le gestionnaire des E-mails est introuvable pour le type de n\u0153ud ''{0}''. email.server.err.mail_read_error=Une erreur s''est produite lors de la lecture de l''E-mail\u00a0: {0} -email.server.err.failed_to_create_mime_message=Impossible de cr\u00e9er le message\u00a0MIME \u00e0 partir du flux en entr\u00e9e\u00a0: {0} -email.server.err.extracting_from_address=Impossible d''extraire l''adresse ''from''\u00a0: {0} +email.server.err.failed_to_create_mime_message=Impossible de cr\u00e9er le message MIME \u00e0 partir du flux en entr\u00e9e\u00a0: {0} +email.server.err.extracting_from_address=Impossible d''extraire l''adresse ''from'' : {0} email.server.err.no_from_address=Aucune adresse 'from' n'est sp\u00e9cifi\u00e9e pour le message. -email.server.err.extracting_to_address=Impossible d''extraire l''adresse ''to''\u00a0: {0} +email.server.err.extracting_to_address=Impossible d''extraire l''adresse ''to'' : {0} email.server.err.no_to_address=Aucune adresse 'to' n'est sp\u00e9cifi\u00e9e pour le message. email.server.err.extracting_subject=Impossible d''extraire l''objet du message\u00a0: {0} -email.server.err.extracting_sent_date=Impossible d''extraire la date ''sent on''\u00a0: {0} +email.server.err.extracting_sent_date=Impossible d'extraire la date ''sent on'' : {0} email.server.err.parse_message=Impossible d''analyser l''E-mail\u00a0: {0} email.server.err.usupported_encoding=L''encodage ''{0}'' n''est pas pris en charge email.server.err.failed_to_read_content_stream=Impossible de lire le contenu partiel du message\u00a0: {0} diff --git a/config/alfresco/messages/email-service_it.properties b/config/alfresco/messages/email-service_it.properties index 55fb2c73cc..b990c2e988 100755 --- a/config/alfresco/messages/email-service_it.properties +++ b/config/alfresco/messages/email-service_it.properties @@ -3,8 +3,8 @@ email.server.msg.default_subject=E-mail-{0} email.server.err.sender_blocked=''{0}'' a \u00e8 stato negato l''accesso. email.server.err.inbound_mail_disabled=Il server Alfresco non \u00e8 configurato in modo da accettare e-mail in arrivo. -email.server.err.access_denied=''{0}'' a \u00e8 stato negato l''accesso per ''{1}''. -email.server.err.invalid_subject=La riga dell''oggetto deve contenere un nome di file valido. +email.server.err.access_denied= ''{0}'' a \u00e8 stato negato l''accesso per ''{1}''. +email.server.err.invalid_subject=La riga dell'oggetto deve contenere un nome di file valido. email.server.err.unknown_source_address=L''indirizzo e-mail del mittente non \u00e8 stato riconosciuto: {0}. email.server.err.user_not_email_contributor=L''utente ''{0}'' non fa parte del gruppo di contributori ai messaggi e-mail. email.server.err.no_email_contributor_group=Il gruppo di contributori ai messaggi e-mail non esiste. diff --git a/config/alfresco/messages/email-service_ja.properties b/config/alfresco/messages/email-service_ja.properties index 43b359efa5..a5a5dcfa70 100755 --- a/config/alfresco/messages/email-service_ja.properties +++ b/config/alfresco/messages/email-service_ja.properties @@ -1,24 +1,24 @@ -email.server.msg.received_by_smtp=''{0}''\u304b\u3089SMTP\u3067\u53d7\u4fe1\u3057\u307e\u3057\u305f\u3002 -email.server.msg.default_subject=E\u30e1\u30fc\u30eb-{0} +email.server.msg.received_by_smtp=''{0}''\u304b\u3089SMTP\u306b\u3088\u308a\u53d7\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002 +email.server.msg.default_subject=E\u30e1\u30fc\u30eb{0} email.server.err.sender_blocked=''{0}''\u306e\u30a2\u30af\u30bb\u30b9\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002 -email.server.err.inbound_mail_disabled=Alfresco\u30b5\u30fc\u30d0\u304c\u7740\u4fe1E\u30e1\u30fc\u30eb\u3092\u53d7\u3051\u5165\u308c\u308b\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +email.server.err.inbound_mail_disabled=Alfresco\u30b5\u30fc\u30d0\u306f\u3001\u30a4\u30f3\u30d0\u30a6\u30f3\u30c9E\u30e1\u30fc\u30eb\u3092\u53d7\u4fe1\u3059\u308b\u3088\u3046\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 email.server.err.access_denied=''{0}''\u306e''{1}''\u3078\u306e\u30a2\u30af\u30bb\u30b9\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002 -email.server.err.invalid_subject=\u4ef6\u540d\u884c\u306f\u6709\u52b9\u306a\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -email.server.err.unknown_source_address=''\u9001\u4fe1\u5143''E\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u8a8d\u8b58\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f: {0}\u3002 -email.server.err.user_not_email_contributor=\u30e6\u30fc\u30b6''{0}''\u306fE\u30e1\u30fc\u30eb\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30b0\u30eb\u30fc\u30d7\u306b\u542b\u307e\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -email.server.err.no_email_contributor_group=E\u30e1\u30fc\u30eb\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30b0\u30eb\u30fc\u30d7\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 -email.server.err.invalid_node_address=E\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9''{0}''\u306f\u6709\u52b9\u306a\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u30ce\u30fc\u30c9\u3092\u53c2\u7167\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -email.server.err.handler_not_found=\u30ce\u30fc\u30c9\u30bf\u30a4\u30d7''{0}''\u306eE\u30e1\u30fc\u30eb\u30e1\u30c3\u30bb\u30fc\u30b8\u30cf\u30f3\u30c9\u30e9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 -email.server.err.mail_read_error=E\u30e1\u30fc\u30eb\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8aad\u53d6\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0} -email.server.err.failed_to_create_mime_message=\u5165\u529b\u30b9\u30c8\u30ea\u30fc\u30e0\u304b\u3089MIME\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u751f\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.extracting_from_address=''\u9001\u4fe1\u5143''\u30a2\u30c9\u30ec\u30b9\u306e\u62bd\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.no_from_address=\u30e1\u30c3\u30bb\u30fc\u30b8\u306b'\u9001\u4fe1\u5143'\u30a2\u30c9\u30ec\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 -email.server.err.extracting_to_address=\u5b9b\u5148''\u30a2\u30c9\u30ec\u30b9\u306e\u62bd\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} +email.server.err.invalid_subject=\u4ef6\u540d\u306e\u884c\u306b\u6709\u52b9\u306a\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 +email.server.err.unknown_source_address=''\u5dee\u51fa\u4eba''\u306eE\u30e1\u30fc\u30eb\u30fb\u30a2\u30c9\u30ec\u30b9\u304c\u627f\u8a8d\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.user_not_email_contributor=\u30e6\u30fc\u30b6''{0}''\u306f\u3001E\u30e1\u30fc\u30eb\u30fb\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30fb\u30b0\u30eb\u30fc\u30d7\u306b\u542b\u307e\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +email.server.err.no_email_contributor_group=E\u30e1\u30fc\u30eb\u30fb\u30b3\u30f3\u30c8\u30ea\u30d3\u30e5\u30fc\u30bf\u30fb\u30b0\u30eb\u30fc\u30d7\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +email.server.err.invalid_node_address=E\u30e1\u30fc\u30eb\u30fb\u30a2\u30c9\u30ec\u30b9''{0}''\u306f\u3001\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a\u6709\u52b9\u30ce\u30fc\u30c9\u3092\u53c2\u7167\u3057\u3066\u3044\u307e\u305b\u3093\u3002 +email.server.err.handler_not_found=\u30ce\u30fc\u30c9\u30fb\u30bf\u30a4\u30d7''{0}''\u306eE\u30e1\u30fc\u30eb\u30fb\u30e1\u30c3\u30bb\u30fc\u30b8\u30fb\u30cf\u30f3\u30c9\u30e9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +email.server.err.mail_read_error=\u30e1\u30fc\u30eb\u30fb\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8aad\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0} +email.server.err.failed_to_create_mime_message=\u5165\u529b\u30b9\u30c8\u30ea\u30fc\u30e0\u304b\u3089MIME\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.extracting_from_address='\u5dee\u51fa\u4eba''\u30a2\u30c9\u30ec\u30b9\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.no_from_address=\u30e1\u30c3\u30bb\u30fc\u30b8\u306b'\u5dee\u51fa\u4eba'\u30a2\u30c9\u30ec\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +email.server.err.extracting_to_address=''\u5b9b\u5148''\u30a2\u30c9\u30ec\u30b9\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} email.server.err.no_to_address=\u30e1\u30c3\u30bb\u30fc\u30b8\u306b'\u5b9b\u5148'\u30a2\u30c9\u30ec\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 -email.server.err.extracting_subject=\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u4ef6\u540d\u306e\u62bd\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.extracting_sent_date=''\u9001\u4fe1\u65e5''\u306e\u65e5\u4ed8\u306e\u62bd\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.parse_message=E\u30e1\u30fc\u30eb\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u30d1\u30fc\u30b9\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.usupported_encoding=\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0''{0}''\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u307e\u305b\u3093 -email.server.err.failed_to_read_content_stream=\u30e1\u30c3\u30bb\u30fc\u30b8\u90e8\u5206\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u8aad\u8fbc\u306b\u5931\u6557\u3057\u307e\u3057\u305f: {0} -email.server.err.incorrect_message_part=\u9593\u9055\u3063\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u90e8\u5206: {0} +email.server.err.extracting_subject=\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u4ef6\u540d\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.extracting_sent_date=''\u9001\u4fe1\u65e5''\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.parse_message=E\u30e1\u30fc\u30eb\u30fb\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u89e3\u6790\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.usupported_encoding=\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0''{0}''\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +email.server.err.failed_to_read_content_stream=\u30e1\u30c3\u30bb\u30fc\u30b8\u90e8\u5206\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8aad\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f: {0} +email.server.err.incorrect_message_part=\u30e1\u30c3\u30bb\u30fc\u30b8\u90e8\u5206\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093: {0} diff --git a/config/alfresco/messages/invitation-service_de.properties b/config/alfresco/messages/invitation-service_de.properties index 0ee2f8a953..fe9d684b1d 100755 --- a/config/alfresco/messages/invitation-service_de.properties +++ b/config/alfresco/messages/invitation-service_de.properties @@ -8,7 +8,7 @@ invitation.error.invalid_inviteId_format="Einladungs-ID hat ung\u00fcltiges Form invitation.invite.already_member="Der Benutzer {0} ist bereits Mitglied von {1} und kann nicht noch einmal eingeladen werden" invitation.cancel.not_site_manager="Aktueller Benutzer {0} kann Einladung: {1} nicht abbrechen, da sie nicht Site Manger f\u00fcr Site: {2} sind" invitation.invite.not_site_manager="Aktueller Benutzer {0} ist kein Site Manager f\u00fcr Site: {1}" -invitation.invite.unable_generate_id="Kann keinen Benutzernamen f\u00fcr Eingeladenen generieren, der nicht schon jemand anderem geh\u00f6rt Vorname:{0} Nachname: {1} E-Mail:{2}" +invitation.invite.unable_generate_id="Kann keinen Benutzernamen f\u00fcr Eingeladenen generieren, der nicht schon jemand anderem geh\u00f6rt Vorname: {0} Nachname: {1} E-Mail: {2}" invitation.invite.already_finished="Einladung {0} wurde bereits angenommen, abgebrochen oder abgelehnt" invitation.invite.authentication_chain="Authentifizierungskette l\u00e4sst das Erstellen neuer Konten nicht zu" diff --git a/config/alfresco/messages/invitation-service_es.properties b/config/alfresco/messages/invitation-service_es.properties index 5684544212..21e87485a3 100755 --- a/config/alfresco/messages/invitation-service_es.properties +++ b/config/alfresco/messages/invitation-service_es.properties @@ -8,7 +8,7 @@ invitation.error.invalid_inviteId_format="Formato del Id de invitaci\u00f3n inv\ invitation.invite.already_member="El usuario {0} ya es un miembro de {1} y no puede ser invitado de nuevo" invitation.cancel.not_site_manager="El usuario actual, {0}, no puede cancelar la invitaci\u00f3n: {1} porque no es administrador del sitio en el siguiente sitio: {2}" invitation.invite.not_site_manager="El usuario actual, {0}, no es administrador del sitio para el siguiente sitio: {1}" -invitation.invite.unable_generate_id="No se puede generar un nombre de usuario para el invitado, que contenga Nombre:{0} Apellidos:{1} correo electr\u00f3nico:{2} de otra persona" +invitation.invite.unable_generate_id="No se puede generar un nombre de usuario para el invitado, que contenga Nombre: {0} Apellidos: {1} correo electr\u00f3nico: {2} de otra persona" invitation.invite.already_finished="La invitaci\u00f3n, {0} ya ha sido aceptada, cancelada o rechazada" invitation.invite.authentication_chain="El m\u00e9todo de autenticaci\u00f3n establecido no permite crear nuevas cuentas" diff --git a/config/alfresco/messages/invitation-service_fr.properties b/config/alfresco/messages/invitation-service_fr.properties index 8b2ebf946d..55616d09e9 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''utilisateur pour l''invit\u00e9, qui n''appartient pas d\u00e9j\u00e0 \u00e0 une autre personne Pr\u00e9nom :{0} Nom : {1} E-mail : {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 2f0f2a0d96..dcde394d2c 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 appartenga gi\u00e0 a un altro utente nome:{0} cognome:{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_de.properties b/config/alfresco/messages/patch-service_de.properties new file mode 100755 index 0000000000..120e65aeb5 --- /dev/null +++ b/config/alfresco/messages/patch-service_de.properties @@ -0,0 +1,393 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +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} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDelete.description=Delete old attributes (if any) after they have been migrated +patch.migrateAttrDelete.result=Old attributes were deleted (if any) + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. diff --git a/config/alfresco/messages/patch-service_es.properties b/config/alfresco/messages/patch-service_es.properties new file mode 100755 index 0000000000..120e65aeb5 --- /dev/null +++ b/config/alfresco/messages/patch-service_es.properties @@ -0,0 +1,393 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +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} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDelete.description=Delete old attributes (if any) after they have been migrated +patch.migrateAttrDelete.result=Old attributes were deleted (if any) + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. diff --git a/config/alfresco/messages/patch-service_fr.properties b/config/alfresco/messages/patch-service_fr.properties new file mode 100755 index 0000000000..120e65aeb5 --- /dev/null +++ b/config/alfresco/messages/patch-service_fr.properties @@ -0,0 +1,393 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +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} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDelete.description=Delete old attributes (if any) after they have been migrated +patch.migrateAttrDelete.result=Old attributes were deleted (if any) + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. diff --git a/config/alfresco/messages/patch-service_it.properties b/config/alfresco/messages/patch-service_it.properties new file mode 100755 index 0000000000..120e65aeb5 --- /dev/null +++ b/config/alfresco/messages/patch-service_it.properties @@ -0,0 +1,393 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +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} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDelete.description=Delete old attributes (if any) after they have been migrated +patch.migrateAttrDelete.result=Old attributes were deleted (if any) + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. diff --git a/config/alfresco/messages/patch-service_ja.properties b/config/alfresco/messages/patch-service_ja.properties new file mode 100755 index 0000000000..120e65aeb5 --- /dev/null +++ b/config/alfresco/messages/patch-service_ja.properties @@ -0,0 +1,393 @@ +# PatchService messages +patch.service.preceeded_by_alternative=Preceded by alternative patch ''{0}''. +patch.service.not_relevant=Not relevant to schema {0} +patch.executer.checking=Checking for patches to apply ... +patch.service.applying_patch=\tApplying patch ''{0}'' ({1}). +patch.progress=\t\tPatch {0} {1}% complete, estimated complete at {2}. +patch.validation.failed=Validation of patch ''{0}'' failed. Patch is applicable to a newer schema than the schema of this build ({1}).\nfixesToSchema: {2}\ntargetSchema: {3}.\nIf this patch should always be run once on every installation, please ensure that the ''fixesToSchema'' value is set to '''${version.schema}'''. +patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. +patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== +patch.noLongerSupportedPatch.err.use_incremental_upgrade = \nPatch ''{0}'' was last supported on version {1}.\n Please follow an incremental upgrade using version {2}. + +# General patch messages + +patch.genericBootstrap.result.exists=Bootstrap location already exists: {0} +patch.genericBootstrap.result.created=Imported view into bootstrap location: {0} ({1}) +patch.genericBootstrap.err.multiple_found=Multiple nodes found: {0} + +patch.general.property_not_set=Patch property ''{0}'' has not been set on this patch: {1} + +patch.QNamePatch.result=Successfully updated the ''{0}'' QName to ''{1}''. + +patch.genericMimetypeUpdate.start=Updating mimetypes. +patch.genericMimetypeUpdate.updated=\n\tUpdated {0} content references with mimetype ''{1}'' to use ''{2}''. +patch.genericMimetypeUpdate.indexed=\n\tIndexed {0} nodes in store ''{1}''. +patch.genericMimetypeUpdate.done=\n\tFinished updating mimetypes. +patch.genericMimetypeUpdate.doneReindex=\n\tFinished updating mimetypes. Selective reindexing was disabled; a reindex is required to search for the new mimetype(s). + +# Individual patch messages + +patch.noOpPatch.description=A placeholder patch; usually marks a superceded patch. +patch.noOpPatch.result=No-op patch + +patch.marker.description=Marker patch to record installations and upgrades +patch.marker.result=Marker patch applied + +patch.savedSearchesFolder.description=Ensures the existence of the 'Saved Searches' folder. +patch.savedSearchesFolder.result.exists=The saved searches folder already exists: {0} +patch.savedSearchesFolder.result.created=The saved searches folder was successfully created: {0} + +patch.savedSearchesPermission.description=Sets required permissions on 'Saved Searches' folder. +patch.savedSearchesPermission.result.applied=Granted CONTRIBUTOR role to EVERYONE on ''Saved Searches'' folder: {0}. +patch.savedSearchesPermission.err.not_found='Saved Searches' folder could not be found. + +patch.updatePermissionData.description=Update permissions from 'folder' to 'cmobject' [JIRA: AR-344]. +patch.updatePermissionData.result=Changed {0} ''folder'' access control entries to ''cmobject''. + +patch.authoritiesFolder.description=Ensures the existence of the user authorities folder [JIRA: AR-497]. + +patch.authoritiesFolderPermission.description=Ensures group authorities are visible to everyone. + +patch.guestUser.description=Add the guest user, guest home space; and fix permissions on company home, guest home and guest person. +patch.guestUser.result=Added guest user and fixed permissions. + +patch.fixNodeSerializableValues.description=Ensure that property values are not stored as Serializable if at all possible +patch.fixNodeSerializableValues.result=Fixed {0} node property serialized values + +patch.updateGuestPermission.description=Rename guest permission from 'Guest' to 'Consumer' +patch.updateGuestPermission.result=Changed {0} ''Guest'' access control entries to ''Consumer''. + +patch.categoryRootPermission.description=Sets required permissions on 'Category Root' folder. +patch.categoryRootPermission.result=Granted CONSUMER role to GUEST on ''Category Root'' folder: {0}. +patch.categoryRootPermission.err.not_found=''Category Root'' folder ({0}) could not be found. + +patch.guestPersonPermission.description=Change Guest Person permission from 'Consumer' to 'Read' +patch.guestPersonPermission.result=Updated Guest Person permission from 'Consumer' to 'Read' + +patch.spacesRootPermission.description=Change Spaces store root permission from 'Consumer' to 'Read' +patch.spacesRootPermission.result=Updated Spaces store root permission from 'Consumer' to 'Read' + +patch.contentPermission.description=Update permission entries from 'cm:content' to 'sys:base'. +patch.contentPermission.result=Changed {0} ''cm:content'' access control entries to ''sys:base''. + +patch.forumsIcons.description=Updates forums icon references +patch.forumsIcons.result=Updated {0} icon references + +patch.emailTemplatesFolder.description=Ensures the existence of the 'Email Templates' folder. +patch.emailTemplatesFolder.result.exists=The email templates folder already exists: {0} +patch.emailTemplatesFolder.result.created=The email templates folder was successfully created: {0} + +patch.emailInviteAndNotifyTemplatesFolder.description=Ensures the existence of the 'Email Invite Templates' and 'Email Notify Templates' folders. +patch.emailNotifyTemplatesFolder.result.exists=The Email Notify Templates folder already exists: {0} +patch.emailNotifyTemplatesFolder.result.created=The Email Notify Templates folder was successfully created: {0} +patch.emailInviteTemplatesFolder.result.exists=The Email Invite Templates folder already exists: {0} +patch.emailInviteTemplatesFolder.result.created=The Email Invite Templates folder was successfully created: {0} + +patch.emailTemplatesContent.description=Loads the email templates into the Email Templates folder. +patch.emailTemplatesContent.result=Imported the Email Templates into the default folder. + +patch.descriptorUpdate.description=Update Repository descriptor +patch.descriptorUpdate.result=Repository descriptor updated + +patch.scriptsFolder.description=Ensures the existence of the 'Scripts' folder. +patch.scriptsFolder.result.exists=The scripts folder already exists: {0} +patch.scriptsFolder.result.created=The scripts folder was successfully created: {0} + +patch.topLevelGroupParentChildAssociationTypePatch.description=Ensure top level groups have the correct child association type. +patch.topLevelGroupParentChildAssociationTypePatch.result=Fixed {0} top level groups child association types. +patch.topLevelGroupParentChildAssociationTypePatch.err.sys_path_not_found=Required authority system path not found: {0} +patch.topLevelGroupParentChildAssociationTypePatch.err.auth_path_not_found=Required authority path not found: {0} + +patch.actionRuleDecouplingPatch.description=Migrate existing rules to the updated model where rules are decoupled from actions. +patch.actionRuleDecouplingPatch.result=Updated {0} rules. + +patch.systemWorkflowFolder.description=Ensures the existence of the system workflow container. +patch.systemWorkflowFolder.result.created=Created system workflow container {0}. + +patch.rssTemplatesFolder.description=Ensures the existence of the 'RSS Templates' folder. +patch.rssTemplatesFolder.result.exists=The RSS Templates folder already exists: {0}. Re-applying guest permissions. +patch.rssTemplatesFolder.result.created=The RSS Templates folder was successfully created: {0} + +patch.rendition.rendering_actions.exists=The Rendering Actions folder already exists: {0}. +patch.rendition.rendering_actions.created=The Rendering Actions folder was successfully created: {0} +patch.rendition.rendering_actions.description=Creates the Rendering Actions folder. + +patch.replication.replication_actions.exists=The Replication Actions folder already exists: {0}. +patch.replication.replication_actions.created=The Replication Actions folder was successfully created: {0} +patch.replication.replication_actions.description=Creates the Replication Actions folder. + +patch.uifacetsAspectRemovalPatch.description=Removes the incorrectly applied uifacets aspect from presentation template files. +patch.uifacetsAspectRemovalPatch.updated=Successfully removed the uifacets aspect from {0} presentation template files. + +patch.guestPersonPermission2.description=Change Guest Person permission to visible by all users as 'Consumer'. +patch.guestPersonPermission2.result=Updated Guest Person permission to visible by all users as 'Consumer'. + +patch.schemaUpgradeScript.description=Ensures that the database upgrade script has been run. +patch.schemaUpgradeScript.err.not_executed=The schema upgrade script, ''{0}'', has not been run against this database. + +patch.uniqueChildName.description=Checks and renames duplicate children. +patch.uniqueChildName.copyOf=({0}-{1}) +patch.uniqueChildName.result=Checked {0} associations and fixed {1} duplicates. See file {2} for details. +patch.uniqueChildName.err.unable_to_fix=Auto-fixing of duplicate names failed. See file {0} for details. + +patch.invalidNameEnding.description=Fixes names ending with a space or full stop. +patch.invalidNameEnding.result=Fixed {0} names ending with a space or full stop. See file {1} for details. +patch.invalidNameEnding.err.unable_to_fix=Auto-fixing of names ending with a space or full stop failed. See file {0} for details. +patch.invalidNameEnding.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemDescriptorContent.description=Adds the version properties content to the system descriptor. +patch.systemDescriptorContent.result=Added the version properties content to the system descriptor. +patch.systemDescriptorContent.err.no_version_properties=The version.properties resource could not be found. +patch.systemDescriptorContent.err.no_descriptor=The system descriptor could not be found. + +patch.versionHistoryPerformance.description=Improves the performance of version history lookups. +patch.versionHistoryPerformance.result=Updated {0} version history objects to improve performance. + +patch.multilingualBootstrap.description=Bootstraps the node that will hold the multilingual containers. + +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} +patch.wcmFolders.webforms.result.exists=The Web Forms folder already exists: {0} +patch.wcmFolders.webforms.result.created=The Web Forms folder was successfully created: {0} + +patch.linkNodeExtension.description=Fixes link node file extensions to have a .url extension. +patch.linkNodeExtension.result=Fixed {0} link node file extensions. See file {1} for details. +patch.linkNodeExtension.err.unable_to_fix=Auto-fixing of link node file extensions failed. See file {0} for details. +patch.linkNodeExtension.rewritten=Name ''{0}'' rewritten to ''{1}'' + +patch.systemRegistryBootstrap.description=Bootstraps the node that will hold system registry metadata. + +patch.userAndPersonUserNamesAsIdentifiers.description=Reindex usr:user and cm:person uids as identifiers +patch.userAndPersonUserNamesAsIdentifiers.result=Reindexed user:user and cm:person uids as identifiers + +patch.contentFormFolderType.description=Update WCM Content Form folder type. +patch.contentFormFolderType.result=Updated {0} WCM Content Form objects to ''wcm:formfolder'' type. + +patch.groupNamesAsIdentifiers.description=Reindex usr:authorityContainer gids as identifiers +patch.groupNamesAsIdentifiers.result=Reindexed usr:authorityContainer with identifiers + +patch.invalidUserPersonAndGroup.description=Fix up invalid uids for people and users; and invalid gids for groups +patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' invalid person nodes and ''{2}'' invalid authority nodes. + +patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. +patch.AVMGuidPatch.result=AVM GUIDS set. + +patch.webscripts.description=Adds Web Scripts to Data Dictionary. +patch.webscripts2.description=Adds Web Scripts (second set) to Data Dictionary. +patch.webscripts3.description=Update Web Scripts ReadMe. +patch.webscriptsExtension.description=Adds Web Scripts Extension to Data Dictionary. +patch.imap.messages.share.description=Adds email template for txt files to the Imap Configs/Templates +patch.imap.clear.old.messages.description=Remove old IMAP message templates +patch.imap.clear.old.messages.description.cleared=Old IMAP message templates have been removed from the repository + +patch.AVMLayeredSnapshot.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshot.result=Layered Node indirectionVersions set. + +patch.groupMembersAsIdentifiers.description=Reindex usr:authorityContainer members as identifiers + +patch.genericWorkflow.result.deployed=Re-deployed {0} workflows. + +patch.redeploySubmitProcess.description=Re-deploy WCM Submit Process Definition. +patch.deploySubmitDirectProcess.description=Deploy WCM Direct Submit Process Definition. + +patch.AVMAspects.description=Changes storage of aspects on AVM Nodes. +patch.AVMAspects.result=Aspects were moved. + +patch.ReadmeTemplate.description=Deployed ReadMe Template +patch.webScriptsReadme.description=Applied ReadMe template to Web Scripts folders + +patch.AVMProperties.description=Changes storage of properties on AVM Nodes. +patch.AVMProperties.result=Properties were moved. + +patch.customModels.description=Adds 'Models' folder to Data Dictionary +patch.customMessages.description=Adds 'Messages' folder to Data Dictionary +patch.customWebClientExtension.description=Adds 'Web Client Extension' folder to Data Dictionary + +patch.customWorkflowDefs.description=Adds 'Workflow Definitions' folder to Data Dictionary. + +patch.emailContributorGroup.description=Adds the 'GROUP_EMAIL_CONTRIBUTORS' group. + +patch.avmStoreAsIdentifier.description=Reindex wca:webfolder to make wca:avmstore an identifier +patch.avmStoreAsIdentifier.result=Reindexed wca:webfolder to make wca:avmstore an identifier + +patch.avmFormPropertyIdentifier.description=Reindex wca:webform to make wca:formname an identifier +patch.avmFormPropertyIdentifier.result=Reindexed wca:webform to make wca:formname an identifier + +patch.formsFolder.description=Adds 'Forms' folder to Data Dictionary. + +patch.tagRootCategory.description=Adds 'Tags' as new top-level category root. + +patch.sitesFolder.description=Adds 'Sites' folder to Company Home. + +patch.deploymentMigration.description=Migrates deployment data to the new model. +patch.deploymentMigration.webProjectName=Migrating deployment data for web project ''{0}'' +patch.deploymentMigration.serverMigrated=Server ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.reportMigrated=Deployment report for ''{0}'' from web project ''{1}'' has been migrated +patch.deploymentMigration.result=Deployment data has been migrated. + +patch.updateAvmPermissionData.description=Update avm permissions from 'webfolder' to 'cmobject'. +patch.updateAvmPermissionData.result=Changed {0} ''webfolder'' access control entries to ''cmobject''. + +patch.updateAvmPermissions.description=Update ACLs on all avm objects to the new 2.2 permission model +patch.updateAvmPermissions.result=Updated ACLs. Created {0} defining and {1} layered ACLs. + +patch.wcmPermissionPatch.description=Fix ACLs so they are only set on the staging area store. +patch.wcmPermissionPatch.result=Updated ACLs: ACLS are moved to the staging area store and removed from all other stores. They are now applied via layering. + +patch.avmWebProjectInheritPermissions.description=Break inheritance of permissions on wca:webfolder object to hide access by default. +patch.avmWebProjectInheritPermissions.result=Removed inheritance of permissions on all wca:webfolder objects. + +patch.wcmPostPermissionSnapshotPatch.description=Snapshot stores (after fixing ACLs so they are only set on the staging area store). +patch.wcmPostPermissionSnapshotPatch.result=Snapshot complete after WCM ACL changes. + +patch.updateDmPermissions.description=Update ACLs on all DM node objects to the new 3.0 permission model +patch.updateDmPermissions.result=Updated ACLs. Created {0} defining ACLs. + +patch.db-V3.0-0-CreateActivitiesExtras.description=Replaced by 'patch.db-V3.0-ActivityTables', which must run first. + +patch.createSiteStore.description=Create the AVM store for site data structure for 3.0 web-tier clients. +patch.createSiteStore.result=Created the AVM site data store. + +patch.sitePermissionRefactorPatch.description=Create permission groups for sites. +patch.sitePermissionRefactorPatch.result=Groups have been created for all sites and user's allocated accordingly. + +patch.migrateVersionStore.description=Version Store migration (from lightWeightVersionStore to version2Store) +patch.migrateVersionStore.incomplete=Version Store migration incomplete. +patch.migrateVersionStore.done=Version Store migration completed. +patch.migrateVersionStore.bypassingPatch=Bypass Version Store migration patch since scheduled to run as job + +patch.inviteEmailTemplate.description=Adds invite email template to invite space + +patch.calendarModelNamespacePatch.description=Update the Calendar model namespace URI and reindex all calendar objects. +patch.calendarModelNamespacePatch.result=Updated the Calendar model namespace URI to http://www.alfresco.org/model/calendar and reindexed {0} calendar objects. + +patch.spacesStoreGuestPermission.description=Sets READ permissions for GUEST on root node of the SpacesStore. +patch.spacesStoreGuestPermission.result=Granted READ permissions for GUEST on root node of the SpacesStore. + +patch.administratorGroup.description=Adds the 'ALFRESCO_ADMINISTRATORS' group. + +patch.resetWCMToGroupBasedPermissionsPatch.description=Reset WCM to group based permissions. +patch.resetWCMToGroupBasedPermissionsPatch.result=WCM reset to group based permissions. + +patch.migrateVersionStoreUpdateCounter.description=Update internal version2Store counter (if needed). +patch.migrateVersionStoreUpdateCounter.result=Update internal version2Store counter (if needed): {0} + +patch.invitationMigration.description=Migrate invitations from old invite service to invitation service +patch.invitationMigration.result=Migrated {0} invitations from old invite service to invitation service. +patch.invitationMigration.no_invites=No invitations require migrating old invite service to invitation service. + +patch.webSiteAddModerated.description=Changing Web Site visibility from a boolean to enum. +patch.webSiteAddModerated.result=Changed Web Site visibility. + +patch.mtShareExistingTenants.description=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result=Update existing tenants for MT Share. +patch.mtShareExistingTenants.result.not_applicable=Patch applied, although no changes made since MT is not enabled. + +patch.redeployInvitationProcess.description=Re-deploy Invitation Process Definitions. + +patch.imapFolders.description=Creates folders tree necessary for IMAP functionality +patch.imapFolders.result.exists=The 'Imap Configs' folder already exists +patch.imapFolders.result.created=The 'Imap Configs' folder was successfully created + +patch.zonedAuthorities.description=Adds the remodelled cm:authority container to the spaces store + +patch.authorityMigration.description=Copies any old authorities from the user store to the spaces store. +patch.authorityMigration.process.name=Authority Migration +patch.authorityMigration.warning.assoc=Ignoring group memberships of non-existent user {1} +patch.authorityMigration.result=Migrated {0} groups and {1} group associations to the spaces store. + +patch.authorityDefaultZonesPatch.description=Adds groups and people to the appropriate zones for wcm, share and everything else. +patch.authorityDefaultZonesPatch.result=Unzoned groups and people added to the default zones. +patch.authorityDefaultZonesPatch.users= Adding users to zones ... +patch.authorityDefaultZonesPatch.groups= Adding groups to zones ... + +patch.fixNameCrcValues.description=Fixes name and qname CRC32 values to match UTF-8 encoding. +patch.fixNameCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} node child associations. See file {1} for details. +patch.fixNameCrcValues.fixed=Updated CRC32 values for association ID {0}, name ''{1}'': {2} -> {3}, qname ''{4}'': {5} -> {6}. +patch.fixNameCrcValues.unableToChange=Failed to update the CRC32 value for association ID {0}: \n Node name: {1} \n name CRC old: {2} \n name CRC new: {3} \n qname: {4} \n qname CRC old: {5} \n qname CRC new: {6} \n Error: {7} +patch.fixNameCrcValues.fixingLocalname=Fixing invalid localname for association ID {0}: \n Was: ''{1}'' \n Now: ''{2}'' +patch.fixNameCrcValues.associationTypeNotDefined=Association type ''{0}'' has not been defined for child association ID {1}. +patch.fixNameCrcValues.associationTypeNotChild=Association type ''{0}'' does not represent a child association but is used as one; for child association ID {1}. + +patch.personUsagePatch.description=Add person 'cm:sizeCurrent' property (if missing). +patch.personUsagePatch.result1=Added ''cm:sizeCurrent'' property to {0} people that were missing this property. +patch.personUsagePatch.result2=No people were missing the 'cm:sizeCurrent' property. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.transferDefinitions.description=Add transfer definitions folder to data dictionary. +patch.transferDefinitions.result=Transfer definitions folder added to data dictionary. + +patch.redeployNominatedInvitationProcessWithPropsForShare.description=Redeploy nominated invitation workflow +patch.redeployNominatedInvitationProcessWithPropsForShare.result=Nominated invitation workflow redeployed + +patch.thumbnailsAssocQName.description=Update the 'cm:thumbnails' association QName to 'rn:rendition'. + +patch.convertContentUrls.description=Converts pre-3.2 content URLs to use the alf_content_data table. The conversion work can also be done on a schedule; please contact Alfresco Support for further details. +patch.convertContentUrls.bypassingPatch=Content URL conversion was NOT performed by this patch. Activate the scheduled job 'contentUrlConverterTrigger'. +patch.convertContentUrls.start=Content URL conversion progress: +patch.convertContentUrls.error=Content URL conversion failed: {0} +patch.convertContentUrls.inProgress=Content URL conversion increment completed. Awaiting next scheduled call... +patch.convertContentUrls.done=Content URL conversion completed. +patch.convertContentUrls.adm.start=\tProcessing ADM Content URLs. +patch.convertContentUrls.adm.done=\tFinished processing ADM nodes up to ID {0}. +patch.convertContentUrls.avm.start=\tProcessing AVM Content URLs. +patch.convertContentUrls.avm.done=\tFinished processing AVM nodes up to ID {0}. +patch.convertContentUrls.store.start=\tReading content URLs from store {0}. +patch.convertContentUrls.store.readOnly=\tNo content URLs will be marked for deletion. The content store is read-only. +patch.convertContentUrls.store.pending=\tContent URLs will be marked for deletion once the URL conversion process is complete. +patch.convertContentUrls.store.noSupport=\tNo content URLs will be marked for deletion. The store does not support URL enumeration. +patch.convertContentUrls.store.progress=\t\tProcessed {0} content URLs from store. +patch.convertContentUrls.store.scheduled=\tScheduled {0} content URLs for deletion from store: {1} +patch.convertContentUrls.store.done=This job is complete. Deactivate the scheduled job 'contentUrlConverterTrigger'. + +patch.fixAuthoritiesCrcValues.description=Fixes authority CRC32 values to match UTF-8 encoding. +patch.fixAuthoritiesCrcValues.result=Fixed CRC32 values for UTF-8 encoding for {0} authorities. See file {1} for details. +patch.fixAuthoritiesCrcValues.fixed=Updated CRC32 values for authority ''{0}''. +patch.fixAuthoritiesCrcValues.unableToChange=Failed to update the CRC32 value for authority: \n Authority: {0} \n Error: {1} + +patch.updateMimetypes1.description=Fix mimetypes for Excel and Powerpoint. +patch.updateMimetypes2.description=Fix mimetypes for Excel and Powerpoint. + +patch.db-V3.2-AddFKIndexes.description=Fixes ALF-3189: Added missing FK indexes. Note: The script is empty for MySQL. + +patch.eliminateDuplicates.description=Fixes ALF-4203: Searches for AVM duplicate nodes and changes their name + +patch.migrateAttrTenants.description=Migrate old Tenant attributes +patch.migrateAttrTenants.result=Processed {0} attributes + +patch.migrateAttrAVMLocks.description=Migrate old AVM Lock attributes +patch.migrateAttrAVMLocks.result=Processed {0} attributes + +patch.migrateAttrPropBackedBeans.description=Migrate old Property-Backed Bean component attributes +patch.migrateAttrPropBackedBeans.result=Processed {0} attributes ({1} properties) + +patch.migrateAttrChainingURS.description=Migrate old Chaining User Registry Synchronizer attributes +patch.migrateAttrChainingURS.result=Processed {0} attributes + +patch.migrateAttrDelete.description=Delete old attributes (if any) after they have been migrated +patch.migrateAttrDelete.result=Old attributes were deleted (if any) + +patch.transfer.targetrulefolder.description=Creates the transfer target rule folder for the default transfer group. + +patch.transfer.targetrule.description=Creates the transfer target rule for the default transfer group. + +patch.actions.scheduledfolder.description=Creates the scheduled actions folder in the Data Dictionary. + +patch.removingLinkValidationMetadata.description=Fixes ALF-5185: Removes all Link Validation reports from schema + +patch.varcharFieldSizesQuadrupleIncreasing.description=ALF-4300: Increasing 'VARCHAR' field sizes quadruply for DB2 dialect + +patch.mtFixAdminExistingTenants.description=Fix bootstrapped creator/modifier +patch.mtFixAdminExistingTenants.result=Fix bootstrapped creator/modifier + +patch.fixUserQNames.description=Fixes user store qnames to improve native authentication performance +patch.fixUserQNames.result=Generated qnames for {0} users. + +patch.fixAclInheritance.description=Fixes any ACL inheritance issues. +patch.fixAclInheritance.result=Fixed {0} ACLs. diff --git a/config/alfresco/messages/templates-messages.properties b/config/alfresco/messages/templates-messages.properties index 5e08c27f22..66d9c2ad30 100644 --- a/config/alfresco/messages/templates-messages.properties +++ b/config/alfresco/messages/templates-messages.properties @@ -80,10 +80,8 @@ templates.doc_info.assocs=Assocs: templates.doc_info.properties=Properties: templates.doc_info.no_document_found=No document found! - - - - - - - +#invite_user_email.ftl +templates.invite_user_email.invited_to_space=You have been invited to ''{0}'' by {1} +templates.invite_user_email.role=You will have the role of: {0} +templates.invite_user_email.you_can_view_the_space=You can view the space through the Alfresco client +templates.invite_user_email.regards=Regards diff --git a/config/alfresco/messages/templates-messages_de.properties b/config/alfresco/messages/templates-messages_de.properties index 61dd23bfab..6073698a47 100755 --- a/config/alfresco/messages/templates-messages_de.properties +++ b/config/alfresco/messages/templates-messages_de.properties @@ -80,7 +80,11 @@ templates.doc_info.assocs=Assoziierungen: templates.doc_info.properties=Eigenschaften: templates.doc_info.no_document_found=Kein Dokument gefunden! - +#invite_user_email.ftl +templates.invite_user_email.invited_to_space={1} hat Sie nach ''{0}'' eingeladen +templates.invite_user_email.role=Sie werden folgende Rolle haben: {0} +templates.invite_user_email.you_can_view_the_space=Sie k\u00f6nnen den Arbeitsbereich im Alfresco Client \u00f6ffnen +templates.invite_user_email.regards=Mit freundlichen Gr\u00fc\u00dfen diff --git a/config/alfresco/messages/templates-messages_es.properties b/config/alfresco/messages/templates-messages_es.properties index 2a3bf75ff4..55fe83ec2b 100755 --- a/config/alfresco/messages/templates-messages_es.properties +++ b/config/alfresco/messages/templates-messages_es.properties @@ -79,3 +79,9 @@ templates.doc_info.aspects=Aspectos: templates.doc_info.assocs=Asociaciones: templates.doc_info.properties=Propiedades: templates.doc_info.no_document_found=\u00a1Ning\u00fan documento encontrado! + +#invite_user_email.ftl +templates.invite_user_email.invited_to_space=Ha sido invitado a ''{0}'' por {1} +templates.invite_user_email.role=Usted tendr\u00e1 el rol de: {0} +templates.invite_user_email.you_can_view_the_space=Puede ver el espacio a trav\u00e9s del cliente Alfresco +templates.invite_user_email.regards=Saludos \ No newline at end of file diff --git a/config/alfresco/messages/templates-messages_fr.properties b/config/alfresco/messages/templates-messages_fr.properties index dfb92b86ef..d0be70c758 100755 --- a/config/alfresco/messages/templates-messages_fr.properties +++ b/config/alfresco/messages/templates-messages_fr.properties @@ -79,3 +79,9 @@ templates.doc_info.aspects=Aspects\u00a0: templates.doc_info.assocs=Assoc.\u00a0: templates.doc_info.properties=Propri\u00e9t\u00e9s\u00a0: templates.doc_info.no_document_found=Aucun document\u00a0! + +#invite_user_email.ftl +templates.invite_user_email.invited_to_space=Vous avez \u00e9t\u00e9 invit\u00e9 \u00e0 ''{0}'' par {1}. +templates.invite_user_email.role=Vous disposerez du r\u00f4le suivant : {0} +templates.invite_user_email.you_can_view_the_space=Vous pouvez voir l'espace \u00e0 travers le client d'Alfresco +templates.invite_user_email.regards=Cordialement \ No newline at end of file diff --git a/config/alfresco/messages/templates-messages_it.properties b/config/alfresco/messages/templates-messages_it.properties index 7dc9ae4b74..9c37f6f989 100755 --- a/config/alfresco/messages/templates-messages_it.properties +++ b/config/alfresco/messages/templates-messages_it.properties @@ -79,3 +79,9 @@ templates.doc_info.aspects=Aspetti: templates.doc_info.assocs=Associazioni: templates.doc_info.properties=Propriet\u00e0: templates.doc_info.no_document_found=Nessun documento trovato! + +#invite_user_email.ftl +templates.invite_user_email.invited_to_space=\u00c8 stato ricevuto un invito a ''{0}'' da {1} +templates.invite_user_email.role=Il ruolo sar\u00e0: {0} +templates.invite_user_email.you_can_view_the_space=\u00c8 possibile vedere lo spazio attraverso il client Alfresco +templates.invite_user_email.regards=Saluti \ No newline at end of file diff --git a/config/alfresco/messages/templates-messages_ja.properties b/config/alfresco/messages/templates-messages_ja.properties index 82338a2ca7..dbe370c6b4 100755 --- a/config/alfresco/messages/templates-messages_ja.properties +++ b/config/alfresco/messages/templates-messages_ja.properties @@ -79,3 +79,9 @@ templates.doc_info.aspects=\u30a2\u30b9\u30da\u30af\u30c8: templates.doc_info.assocs=\u95a2\u9023: templates.doc_info.properties=\u30d7\u30ed\u30d1\u30c6\u30a3: templates.doc_info.no_document_found=\u6587\u66f8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\uff01 + +#invite_user_email.ftl +templates.invite_user_email.invited_to_space={1}\u304b\u3089''{0}''\u306b\u62db\u5f85\u3055\u308c\u3066\u3044\u307e\u3059 +templates.invite_user_email.role=\u4ee5\u4e0b\u306e\u5f79\u5272\u304c\u3042\u308a\u307e\u3059: {0} +templates.invite_user_email.you_can_view_the_space=Alfresco\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u30b9\u30da\u30fc\u30b9\u3092\u95b2\u89a7\u3067\u304d\u307e\u3059\u3002 +templates.invite_user_email.regards=\u3088\u308d\u3057\u304f\u304a\u9858\u3044\u7533\u3057\u3042\u3052\u307e\u3059\u3002 \ No newline at end of file diff --git a/config/alfresco/messages/transfer-model_fr.properties b/config/alfresco/messages/transfer-model_fr.properties index 726e26fd40..f58a410650 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 +# Display labels for Transfer Model -trx_applicationmodel.description=Alfresco Transfer Application Model +trx_applicationmodel.description=Mod\u00e8le d'application de transfert Alfresco -trx_applicationmodel.type.trx_transferGroup.title=Transfer Group -trx_applicationmodel.type.trx_transferGroup.description=The definition of a transfer group +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=Transfer Lock -trx_applicationmodel.type.trx_transferLock.description=Node type used to represent the transfer lock node +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=Transfer Record -trx_applicationmodel.type.trx_transferRecord.description=Node type used to record transfer information +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=Temp Transfer Store -trx_applicationmodel.type.trx_tempTransferStore.description=Node type used for storage of temporarily orphaned incoming nodes +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=Transfer Report -trx_applicationmodel.type.trx_transferReport.description=Transfer Report +trx_applicationmodel.type.trx_transferReport.title=Rapport de transfert +trx_applicationmodel.type.trx_transferReport.description=Rapport de transfert -trx_applicationmodel.type.trx_transferReportDest.title=Transfer Report From Destination -trx_applicationmodel.type.trx_transferReportDest.description=Transfer Report From Destination +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=Transfer Target -trx_applicationmodel.type.trx_transferTarget.description=The definition of a transfer target +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 destination -trx_applicationmodel.property.trx_endpointhost.description=H\u00f4te de destination +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 destination -trx_applicationmodel.property.trx_endpointport.description=Port de destination +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 destination -trx_applicationmodel.property.trx_endpointpath.description=Chemin de destination +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=Endpoint Protocol -trx_applicationmodel.property.trx_endpointprotocol.description=Endpoint Protocol +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_username.title=Username -trx_applicationmodel.property.trx_username.description=Username +trx_applicationmodel.property.trx_enabled.title=Activ\u00e9 +trx_applicationmodel.property.trx_enabled.description=Activ\u00e9 ou d\u00e9sactiv\u00e9 ? -trx_applicationmodel.property.trx_password.title=Password -trx_applicationmodel.property.trx_password.description=Password +trx_applicationmodel.property.trx_username.title=Nom d'utilisateur +trx_applicationmodel.property.trx_username.description=Nom d'utilisateur -trx_applicationmodel.property.trx_progressPosition.title=Progress Position -trx_applicationmodel.property.trx_progressPosition.description=Progress Position +trx_applicationmodel.property.trx_password.title=Mot de passe +trx_applicationmodel.property.trx_password.description=Mot de passe -trx_applicationmodel.property.trx_progressEndpoint.title=Progress Endpoint -trx_applicationmodel.property.trx_progressEndpoint.description=Progress Endpoint +trx_applicationmodel.property.trx_progressPosition.title=Position de la progression +trx_applicationmodel.property.trx_progressPosition.description=Position de la progression -trx_applicationmodel.property.trx_transferStatus.title=Transfer Status -trx_applicationmodel.property.trx_transferStatus.description=Transfer Status +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_transferError.title=Transfer Error -trx_applicationmodel.property.trx_transferError.description=Transfer Error +trx_applicationmodel.property.trx_transferStatus.title=Statut de transfert +trx_applicationmodel.property.trx_transferStatus.description=Statut de transfert -trx_applicationmodel.property.trx_enabled.title=Enabled -trx_applicationmodel.property.trx_enabled.description=Is this enabled or disabled +trx_applicationmodel.property.trx_transferError.title=Erreur de transfert +trx_applicationmodel.property.trx_transferError.description=Erreur de transfert -trx_applicationmodel.property.trx_transferId.title=Transfer Id -trx_applicationmodel.property.trx_transferId.description=Transfer Id +trx_applicationmodel.property.trx_transferId.title=ID de transfert +trx_applicationmodel.property.trx_transferId.description=ID de transfert -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_invadedBy.title=Envahi par +trx_applicationmodel.property.trx_invadedBy.description=Entrep\u00f4ts ayant envahi ce noeud -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_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=From Repository Id -trx_applicationmodel.property.trx_fromContent.description=The content URLs transferred with this node +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=Transfer Orphan -trx_applicationmodel.association.trx_orphan.description=Transfer Orphan +trx_applicationmodel.association.trx_orphan.title=Orphelin de transfert +trx_applicationmodel.association.trx_orphan.description=Orphelin de transfert -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_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=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 +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/wcmapp-model.properties b/config/alfresco/messages/wcmapp-model.properties new file mode 100644 index 0000000000..2b033f5117 --- /dev/null +++ b/config/alfresco/messages/wcmapp-model.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wcmapp-model_de.properties b/config/alfresco/messages/wcmapp-model_de.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_de.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wcmapp-model_es.properties b/config/alfresco/messages/wcmapp-model_es.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_es.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wcmapp-model_fr.properties b/config/alfresco/messages/wcmapp-model_fr.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_fr.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wcmapp-model_it.properties b/config/alfresco/messages/wcmapp-model_it.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_it.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wcmapp-model_ja.properties b/config/alfresco/messages/wcmapp-model_ja.properties new file mode 100755 index 0000000000..e17e99ba3b --- /dev/null +++ b/config/alfresco/messages/wcmapp-model_ja.properties @@ -0,0 +1,209 @@ +# Display labels for WCM Application Model + +wca_applicationmodel.description=Alfresco WCM Application Model + +wca_applicationmodel.type.wca_webfolder.title=WCM Web Project Folder +wca_applicationmodel.type.wca_webfolder.description=WCM Web Project Folder +wca_applicationmodel.property.wca_avmstore.title=AVM Store Root +wca_applicationmodel.property.wca_avmstore.description=AVM Store Root +wca_applicationmodel.property.wca_defaultwebapp.title=Default Webapp +wca_applicationmodel.property.wca_defaultwebapp.description=Default Webapp +wca_applicationmodel.property.wca_deployto.title=Deploy To +wca_applicationmodel.property.wca_deployto.description=Deploy To +wca_applicationmodel.property.wca_selecteddeployto.title=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployto.description=Servers Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.title=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_selecteddeployversion.description=Snapshot Version Selected For Deployment +wca_applicationmodel.property.wca_issource.title=Used as a template website +wca_applicationmodel.property.wca_issource.description=Used as a template website +wca_applicationmodel.property.wca_previewprovidername.title=Preview Provider +wca_applicationmodel.property.wca_previewprovidername.description=Preview Provider +wca_applicationmodel.association.wca_webuser.title=Website User +wca_applicationmodel.association.wca_webuser.description=Website User +wca_applicationmodel.association.wca_webform.title=Website Web Form +wca_applicationmodel.association.wca_webform.description=Website Web Form +wca_applicationmodel.association.wca_webworkflowdefaults.title=Web workflow defaults +wca_applicationmodel.association.wca_webworkflowdefaults.description=Web workflow defaults +wca_applicationmodel.association.wca_deploymentreport.title=Deployment Report +wca_applicationmodel.association.wca_deploymentreport.description=Deployment Report +wca_applicationmodel.association.wca_deploymentserver.title=Deployment Server +wca_applicationmodel.association.wca_deploymentserver.description=Deployment Server +wca_applicationmodel.association.wca_deploymentattempt.title=Deployment attempt +wca_applicationmodel.association.wca_deploymentattempt.description=Deployment attempt + +wca_applicationmodel.type.wca_webuser.title=Website User Information +wca_applicationmodel.type.wca_webuser.description=Website User Information +wca_applicationmodel.property.wca_username.title=Website User's Name +wca_applicationmodel.property.wca_username.description=Website User's Name +wca_applicationmodel.property.wca_role.title=Website User's Role +wca_applicationmodel.property.wca_role.description=Website User's Role + +wca_applicationmodel.type.wca_webform.title=Website Web Form +wca_applicationmodel.type.wca_webform.description=Website Web Form +wca_applicationmodel.property.wca_formname.title=Website Web Form's Name +wca_applicationmodel.property.wca_formname.description=Website Web Form's Name +wca_applicationmodel.association.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.association.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.association.wca_workflowdefaults.title=Workflow defaults +wca_applicationmodel.association.wca_workflowdefaults.description=Workflow defaults + +wca_applicationmodel.type.wca_webformtemplate.title=Website Web Form Template +wca_applicationmodel.type.wca_webformtemplate.description=Website Web Form Template +wca_applicationmodel.property.wca_baserenderingenginetemplatename.title=Base Rendering Engine Template Name +wca_applicationmodel.property.wca_baserenderingenginetemplatename.description=Base Rendering Engine Template Name + +wca_applicationmodel.type.wca_workflowdefaults.title=Workflow Defaults +wca_applicationmodel.type.wca_workflowdefaults.description=Workflow Defaults +wca_applicationmodel.property.wca_workflowname.title=Workflow Name +wca_applicationmodel.property.wca_workflowname.description=Workflow Name +wca_applicationmodel.property.wca_workflowdefaultproperties.title=Workflow Default Properties +wca_applicationmodel.property.wca_workflowdefaultproperties.description=Workflow Default Properties + +wca_applicationmodel.type.wca_webworkflowdefaults.title=Web Workflow Defaults +wca_applicationmodel.type.wca_webworkflowdefaults.description=Web Workflow Defaults + +wca_applicationmodel.type.wca_renditionproperties.title=Properties for renditions +wca_applicationmodel.type.wca_renditionproperties.description=Properties for renditions +wca_applicationmodel.property.wca_mimetypeforrendition.title=Mimetype for generated assets +wca_applicationmodel.property.wca_mimetypeforrendition.description=Mimetype for generated assets + +wca_applicationmodel.type.wca_formfolder.title=XForms Capture Form Folder +wca_applicationmodel.type.wca_formfolder.description=XForms Capture Form Folder + +wca_applicationmodel.type.wca_deploymentserver.title=Website Deployment Server +wca_applicationmodel.type.wca_deploymentserver.description=Website Deployment Server +wca_applicationmodel.property.wca_deploytype.title=Deployment Type +wca_applicationmodel.property.wca_deploytype.description=Deployment Type +wca_applicationmodel.property.wca_deployservertype.title=Deployment Server Type +wca_applicationmodel.property.wca_deployservertype.description=Deployment Server Type +wca_applicationmodel.property.wca_deployserverhost.title=Host +wca_applicationmodel.property.wca_deployserverhost.description=Host +wca_applicationmodel.property.wca_deployserverport.title=Port +wca_applicationmodel.property.wca_deployserverport.description=Port +wca_applicationmodel.property.wca_deployservername.title=Display Name +wca_applicationmodel.property.wca_deployservername.description=Display Name +wca_applicationmodel.property.wca_deployservergroup.title=Display Name +wca_applicationmodel.property.wca_deployservergroup.description=Display Name +wca_applicationmodel.property.wca_deployserveradaptername.title=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserveradaptername.description=Deployment Server Adapter Name +wca_applicationmodel.property.wca_deployserverusername.title=Username +wca_applicationmodel.property.wca_deployserverusername.description=Username +wca_applicationmodel.property.wca_deployserverpassword.title=Password +wca_applicationmodel.property.wca_deployserverpassword.description=Password +wca_applicationmodel.property.wca_deployserverurl.title=Runtime URL +wca_applicationmodel.property.wca_deployserverurl.description=Runtime URL +wca_applicationmodel.property.wca_deployservertarget.title=Deploy Target +wca_applicationmodel.property.wca_deployservertarget.description=Deploy Target +wca_applicationmodel.property.wca_deploysourcepath.title=Source Path +wca_applicationmodel.property.wca_deploysourcepath.description=Source Path +wca_applicationmodel.property.wca_deployexcludes.title=Excludes +wca_applicationmodel.property.wca_deployexcludes.description=Excludes +wca_applicationmodel.property.wca_deployserverallocatedto.title=Allocated To +wca_applicationmodel.property.wca_deployserverallocatedto.description=Allocated To +wca_applicationmodel.property.wca_deployonapproval.title=Deploy On Approval +wca_applicationmodel.property.wca_deployonapproval.description=Deploy On Approval + +wca_applicationmodel.type.wca_deploymentattempt.title=Website Deployment Attempt +wca_applicationmodel.type.wca_deploymentattempt.description=Website Deployment Attempt +wca_applicationmodel.property.wca_deployattemptid.title=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattemptid.description=Deploy Attempt ID +wca_applicationmodel.property.wca_deployattempttype.title=Attempt Type +wca_applicationmodel.property.wca_deployattempttype.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.title=Attempt Type +wca_applicationmodel.property.wca_deployattemptstore.description=Attempt Type +wca_applicationmodel.property.wca_deployattemptversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployattemptservers.title=Servers Deployed To +wca_applicationmodel.property.wca_deployattemptservers.description=Servers Deployed To +wca_applicationmodel.property.wca_deployattempttime.title=Time Of Deploy Attempt +wca_applicationmodel.property.wca_deployattempttime.description=Time Of Deploy Attempt +wca_applicationmodel.association.wca_deploymentreports.title=Deployment Reports +wca_applicationmodel.association.wca_deploymentreports.description=Deployment Reports + +wca_applicationmodel.type.wca_deploymentreport.title=Website Deployment Report +wca_applicationmodel.type.wca_deploymentreport.description=Website Deployment Report +wca_applicationmodel.property.wca_deployserver.title=Server Deployed To +wca_applicationmodel.property.wca_deployserver.description=Server Deployed To +wca_applicationmodel.property.wca_deployversion.title=Snapshot Version Deployed +wca_applicationmodel.property.wca_deployversion.description=Snapshot Version Deployed +wca_applicationmodel.property.wca_deploystarttime.title=Time Deploy Started +wca_applicationmodel.property.wca_deploystarttime.description=Time Deploy Started +wca_applicationmodel.property.wca_deployendtime.title=Time Deploy Finished +wca_applicationmodel.property.wca_deployendtime.description=Time Deploy Finished +wca_applicationmodel.property.wca_deploysuccessful.title=Deployment Successful +wca_applicationmodel.property.wca_deploysuccessful.description=Deployment Successful +wca_applicationmodel.property.wca_deployfailedreason.title=Failure Reason +wca_applicationmodel.property.wca_deployfailedreason.description=Failure Reason +wca_applicationmodel.property.wca_deployservernameused.title=Server Display Name +wca_applicationmodel.property.wca_deployservernameused.description=Server Display Name +wca_applicationmodel.property.wca_deployserverusernameused.title=Username Used +wca_applicationmodel.property.wca_deployserverusernameused.description=Username Used +wca_applicationmodel.property.wca_deployservertargetused.title=Target Used +wca_applicationmodel.property.wca_deployservertargetused.description=Target Used +wca_applicationmodel.property.wca_deploysourcepathused.title=Source Path Used +wca_applicationmodel.property.wca_deploysourcepathused.description=Source Path Used +wca_applicationmodel.property.wca_deployexcludesused.title=Excludes Used +wca_applicationmodel.property.wca_deployexcludesused.description=Excludes Used +wca_applicationmodel.property.wca_deployserverurlused.title=Source Path Used +wca_applicationmodel.property.wca_deployserverurlused.description=Source Path Used + +wca_applicationmodel.aspect.wca_webapp.title=Webapp +wca_applicationmodel.aspect.wca_webapp.description=Webapp + +wca_applicationmodel.aspect.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.aspect.wca_filenamepattern.description=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.title=Filename Pattern +wca_applicationmodel.property.wca_filenamepattern.description=Filename Pattern + +wca_applicationmodel.aspect.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.aspect.wca_outputpathpattern.description=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.title=Output Path Pattern +wca_applicationmodel.property.wca_outputpathpattern.description=Output Path Pattern + +wca_applicationmodel.aspect.wca_form.title=XForms Form +wca_applicationmodel.aspect.wca_form.description=XForms Form +wca_applicationmodel.property.wca_xmlschemarootelementname.title=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschemarootelementname.description=Schema Root Element Name +wca_applicationmodel.property.wca_xmlschema.title=Schema +wca_applicationmodel.property.wca_xmlschema.description=Schema +wca_applicationmodel.association.wca_renderingenginetemplates.title=Rendering Engine Templates +wca_applicationmodel.association.wca_renderingenginetemplates.description=Rendering Engine Templates +wca_applicationmodel.association.wca_formworkflowdefaults.title=Form Workflow Defaults +wca_applicationmodel.association.wca_formworkflowdefaults.description=Form Workflow Defaults + +wca_applicationmodel.aspect.wca_renderingenginetemplate.title=A Rendering Engine +wca_applicationmodel.aspect.wca_renderingenginetemplate.description=A Rendering Engine +wca_applicationmodel.property.wca_parentrenderingenginename.title=Type +wca_applicationmodel.property.wca_parentrenderingenginename.description=Type +wca_applicationmodel.property.wca_formsource.title=Form Source +wca_applicationmodel.property.wca_formsource.description=Form Source +wca_applicationmodel.association.wca_renditionproperties.title=Rendition Properties +wca_applicationmodel.association.wca_renditionproperties.description=Rendition Properties + +wca_applicationmodel.aspect.wca_forminstancedata.title=XML file generated by a form +wca_applicationmodel.aspect.wca_forminstancedata.description=XML file generated by a form +wca_applicationmodel.property.wca_parentformname.title=Parent Form Name +wca_applicationmodel.property.wca_parentformname.description=Form that generated this asset +wca_applicationmodel.property.wca_originalparentpath.title=Original Parent Path +wca_applicationmodel.property.wca_originalparentpath.description=The original parent path when this form instance data was created - used for regenerating accurately. +wca_applicationmodel.property.wca_renditions.title=Renditions +wca_applicationmodel.property.wca_renditions.description=Renditions of this form instance data + +wca_applicationmodel.aspect.wca_rendition.title=Rendition +wca_applicationmodel.aspect.wca_rendition.description=Output file generated by a rendering engine template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.title=Parent Rendering Engine Template +wca_applicationmodel.property.wca_parentrenderingenginetemplate.description=Form data renderer that generated this asset +wca_applicationmodel.property.wca_parentrenditionproperties.title=Parent Rendition Properties +wca_applicationmodel.property.wca_parentrenditionproperties.description=Rendition properties used for this rendition +wca_applicationmodel.property.wca_primaryforminstancedata.title=Primary Form Instance Data +wca_applicationmodel.property.wca_primaryforminstancedata.description=Primary XML Asset used to generate this asset + +wca_applicationmodel.aspect.wca_expires.title=Expires +wca_applicationmodel.aspect.wca_expires.description=Content that has or can expire +wca_applicationmodel.property.wca_expirationDate.title=Expiration Date +wca_applicationmodel.property.wca_expirationDate.description=Expiration Date + +wca_applicationmodel.aspect.wca_deployed.title=Deployed +wca_applicationmodel.aspect.wca_deployed.description=Has this content been deployed from wcm +wca_applicationmodel.property.wca_guid.title=GUID +wca_applicationmodel.property.wca_guid.description=WCM unique version \ No newline at end of file diff --git a/config/alfresco/messages/wdr-messages.properties b/config/alfresco/messages/wdr-messages.properties index 6aad0ef14f..5ea5fc71e1 100644 --- a/config/alfresco/messages/wdr-messages.properties +++ b/config/alfresco/messages/wdr-messages.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file="Unable to prepare, missing temporary file. wdr.err.invalid_ticket=Deployment timed out or invalid ticket. {0} wdr.err.unable_commit=Unable to commit -wdr.avm.snapshot_tag=Deployment from store:{0}, version:{1} -wdr.avm.snapshot_description=Deployment from store:{0}, version:{1} +wdr.avm.snapshot_tag=Deployment from store: {0}, version: {1} +wdr.avm.snapshot_description=Deployment from store: {0}, version: {1} diff --git a/config/alfresco/messages/wdr-messages_de.properties b/config/alfresco/messages/wdr-messages_de.properties index 150e98f0a7..5d08193cfe 100755 --- a/config/alfresco/messages/wdr-messages_de.properties +++ b/config/alfresco/messages/wdr-messages_de.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file=Kann nicht vorbereitet werden, tempor\u00e4r wdr.err.invalid_ticket=Deployment ist abgelaufen, oder Ticket ist ung\u00fcltig. {0} wdr.err.unable_commit=Kann nicht \u00fcbertragen werden. -wdr.avm.snapshot_tag=Deployment von Speicher:{0}, Version:{1} -wdr.avm.snapshot_description=Deployment von Speicher:{0}, Version:{1} +wdr.avm.snapshot_tag=Deployment von Speicher: {0}, Version: {1} +wdr.avm.snapshot_description=Deployment von Speicher: {0}, Version: {1} diff --git a/config/alfresco/messages/wdr-messages_es.properties b/config/alfresco/messages/wdr-messages_es.properties index f26480d6b9..197d43ff80 100755 --- a/config/alfresco/messages/wdr-messages_es.properties +++ b/config/alfresco/messages/wdr-messages_es.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file=No se puede preparar, falta el archivo tempo wdr.err.invalid_ticket=Despliegue expirado o vale no v\u00e1lido. {0} wdr.err.unable_commit=No se puede confirmar -wdr.avm.snapshot_tag=Despliegue desde el almac\u00e9n:{0}, versi\u00f3n:{1} -wdr.avm.snapshot_description=Despliegue desde el almac\u00e9n:{0}, versi\u00f3n:{1} +wdr.avm.snapshot_tag=Despliegue desde el almac\u00e9n: {0}, versi\u00f3n: {1} +wdr.avm.snapshot_description=Despliegue desde el almac\u00e9n: {0}, versi\u00f3n: {1} diff --git a/config/alfresco/messages/wdr-messages_fr.properties b/config/alfresco/messages/wdr-messages_fr.properties index f2ebdceb5d..8d171c1f97 100755 --- a/config/alfresco/messages/wdr-messages_fr.properties +++ b/config/alfresco/messages/wdr-messages_fr.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file=Pr\u00e9paration impossible, fichier tempora wdr.err.invalid_ticket=D\u00e9ploiement expir\u00e9 ou ticket non valide. {0} wdr.err.unable_commit=Validation impossible -wdr.avm.snapshot_tag=D\u00e9ploiement depuis le magasin:{0},version:{1} -wdr.avm.snapshot_description=D\u00e9ploiement depuis le magasin:{0},version:{1} +wdr.avm.snapshot_tag=D\u00e9ploiement depuis le magasin : {0}, version : {1} +wdr.avm.snapshot_description=D\u00e9ploiement depuis le magasin : {0}, version : {1} diff --git a/config/alfresco/messages/wdr-messages_it.properties b/config/alfresco/messages/wdr-messages_it.properties index 1cfdcde310..8fbb84e6a4 100755 --- a/config/alfresco/messages/wdr-messages_it.properties +++ b/config/alfresco/messages/wdr-messages_it.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file=Preparazione non riuscita, file temporaneo m wdr.err.invalid_ticket=Timeout dispiegamento o ticket non valido. {0} wdr.err.unable_commit=Impossibile eseguire il commit -wdr.avm.snapshot_tag=Dispiegamento dal deposito:{0}, versione:{1} -wdr.avm.snapshot_description=Dispiegamento dal deposito:{0}, versione:{1} +wdr.avm.snapshot_tag=Dispiegamento dal deposito: {0}, versione: {1} +wdr.avm.snapshot_description=Dispiegamento dal deposito: {0}, versione: {1} diff --git a/config/alfresco/messages/wdr-messages_ja.properties b/config/alfresco/messages/wdr-messages_ja.properties index a89f2c4c14..4cd11a64b5 100755 --- a/config/alfresco/messages/wdr-messages_ja.properties +++ b/config/alfresco/messages/wdr-messages_ja.properties @@ -7,6 +7,6 @@ wdr.err.unable_prepare_missing_file=\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u304c\u wdr.err.invalid_ticket=\u30c7\u30d7\u30ed\u30a4\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u305f\u304b\u3001\u30c1\u30b1\u30c3\u30c8\u304c\u7121\u52b9\u3067\u3059\u3002 {0} wdr.err.unable_commit=\u30b3\u30df\u30c3\u30c8\u3067\u304d\u307e\u305b\u3093 -wdr.avm.snapshot_tag=\u30b9\u30c8\u30a2:{0}\u3001\u30d0\u30fc\u30b8\u30e7\u30f3:{1}\u304b\u3089\u306e\u30c7\u30d7\u30ed\u30a4 -wdr.avm.snapshot_description=\u30b9\u30c8\u30a2:{0}\u3001\u30d0\u30fc\u30b8\u30e7\u30f3:{1}\u304b\u3089\u306e\u30c7\u30d7\u30ed\u30a4 +wdr.avm.snapshot_tag=\u30b9\u30c8\u30a2: {0}\u3001\u30d0\u30fc\u30b8\u30e7\u30f3: {1}\u304b\u3089\u306e\u30c7\u30d7\u30ed\u30a4 +wdr.avm.snapshot_description=\u30b9\u30c8\u30a2: {0}\u3001\u30d0\u30fc\u30b8\u30e7\u30f3: {1}\u304b\u3089\u306e\u30c7\u30d7\u30ed\u30a4 diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index b181a91811..0276eba0c1 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -66,9 +66,14 @@ org.alfresco.service.cmr.repository.NodeService - - - + + + + + + + + diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index 03482b98e8..7ac609d102 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -364,6 +364,11 @@ alfresco_user_store.adminpassword=209c6174da490caeb422f3fa5a7ae634 # note: default guest username - should not be changed after installation alfresco_user_store.guestusername=guest +# Used to move home folders to a new location +home_folder_provider_synchronizer.enabled=false +home_folder_provider_synchronizer.override_provider= +home_folder_provider_synchronizer.keep_empty_parents=false + # Spaces Archive Configuration spaces.archive.store=archive://SpacesStore diff --git a/config/alfresco/subsystems/Search/lucene/index-recovery-context.xml b/config/alfresco/subsystems/Search/lucene/index-recovery-context.xml index 93090f8718..3a3d359145 100644 --- a/config/alfresco/subsystems/Search/lucene/index-recovery-context.xml +++ b/config/alfresco/subsystems/Search/lucene/index-recovery-context.xml @@ -32,7 +32,7 @@ - + diff --git a/config/alfresco/subsystems/Search/lucene/lucene-search-context.xml b/config/alfresco/subsystems/Search/lucene/lucene-search-context.xml index e57a3a5c81..6e7f8d6c4f 100644 --- a/config/alfresco/subsystems/Search/lucene/lucene-search-context.xml +++ b/config/alfresco/subsystems/Search/lucene/lucene-search-context.xml @@ -317,6 +317,9 @@ + + + @@ -365,6 +368,9 @@ + + + @@ -392,6 +398,9 @@ + + + @@ -454,28 +463,13 @@ - - - org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer - - - - - - - - - - ${server.transaction.mode.default} - - - - + + + ${fts.indexer.batchSize} diff --git a/config/alfresco/subsystems/Search/lucene/scheduled-jobs-context.xml b/config/alfresco/subsystems/Search/lucene/scheduled-jobs-context.xml index 172f42e807..49c2e1c6af 100644 --- a/config/alfresco/subsystems/Search/lucene/scheduled-jobs-context.xml +++ b/config/alfresco/subsystems/Search/lucene/scheduled-jobs-context.xml @@ -12,7 +12,7 @@ - + diff --git a/config/alfresco/workflow/wcm-workflow-messages.properties b/config/alfresco/workflow/wcm-workflow-messages.properties index d6b81dbed6..b983ae3199 100644 --- a/config/alfresco/workflow/wcm-workflow-messages.properties +++ b/config/alfresco/workflow/wcm-workflow-messages.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=Abort Submission wcmwf_submit.node.submitpending.transition.cancel.description=Abort Submission wcmwf_submit.node.submitpending.transition.launch.title=Submit Now wcmwf_submit.node.submitpending.transition.launch.description=Submit Now +wcmwf_submit.node.submitted.transition.onsubmit.title=On Submit +wcmwf_submit.node.submitted.transition.onsubmit.description=On Submit wcmwf_submitdirect.workflow.title=Web Site Submission (Direct) wcmwf_submitdirect.workflow.description=Submit changes direct to staging sandbox diff --git a/config/alfresco/workflow/wcm-workflow-messages_de.properties b/config/alfresco/workflow/wcm-workflow-messages_de.properties index 31f0efc998..945df2c994 100755 --- a/config/alfresco/workflow/wcm-workflow-messages_de.properties +++ b/config/alfresco/workflow/wcm-workflow-messages_de.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=Vorlage abbrechen wcmwf_submit.node.submitpending.transition.cancel.description=Vorlage abbrechen wcmwf_submit.node.submitpending.transition.launch.title=Jetzt vorlegen wcmwf_submit.node.submitpending.transition.launch.description=Jetzt vorlegen +wcmwf_submit.node.submitted.transition.onsubmit.title=Bei Vorlage +wcmwf_submit.node.submitted.transition.onsubmit.description=Bei Vorlage wcmwf_submitdirect.workflow.title=Site Vorlage (direkt) wcmwf_submitdirect.workflow.description=Der Staging Sandbox die \u00c4nderungen direkt vorlegen diff --git a/config/alfresco/workflow/wcm-workflow-messages_es.properties b/config/alfresco/workflow/wcm-workflow-messages_es.properties index b3df4bded7..51467e86dc 100755 --- a/config/alfresco/workflow/wcm-workflow-messages_es.properties +++ b/config/alfresco/workflow/wcm-workflow-messages_es.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=Abortar env\u00edo wcmwf_submit.node.submitpending.transition.cancel.description=Abortar env\u00edo wcmwf_submit.node.submitpending.transition.launch.title=Enviar ahora wcmwf_submit.node.submitpending.transition.launch.description=Enviar ahora +wcmwf_submit.node.submitted.transition.onsubmit.title=En env\u00edo +wcmwf_submit.node.submitted.transition.onsubmit.description=En env\u00edo wcmwf_submitdirect.workflow.title=Env\u00edo de sitio Web (directo) wcmwf_submitdirect.workflow.description=Enviar cambios directamente al espacio de prueba inicial diff --git a/config/alfresco/workflow/wcm-workflow-messages_fr.properties b/config/alfresco/workflow/wcm-workflow-messages_fr.properties index 5a81fd5d50..f2be917f92 100755 --- a/config/alfresco/workflow/wcm-workflow-messages_fr.properties +++ b/config/alfresco/workflow/wcm-workflow-messages_fr.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=Abandonner la soumission wcmwf_submit.node.submitpending.transition.cancel.description=Abandonner la soumission wcmwf_submit.node.submitpending.transition.launch.title=Soumettre maintenant wcmwf_submit.node.submitpending.transition.launch.description=Soumettre maintenant +wcmwf_submit.node.submitted.transition.onsubmit.title=A la soumission +wcmwf_submit.node.submitted.transition.onsubmit.description=A la soumission wcmwf_submitdirect.workflow.title=Soumission de site Web (directe) wcmwf_submitdirect.workflow.description=Soumettre les modifications directement dans le bac \u00e0 sable de r\u00e9serve diff --git a/config/alfresco/workflow/wcm-workflow-messages_it.properties b/config/alfresco/workflow/wcm-workflow-messages_it.properties index 10f3142926..537558394d 100755 --- a/config/alfresco/workflow/wcm-workflow-messages_it.properties +++ b/config/alfresco/workflow/wcm-workflow-messages_it.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=Interrompi invio wcmwf_submit.node.submitpending.transition.cancel.description=Interrompi invio wcmwf_submit.node.submitpending.transition.launch.title=Invia ora wcmwf_submit.node.submitpending.transition.launch.description=Invia ora +wcmwf_submit.node.submitted.transition.onsubmit.title=In sottomissione +wcmwf_submit.node.submitted.transition.onsubmit.description=In sottomissione wcmwf_submitdirect.workflow.title=Invio sito web (diretto) wcmwf_submitdirect.workflow.description=Invia le modifiche direttamente alla sandbox temporanea diff --git a/config/alfresco/workflow/wcm-workflow-messages_ja.properties b/config/alfresco/workflow/wcm-workflow-messages_ja.properties index 823be36729..e9e1f28ca0 100755 --- a/config/alfresco/workflow/wcm-workflow-messages_ja.properties +++ b/config/alfresco/workflow/wcm-workflow-messages_ja.properties @@ -26,6 +26,8 @@ wcmwf_submit.node.submitpending.transition.cancel.title=\u63d0\u51fa\u306e\u505c wcmwf_submit.node.submitpending.transition.cancel.description=\u63d0\u51fa\u306e\u505c\u6b62 wcmwf_submit.node.submitpending.transition.launch.title=\u4eca\u3059\u3050\u9001\u4fe1 wcmwf_submit.node.submitpending.transition.launch.description=\u4eca\u3059\u3050\u9001\u4fe1 +wcmwf_submit.node.submitted.transition.onsubmit.title=\u9001\u4fe1\u3057\u307e\u3059 +wcmwf_submit.node.submitted.transition.onsubmit.description=\u9001\u4fe1\u3057\u307e\u3059 wcmwf_submitdirect.workflow.title=Web\u30b5\u30a4\u30c8\u63d0\u51fa\uff08\u76f4\u63a5\uff09 wcmwf_submitdirect.workflow.description=\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30fb\u30b5\u30f3\u30c9\u30dc\u30c3\u30af\u30b9\u306b\u5909\u66f4\u3092\u76f4\u63a5\u9001\u4fe1 diff --git a/source/java/org/alfresco/repo/action/executer/CopyActionExecuter.java b/source/java/org/alfresco/repo/action/executer/CopyActionExecuter.java index 7d8d40e9ca..1a1a852a90 100644 --- a/source/java/org/alfresco/repo/action/executer/CopyActionExecuter.java +++ b/source/java/org/alfresco/repo/action/executer/CopyActionExecuter.java @@ -54,24 +54,29 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase public static final String PARAM_OVERWRITE_COPY = "overwrite-copy"; private CopyService copyService; - private NodeService nodeService; - private CheckOutCheckInService checkOutCheckInService; + /** + * The node service + */ + private NodeService nodeService; + private CheckOutCheckInService checkOutCheckInService; + /** * Sets the node service */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + /** * Sets the copy service */ - public void setCopyService(CopyService copyService) - { - this.copyService = copyService; - } + public void setCopyService(CopyService copyService) + { + this.copyService = copyService; + } + /** * Service to determine check-in or check-out status @@ -82,30 +87,30 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase } @Override - protected void addParameterDefinitions(List paramList) - { - paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER, DataTypeDefinition.NODE_REF, true, getParamDisplayLabel(PARAM_DESTINATION_FOLDER))); - paramList.add(new ParameterDefinitionImpl(PARAM_DEEP_COPY, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_DEEP_COPY))); + protected void addParameterDefinitions(List paramList) + { + paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER, DataTypeDefinition.NODE_REF, true, getParamDisplayLabel(PARAM_DESTINATION_FOLDER))); + paramList.add(new ParameterDefinitionImpl(PARAM_DEEP_COPY, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_DEEP_COPY))); paramList.add(new ParameterDefinitionImpl(PARAM_OVERWRITE_COPY, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_OVERWRITE_COPY))); - } + } @Override public void executeImpl(Action ruleAction, NodeRef actionedUponNodeRef) { if (!nodeService.exists(actionedUponNodeRef)) - { + { return; } - NodeRef destinationParent = (NodeRef)ruleAction.getParameterValue(PARAM_DESTINATION_FOLDER); - - // Get the deep copy value - boolean deepCopy = false; + NodeRef destinationParent = (NodeRef)ruleAction.getParameterValue(PARAM_DESTINATION_FOLDER); + + // Get the deep copy value + boolean deepCopy = false; Boolean deepCopyValue = (Boolean)ruleAction.getParameterValue(PARAM_DEEP_COPY); if (deepCopyValue != null) { deepCopy = deepCopyValue.booleanValue(); } - + // Get the overwirte value boolean overwrite = true; Boolean overwriteValue = (Boolean)ruleAction.getParameterValue(PARAM_OVERWRITE_COPY); @@ -154,11 +159,11 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase ChildAssociationRef originalAssoc = nodeService.getPrimaryParent(actionedUponNodeRef); // Create a new copy of the node this.copyService.copyAndRename( - actionedUponNodeRef, - destinationParent, - originalAssoc.getTypeQName(), - originalAssoc.getQName(), - deepCopy); + actionedUponNodeRef, + destinationParent, + originalAssoc.getTypeQName(), + originalAssoc.getQName(), + deepCopy); } - } + } } diff --git a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java index bc6730c6e0..27cb1f1006 100644 --- a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java +++ b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java @@ -519,7 +519,20 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO selectChildAssocs(parentNodeId, null, null, null, null, null, callback); } } - + + /** + * Invalidates all cached artefacts for a particular node, forcing a refresh. + * + * @param nodeId the node ID + */ + private void invalidateNodeCaches(Long nodeId) + { + invalidateCachesByNodeId(null, nodeId, nodesCache); + invalidateCachesByNodeId(null, nodeId, propertiesCache); + invalidateCachesByNodeId(null, nodeId, aspectsCache); + invalidateCachesByNodeId(null, nodeId, parentAssocsCache); + } + /* * Transactions */ @@ -792,27 +805,52 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO public Status getNodeRefStatus(NodeRef nodeRef) { - // First check the cache of live nodes - Node node = new NodeEntity(nodeRef); - Pair pair = nodesCache.getByValue(node); - if (pair == null) + Node node = null; + + // Stage 1: check the cache without reading through + Long nodeId = nodesCache.getKey(nodeRef); + if (nodeId != null) { - // It's not there, so select ignoring the 'deleted' flag - node = selectNodeByNodeRef(nodeRef, null); + node = nodesCache.getValue(nodeId); + // If the node isn't for the current transaction, we are probably reindexing. So invalidate the cache, + // forcing a read through. + if (node == null || AlfrescoTransactionSupport.getTransactionReadState() != TxnReadState.TXN_READ_WRITE + || !getCurrentTransaction().getId().equals(node.getTransaction().getId()) + || !node.getNodeRef().equals(nodeRef)) + { + invalidateNodeCaches(nodeId); + node = null; + } } - else + + // Stage 2, read through to the database, caching results if appropriate + if (node == null) { - node = pair.getSecond(); + Pair pair = nodesCache.getByValue(new NodeEntity(nodeRef)); + if (pair == null) + { + // It's not there, so select ignoring the 'deleted' flag + node = selectNodeByNodeRef(nodeRef, null); + if (node != null) + { + // Invalidate anything cached for this node ID, just in case it has moved store, etc. + invalidateNodeCaches(node.getId()); + } + } + else + { + // We have successfully populated the cache + node = pair.getSecond(); + } } + if (node == null) { return null; } - else - { - Transaction txn = node.getTransaction(); - return new NodeRef.Status(nodeRef, txn.getChangeTxnId(), txn.getId(), node.getDeleted()); - } + + Transaction txn = node.getTransaction(); + return new NodeRef.Status(nodeRef, txn.getChangeTxnId(), txn.getId(), node.getDeleted()); } public Pair getNodePair(NodeRef nodeRef) @@ -930,7 +968,8 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO // There will be no other parent assocs boolean isRoot = false; boolean isStoreRoot = nodeTypeQName.equals(ContentModel.TYPE_STOREROOT); - ParentAssocsInfo parentAssocsInfo = new ParentAssocsInfo(isRoot, isStoreRoot, assoc); + ParentAssocsInfo parentAssocsInfo = new ParentAssocsInfo(node.getTransaction().getId(), isRoot, isStoreRoot, + assoc); parentAssocsCache.setValue(nodeId, parentAssocsInfo); // Ensure that cm:auditable values are propagated, if required @@ -3156,6 +3195,22 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO if (!hasParents && !parentAssocInfo.isRoot()) { + // We appear to have an orphaned node. But we may just have a temporarily out of sync clustered cache or a + // transaction that started ages before the one that committed the cache content!. So double check the node + // isn't actually deleted. + if (logger.isDebugEnabled()) + { + logger.debug("Stale cache detected for Node #" + currentNodeId + ": removing from cache."); + } + invalidateNodeCaches(currentNodeId); + + Status currentNodeStatus = getNodeRefStatus(currentNodeRef); + if (currentNodeStatus == null || currentNodeStatus.isDeleted()) + { + // Force a retry. The cached node was stale + throw new DataIntegrityViolationException("Stale cache detected for Node #" + currentNodeId); + } + // We have a corrupt repository throw new RuntimeException("Node without parents does not have root aspect: " + currentNodeRef); } // walk up each parent association @@ -3210,12 +3265,40 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO */ private ParentAssocsInfo getParentAssocsCached(Long nodeId) { - Pair cacheEntry = parentAssocsCache.getByKey(nodeId); - if (cacheEntry == null) + // We try to protect here against 'skew' between a cached node and its parent associations + // Unfortunately due to overlapping DB transactions and consistent read behaviour a thread + // can end up loading old associations and succeed in committing them to the shared cache + // without any conflicts + + // Allow for a single retry after cache validation + for (int i = 0; i < 2; i++) { - throw new DataIntegrityViolationException("Invalid node ID: " + nodeId); + Pair cacheEntry = parentAssocsCache.getByKey(nodeId); + if (cacheEntry == null) + { + throw new DataIntegrityViolationException("Invalid node ID: " + nodeId); + } + Node child = getNodeNotNull(nodeId); + ParentAssocsInfo parentAssocsInfo = cacheEntry.getSecond(); + // Validate that we aren't pairing up a cached node with historic parent associations from an old + // transaction (or the other way around) + Long txnId = parentAssocsInfo.getTxnId(); + if (txnId != null && !txnId.equals(child.getTransaction().getId())) + { + if (logger.isDebugEnabled()) + { + logger.debug("Stale cached node #" + nodeId + + " detected loading parent associations. Cached transaction ID: " + + child.getTransaction().getId() + ", actual transaction ID: " + txnId); + } + invalidateNodeCaches(nodeId); + } + else + { + return parentAssocsInfo; + } } - return cacheEntry.getSecond(); + throw new DataIntegrityViolationException("Stale cache detected for Node #" + nodeId); } private ParentAssocsInfo getParentAssocsCacheOnly(Long nodeId) @@ -3253,9 +3336,13 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO // Select all the parent associations List assocs = selectParentAssocs(nodeId); + + // Retrieve the transaction ID from the DB for validation purposes - prevents skew between a cached node and + // its parent assocs + Long txnId = assocs.isEmpty() ? null : assocs.get(0).getChildNode().getTransaction().getId(); // Build the cache object - ParentAssocsInfo value = new ParentAssocsInfo(isRoot, isStoreRoot, assocs); + ParentAssocsInfo value = new ParentAssocsInfo(txnId, isRoot, isStoreRoot, assocs); // Done return new Pair(nodeId, value); } @@ -3569,6 +3656,7 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO { Long nodeId = node.getId(); Node cached = nodesCache.getValue(nodeId); + ParentAssocsInfo cachedParents = parentAssocsCache.getValue(nodeId); if (cached != null && !txnId.equals(cached.getTransaction().getId())) { if (logger.isDebugEnabled()) @@ -3577,11 +3665,36 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO + " detected during transaction tracking. Cached transaction ID: " + cached.getTransaction().getId() + ", actual transaction ID: " + txnId); } - invalidateCachesByNodeId(null, nodeId, nodesCache); - invalidateCachesByNodeId(null, nodeId, parentAssocsCache); + invalidateNodeCaches(nodeId); } + else if (cachedParents != null && !txnId.equals(cachedParents.getTxnId())) + { + if (logger.isDebugEnabled()) + { + logger.debug("Stale cached parent associations for node #" + nodeId + + " detected during transaction tracking. Cached transaction ID: " + + cachedParents.getTxnId() + ", actual transaction ID: " + txnId); + } + invalidateNodeCaches(nodeId); + } + + // It's possible that a noderef has been remapped (e.g. node moved store) so make sure we don't have a stale + // mapping for this noderef either + Long oldNodeId = nodesCache.getKey(node.getNodeRef()); + if (oldNodeId != null && !(oldNodeId.equals(nodeId))) + { + if (logger.isDebugEnabled()) + { + logger.debug("Stale cached noderef " + node.getNodeRef() + + " detected during transaction tracking. Cached node ID: " + + oldNodeId + ", actual node ID: " + nodeId); + } + invalidateNodeCaches(oldNodeId); + } + nodeStatuses.add(node.getNodeStatus()); } + // Done return nodeStatuses; } diff --git a/source/java/org/alfresco/repo/domain/node/ParentAssocsInfo.java b/source/java/org/alfresco/repo/domain/node/ParentAssocsInfo.java index b4c08683a3..466b8665a2 100644 --- a/source/java/org/alfresco/repo/domain/node/ParentAssocsInfo.java +++ b/source/java/org/alfresco/repo/domain/node/ParentAssocsInfo.java @@ -30,7 +30,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * Object to keep hold of a node and it's parent associations. + * Object to keep hold of a node and its parent associations. * * @author David Ward * @author Derek Hulley @@ -44,6 +44,7 @@ import org.apache.commons.logging.LogFactory; private static Set warnedDuplicateParents = new HashSet(3); + private final Long txnId; private final boolean isRoot; private final boolean isStoreRoot; private final Long primaryAssocId; @@ -52,15 +53,16 @@ import org.apache.commons.logging.LogFactory; /** * Constructor to provide clean initial version of a Node's parent association */ - ParentAssocsInfo(boolean isRoot, boolean isStoreRoot, ChildAssocEntity parent) + ParentAssocsInfo(Long txnId, boolean isRoot, boolean isStoreRoot, ChildAssocEntity parent) { - this(isRoot, isStoreRoot, Collections.singletonList(parent)); + this(txnId, isRoot, isStoreRoot, Collections.singletonList(parent)); } /** * Constructor to provide clean initial version of a Node's parent associations */ - ParentAssocsInfo(boolean isRoot, boolean isStoreRoot, List parents) + ParentAssocsInfo(Long txnId, boolean isRoot, boolean isStoreRoot, List parents) { + this.txnId = txnId; this.isRoot = isRoot; this.isStoreRoot = isStoreRoot; Long primaryAssocId = null; @@ -105,11 +107,13 @@ import org.apache.commons.logging.LogFactory; * Private constructor used to copy existing values. */ private ParentAssocsInfo( + Long txnId, boolean isRoot, boolean isStoreRoot, Map parentAssocsById, Long primaryAssocId) { + this.txnId = txnId; this.isRoot = isRoot; this.isStoreRoot = isStoreRoot; this.parentAssocsById = Collections.unmodifiableMap(parentAssocsById); @@ -121,7 +125,8 @@ import org.apache.commons.logging.LogFactory; { StringBuilder builder = new StringBuilder(); builder.append("ParentAssocsInfo ") - .append("[isRoot=").append(isRoot) + .append("[txnId=").append(txnId) + .append(", isRoot=").append(isRoot) .append(", isStoreRoot=").append(isStoreRoot) .append(", parentAssocsById=").append(parentAssocsById) .append(", primaryAssocId=").append(primaryAssocId) @@ -129,6 +134,11 @@ import org.apache.commons.logging.LogFactory; return builder.toString(); } + public Long getTxnId() + { + return txnId; + } + public boolean isRoot() { return isRoot; @@ -151,25 +161,25 @@ import org.apache.commons.logging.LogFactory; public ParentAssocsInfo changeIsRoot(boolean isRoot) { - return new ParentAssocsInfo(isRoot, this.isRoot, parentAssocsById, primaryAssocId); + return new ParentAssocsInfo(this.txnId, isRoot, this.isRoot, parentAssocsById, primaryAssocId); } public ParentAssocsInfo changeIsStoreRoot(boolean isStoreRoot) { - return new ParentAssocsInfo(this.isRoot, isStoreRoot, parentAssocsById, primaryAssocId); + return new ParentAssocsInfo(this.txnId, this.isRoot, isStoreRoot, parentAssocsById, primaryAssocId); } public ParentAssocsInfo addAssoc(Long assocId, ChildAssocEntity parentAssoc) { Map parentAssocs = new HashMap(parentAssocsById); parentAssocs.put(parentAssoc.getId(), parentAssoc); - return new ParentAssocsInfo(isRoot, isStoreRoot, parentAssocs, primaryAssocId); + return new ParentAssocsInfo(this.txnId, isRoot, isStoreRoot, parentAssocs, primaryAssocId); } public ParentAssocsInfo removeAssoc(Long assocId) { Map parentAssocs = new HashMap(parentAssocsById); parentAssocs.remove(assocId); - return new ParentAssocsInfo(isRoot, isStoreRoot, parentAssocs, primaryAssocId); + return new ParentAssocsInfo(this.txnId, isRoot, isStoreRoot, parentAssocs, primaryAssocId); } } diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 676103d479..b1f8e5d859 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -1863,7 +1863,14 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol */ public ScriptNode copy(ScriptNode destination) { - return copy(destination, false); + ScriptNode copy = copy(destination, false); + + // ALF-9517 fix + if (copy != null && copy.hasAspect(ContentModel.ASPECT_VERSIONABLE.toString())) + { + copy.ensureVersioningEnabled(true, true); + } + return copy; } /** diff --git a/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java b/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java index 4fcd20338a..1bf5c35bc1 100644 --- a/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java +++ b/source/java/org/alfresco/repo/node/index/AbstractReindexComponent.java @@ -20,9 +20,13 @@ package org.alfresco.repo.node.index; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -36,6 +40,8 @@ import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.node.Transaction; import org.alfresco.repo.search.Indexer; import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; +import org.alfresco.repo.search.impl.lucene.LuceneResultSetRow; import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.security.authentication.AuthenticationUtil; @@ -49,14 +55,19 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.repository.NodeRef.Status; import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.ResultSetRow; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyCheck; import org.alfresco.util.VmShutdownListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; /** * Abstract helper for reindexing. @@ -345,16 +356,16 @@ public abstract class AbstractReindexComponent implements IndexRecovery * Helper method that caches ADM store references to prevent repeated and unnecessary calls to the * NodeService for this list. */ - private List getAdmStoreRefs() + private Set getAdmStoreRefs() { - List storeRefs = (List) AlfrescoTransactionSupport.getResource(KEY_STORE_REFS); + Set storeRefs = (Set) AlfrescoTransactionSupport.getResource(KEY_STORE_REFS); if (storeRefs != null) { return storeRefs; } else { - storeRefs = nodeService.getStores(); + storeRefs = new HashSet(nodeService.getStores()); Iterator storeRefsIterator = storeRefs.iterator(); while (storeRefsIterator.hasNext()) { @@ -377,17 +388,6 @@ public abstract class AbstractReindexComponent implements IndexRecovery } } - // Change the ordering to favour the most common stores - if (storeRefs.contains(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE)) - { - storeRefs.remove(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE); - storeRefs.add(0, StoreRef.STORE_REF_ARCHIVE_SPACESSTORE); - } - if (storeRefs.contains(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE)) - { - storeRefs.remove(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); - storeRefs.add(0, StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); - } // Bind it in AlfrescoTransactionSupport.bindResource(KEY_STORE_REFS, storeRefs); } @@ -400,6 +400,7 @@ public abstract class AbstractReindexComponent implements IndexRecovery * @param txn a specific transaction * @return Returns true if the transaction is definitely in the index */ + @SuppressWarnings("unchecked") public InIndex isTxnPresentInIndex(final Transaction txn) { if (txn == null) @@ -413,72 +414,180 @@ public abstract class AbstractReindexComponent implements IndexRecovery logger.trace("Checking for transaction in index: " + txnId); } - // Check if the txn ID is present in any store's index - boolean foundInIndex = false; - List storeRefs = getAdmStoreRefs(); - for (StoreRef storeRef : storeRefs) + + // Let's scan the changes for this transaction, and group together changes for applicable stores + List nodeStatuses = nodeDAO.getTxnChanges(txnId); + Set admStoreRefs = getAdmStoreRefs(); + Map> storeStatusMap = new HashMap>(admStoreRefs.size() * 2); + for (NodeRef.Status nodeStatus : nodeStatuses) { - boolean inStore = isTxnIdPresentInIndex(storeRef, txn); - if (inStore) + StoreRef storeRef = nodeStatus.getNodeRef().getStoreRef(); + if (admStoreRefs.contains(storeRef)) { - // found in a particular store - foundInIndex = true; - break; + List storeStatuses = storeStatusMap.get(storeRef); + if (storeStatuses == null) + { + storeStatuses = new LinkedList(); + storeStatusMap.put(storeRef, storeStatuses); + } + storeStatuses.add(nodeStatus); } } - InIndex result = InIndex.NO; - if (!foundInIndex) + + // Default decision is indeterminate, unless all established to be in index (YES) or one established to be missing (NO) + InIndex result = InIndex.INDETERMINATE; + + // Check if the txn ID is present in every applicable store's index + for (Map.Entry> entry : storeStatusMap.entrySet()) { - // If none of the stores have the transaction, then that might be because it consists of 0 modifications - int updateCount = nodeDAO.getTxnUpdateCount(txnId); - - if ((updateCount > 0) && (! allUpdatedNodesCanBeIgnored(txnId))) + StoreRef storeRef = entry.getKey(); + List storeStatuses = entry.getValue(); + + // Establish the number of deletes and updates for this storeRef + int deleteCount = 0; + int updateCount = 0; + for (NodeRef.Status nodeStatus : storeStatuses) { - // There were updates, but there is no sign in the indexes - result = InIndex.NO; - } - else - { - // We're now in the case where there were no updates - int deleteCount = nodeDAO.getTxnDeleteCount(txnId); - if (deleteCount == 0) + if (nodeStatus.isDeleted()) { - // There are no updates or deletes and no entry in the indexes. - // There are outdated nodes in the index. - result = InIndex.INDETERMINATE; + deleteCount++; } else { - // There were deleted nodes only. Check that all the deleted nodes were - // removed from the index otherwise it is out of date. - // If all nodes have been removed from the index then the result is that the index is OK - // ETWOTWO-1387 - // ALF-1989 - even if the nodes have not been found it is no good to use for AUTO index checking - result = InIndex.INDETERMINATE; - for (StoreRef storeRef : storeRefs) + updateCount++; + } + } + + if (updateCount > 0) + { + // Check the index + if (isTxnIdPresentInIndex(storeRef, txn)) + { + result = InIndex.YES; + } + // There were updates, but there is no sign in the indexes + else + { + result = InIndex.NO; + break; + } + } + // There were deleted nodes only. Check that all the deleted nodes were removed from the index otherwise it + // is out of date. If all nodes have been removed from the index then the result is that the index is OK + // ETWOTWO-1387 + // ALF-1989 - even if the nodes have not been found it is no good to use for AUTO index checking + else if (deleteCount > 0 && !haveNodesBeenRemovedFromIndex(storeRef, storeStatuses, txn)) + { + result = InIndex.NO; + break; + } + } + + // done + if (logger.isDebugEnabled()) + { + if (result == InIndex.NO) + { + logger.debug("Transaction " + txnId + " not present in indexes"); + + logger.debug(nodeStatuses.size() + " nodes in DB transaction"); + for (NodeRef.Status nodeStatus : nodeStatuses) + { + NodeRef nodeRef = nodeStatus.getNodeRef(); + if (nodeStatus.isDeleted()) { - if (!haveNodesBeenRemovedFromIndex(storeRef, txn)) + logger.debug(" DELETED TX " + nodeStatus.getChangeTxnId() + ": " + nodeRef); + } + else + { + logger.debug(" UPDATED / MOVED TX " + nodeStatus.getChangeTxnId() + ": " + nodeRef); + logger.debug(" " + nodeService.getProperties(nodeRef)); + } + ResultSet results = null; + SearchParameters sp = new SearchParameters(); + sp.setLanguage(SearchService.LANGUAGE_LUCENE); + sp.addStore(nodeRef.getStoreRef()); + try + { + sp.setQuery("ID:" + LuceneQueryParser.escape(nodeRef.toString())); + + results = searcher.query(sp); + for (ResultSetRow row : results) { - result = InIndex.NO; - break; + StringBuilder builder = new StringBuilder(1024).append(" STILL INDEXED: {"); + Document lrsDoc = ((LuceneResultSetRow) row).getDocument(); + Iterator fields = ((List) lrsDoc.getFields()).iterator(); + if (fields.hasNext()) + { + Field field = fields.next(); + builder.append(field.name()).append("=").append(field.stringValue()); + while (fields.hasNext()) + { + field = fields.next(); + builder.append(", ").append(field.name()).append("=").append(field.stringValue()); + } + } + builder.append("}"); + logger.debug(builder.toString()); } } + finally + { + if (results != null) { results.close(); } + } + try + { + sp.setQuery("FTSREF:" + LuceneQueryParser.escape(nodeRef.toString())); + + results = searcher.query(sp); + for (ResultSetRow row : results) + { + StringBuilder builder = new StringBuilder(1024).append(" FTSREF: {"); + Document lrsDoc = ((LuceneResultSetRow) row).getDocument(); + Iterator fields = ((List) lrsDoc.getFields()).iterator(); + if (fields.hasNext()) + { + Field field = fields.next(); + builder.append(field.name()).append("=").append(field.stringValue()); + while (fields.hasNext()) + { + field = fields.next(); + builder.append(", ").append(field.name()).append("=").append(field.stringValue()); + } + } + builder.append("}"); + logger.debug(builder.toString()); + } + } + finally + { + if (results != null) { results.close(); } + } } } - } - else - { - result = InIndex.YES; - } - - // done - if (logger.isDebugEnabled()) - { - logger.debug("Transaction " + txnId + " present in indexes: " + result); + else + { + if (logger.isTraceEnabled()) + { + logger.trace("Transaction " + txnId + " present in indexes: " + result); + } + } } return result; } + public InIndex isTxnPresentInIndex(final Transaction txn, final boolean readThrough) + { + return transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public InIndex execute() throws Throwable + { + return isTxnPresentInIndex(txn); + } + }, true, readThrough); + } + /** * @return Returns true if the given transaction is present in the index */ @@ -522,39 +631,10 @@ public abstract class AbstractReindexComponent implements IndexRecovery } } - protected boolean allUpdatedNodesCanBeIgnored(Long txnId) - { - ParameterCheck.mandatory("txnId", txnId); - - boolean allUpdatedNodesCanBeIgnored = false; - - List nodeStatuses = nodeDAO.getTxnChanges(txnId); - - allUpdatedNodesCanBeIgnored = true; - for (NodeRef.Status nodeStatus : nodeStatuses) - { - NodeRef nodeRef = nodeStatus.getNodeRef(); - if (! nodeStatus.isDeleted()) - { - // updated node (ie. not deleted) - StoreRef storeRef = nodeRef.getStoreRef(); - if (!isIgnorableStore(storeRef)) - { - allUpdatedNodesCanBeIgnored = false; - break; - } - } - } - - return allUpdatedNodesCanBeIgnored; - } - - private boolean haveNodesBeenRemovedFromIndex(final StoreRef storeRef, final Transaction txn) + private boolean haveNodesBeenRemovedFromIndex(final StoreRef storeRef, List nodeStatuses, final Transaction txn) { final Long txnId = txn.getId(); // there have been deletes, so we have to ensure that none of the nodes deleted are present in the index - // get all node refs for the transaction - List nodeStatuses = nodeDAO.getTxnChangesForStore(storeRef, txnId); boolean foundNodeRef = false; for (NodeRef.Status nodeStatus : nodeStatuses) { @@ -658,18 +738,41 @@ public abstract class AbstractReindexComponent implements IndexRecovery throw new AlfrescoRuntimeException("Reindex work must be done in the context of a read-only transaction"); } - // get the node references pertinent to the transaction - List nodeStatuses = nodeDAO.getTxnChanges(txnId); + // The indexer will 'read through' to the latest database changes for the rest of this transaction + indexer.setReadThrough(true); + + // get the node references pertinent to the transaction - We need to 'read through' here too + List> nodePairs = transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionCallback>>() + { + + @Override + public List> execute() throws Throwable + { + List nodeStatuses = nodeDAO.getTxnChanges(txnId); + List> nodePairs = new ArrayList>(nodeStatuses.size()); + for (NodeRef.Status nodeStatus : nodeStatuses) + { + if (nodeStatus == null) + { + // it's not there any more + continue; + } + + ChildAssociationRef parent = nodeStatus.isDeleted() ? null : nodeService.getPrimaryParent(nodeStatus.getNodeRef()); + nodePairs.add(new Pair(nodeStatus, parent)); + } + return nodePairs; + } + }, true, true); + // reindex each node int nodeCount = 0; - for (NodeRef.Status nodeStatus : nodeStatuses) + for (Pair nodePair: nodePairs) { + NodeRef.Status nodeStatus = nodePair.getFirst(); NodeRef nodeRef = nodeStatus.getNodeRef(); - if (nodeStatus == null) - { - // it's not there any more - continue; - } + if (nodeStatus.isDeleted()) // node deleted { if(isFull == false) @@ -681,6 +784,10 @@ public abstract class AbstractReindexComponent implements IndexRecovery null, nodeRef); indexer.deleteNode(assocRef); + if (logger.isDebugEnabled()) + { + logger.debug("DELETE: " + nodeRef); + } } } else // node created @@ -693,11 +800,31 @@ public abstract class AbstractReindexComponent implements IndexRecovery null, nodeRef); indexer.createNode(assocRef); + if (logger.isDebugEnabled()) + { + logger.debug("CREATE: " + nodeRef); + } } else { - // reindex - indexer.updateNode(nodeRef); + // reindex - force a cascade reindex if possible (to account for a possible move) + ChildAssociationRef parent = nodePair.getSecond(); + if (parent == null) + { + indexer.updateNode(nodeRef); + if (logger.isDebugEnabled()) + { + logger.debug("UPDATE: " + nodeRef); + } + } + else + { + indexer.createChildRelationship(parent); + if (logger.isDebugEnabled()) + { + logger.debug("MOVE: " + nodeRef + ", " + parent); + } + } } } // Make the callback diff --git a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java index 69e6688fc9..cfe6d49d38 100644 --- a/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java +++ b/source/java/org/alfresco/repo/node/index/FullIndexRecoveryComponent.java @@ -241,12 +241,13 @@ public class FullIndexRecoveryComponent extends AbstractReindexComponent for (Transaction txn : txns) { count++; - if (isTxnPresentInIndex(txn) == InIndex.NO) + InIndex inIndex = isTxnPresentInIndex(txn, true); + if (inIndex == InIndex.NO) { // Missing txn return InIndex.NO; } - if (isTxnPresentInIndex(txn) == InIndex.YES) + if (inIndex == InIndex.YES) { yesCount++; if((yesCount > 1) && (count >= 10)) @@ -265,7 +266,7 @@ public class FullIndexRecoveryComponent extends AbstractReindexComponent for (Transaction txn : txns) { count++; - current = isTxnPresentInIndex(txn); + current = isTxnPresentInIndex(txn, true); if (current == InIndex.NO) { // Missing txn diff --git a/source/java/org/alfresco/repo/node/index/IndexTransactionTracker.java b/source/java/org/alfresco/repo/node/index/IndexTransactionTracker.java index 72d7ef960e..75ea7fbd1e 100644 --- a/source/java/org/alfresco/repo/node/index/IndexTransactionTracker.java +++ b/source/java/org/alfresco/repo/node/index/IndexTransactionTracker.java @@ -524,7 +524,7 @@ found: { continue; } - else if ((inIndex = isTxnPresentInIndex(txn)) != InIndex.NO) + else if ((inIndex = isTxnPresentInIndex(txn, true)) != InIndex.NO) { if (logger.isDebugEnabled()) { @@ -645,7 +645,7 @@ found: // Reindex the transaction if we are forcing it or if it isn't in the index already InIndex inIndex = InIndex.INDETERMINATE; - if (forceReindex || (inIndex = isTxnPresentInIndex(txn)) == InIndex.NO) + if (forceReindex || (inIndex = isTxnPresentInIndex(txn, true)) == InIndex.NO) { // From this point on, until the tracker has caught up, all transactions need to be indexed forceReindex = true; diff --git a/source/java/org/alfresco/repo/search/Indexer.java b/source/java/org/alfresco/repo/search/Indexer.java index 8282a4bd1a..c21111b934 100644 --- a/source/java/org/alfresco/repo/search/Indexer.java +++ b/source/java/org/alfresco/repo/search/Indexer.java @@ -110,5 +110,14 @@ public interface Indexer public void deleteIndex(StoreRef storeRef); - public void flushPending(); + public void flushPending(); + + /** + * Activates 'read through' behaviour for this indexer. Rather than accessing the database through the current + * (potentially old) transaction, it will use a discrete read only transaction for each node it indexes. This avoids + * 'stale' nodes building up in the caches during long reindex runs. + * + * @param isReadThrough + */ + public void setReadThrough(boolean isReadThrough); } diff --git a/source/java/org/alfresco/repo/search/IndexerComponent.java b/source/java/org/alfresco/repo/search/IndexerComponent.java index 216e234e3f..50de7a0059 100644 --- a/source/java/org/alfresco/repo/search/IndexerComponent.java +++ b/source/java/org/alfresco/repo/search/IndexerComponent.java @@ -19,6 +19,7 @@ package org.alfresco.repo.search; import org.alfresco.repo.service.StoreRedirectorProxyFactory; +import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; @@ -40,6 +41,7 @@ public class IndexerComponent extends AbstractLifecycleBean implements Indexer { private StoreRedirectorProxyFactory storeRedirectorProxyFactory; private IndexerAndSearcher indexerAndSearcherFactory; + private static final String KEY_READ_THROUGH = IndexerComponent.class.getName() + "READ_THROUGH"; public void setStoreRedirectorProxyFactory(StoreRedirectorProxyFactory storeRedirectorProxyFactory) { @@ -62,44 +64,58 @@ public class IndexerComponent extends AbstractLifecycleBean implements Indexer this.indexerAndSearcherFactory = indexerAndSearcherFactory; } + public void setReadThrough(boolean isReadThrough) + { + if (isReadThrough) + { + AlfrescoTransactionSupport.bindResource(KEY_READ_THROUGH, Boolean.TRUE); + } + else + { + AlfrescoTransactionSupport.unbindResource(KEY_READ_THROUGH); + } + } + + private Indexer getIndexer(StoreRef storeRef) + { + Indexer indexer = indexerAndSearcherFactory.getIndexer(storeRef); + indexer.setReadThrough(AlfrescoTransactionSupport.getResource(KEY_READ_THROUGH) == Boolean.TRUE); + return indexer; + } + public void createNode(ChildAssociationRef relationshipRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer( - relationshipRef.getChildRef().getStoreRef()); + Indexer indexer = getIndexer(relationshipRef.getChildRef().getStoreRef()); indexer.createNode(relationshipRef); } public void updateNode(NodeRef nodeRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer(nodeRef.getStoreRef()); + Indexer indexer = getIndexer(nodeRef.getStoreRef()); indexer.updateNode(nodeRef); } public void deleteNode(ChildAssociationRef relationshipRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer( - relationshipRef.getChildRef().getStoreRef()); + Indexer indexer = getIndexer(relationshipRef.getChildRef().getStoreRef()); indexer.deleteNode(relationshipRef); } public void createChildRelationship(ChildAssociationRef relationshipRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer( - relationshipRef.getChildRef().getStoreRef()); + Indexer indexer = getIndexer(relationshipRef.getChildRef().getStoreRef()); indexer.createChildRelationship(relationshipRef); } public void updateChildRelationship(ChildAssociationRef relationshipBeforeRef, ChildAssociationRef relationshipAfterRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer( - relationshipBeforeRef.getChildRef().getStoreRef()); + Indexer indexer = getIndexer(relationshipBeforeRef.getChildRef().getStoreRef()); indexer.updateChildRelationship(relationshipBeforeRef, relationshipAfterRef); } public void deleteChildRelationship(ChildAssociationRef relationshipRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer( - relationshipRef.getChildRef().getStoreRef()); + Indexer indexer = getIndexer(relationshipRef.getChildRef().getStoreRef()); indexer.deleteChildRelationship(relationshipRef); } @@ -108,7 +124,7 @@ public class IndexerComponent extends AbstractLifecycleBean implements Indexer */ public void deleteIndex(StoreRef storeRef) { - Indexer indexer = indexerAndSearcherFactory.getIndexer(storeRef); + Indexer indexer = getIndexer(storeRef); indexer.deleteIndex(storeRef); } diff --git a/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java b/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java index e88e922f36..bb7f4dbdf1 100644 --- a/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java +++ b/source/java/org/alfresco/repo/search/impl/NoActionIndexer.java @@ -34,6 +34,10 @@ import org.alfresco.service.cmr.repository.StoreRef; */ public class NoActionIndexer implements Indexer { + public void setReadThrough(boolean isReadThrough) + { + return; + } public void createNode(ChildAssociationRef relationshipRef) { diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java index 70a08c509a..d7ac74c972 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerAndSearcherFactory.java @@ -20,17 +20,16 @@ package org.alfresco.repo.search.impl.lucene; import java.util.List; -import org.alfresco.cmis.CMISQueryService; import org.alfresco.repo.search.SearcherException; import org.alfresco.repo.search.SupportsBackgroundIndexing; import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; -import org.alfresco.repo.search.impl.querymodel.QueryEngine; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.transaction.TransactionService; /** * Factory for ADM indxers and searchers @@ -48,6 +47,8 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd protected FullTextSearchIndexer fullTextSearchIndexer; protected ContentService contentService; + + protected TransactionService transactionService; /** * Set the dictinary service @@ -90,6 +91,11 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd { this.contentService = contentService; } + + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } protected LuceneIndexer createIndexer(StoreRef storeRef, String deltaId) { @@ -102,6 +108,7 @@ public class ADMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd // indexer.setLuceneIndexLock(luceneIndexLock); indexer.setFullTextSearchIndexer(fullTextSearchIndexer); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.setMaxAtomicTransformationTime(getMaxTransformationTime()); return indexer; } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java index a98377f338..05a7526a56 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneIndexerImpl.java @@ -29,9 +29,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.Deque; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -130,7 +133,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp /** * A list of stuff that requires non atomic indexing */ - private ArrayList toFTSIndex = new ArrayList(); + private Map> toFTSIndex = Collections.emptyMap(); /** * Default construction @@ -427,11 +430,14 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp mainSearcher = new IndexSearcher(mainReader); deltaSearcher = new IndexSearcher(deltaReader); - for (Helper helper : toFTSIndex) + for (Map.Entry> entry : toFTSIndex.entrySet()) { - // Delete both the document and the supplementary FTSSTATUS document (if there is one) - deletions.add(helper.ref); - deletions.add(helper.id); + // Delete both the document and the supplementary FTSSTATUS documents (if there are any) + deletions.add(entry.getKey()); + for (Helper helper : entry.getValue()) + { + deletions.add(helper.id); + } } } @@ -570,7 +576,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp } } - public List createDocuments(final String stringNodeRef, final boolean isNew, final boolean indexAllProperties, final boolean includeDirectoryDocuments) + public List createDocuments(final String stringNodeRef, final FTSStatus ftsStatus, final boolean indexAllProperties, final boolean includeDirectoryDocuments) { if (tenantService.isEnabled() && ((AuthenticationUtil.getRunAsUser() == null) || (AuthenticationUtil.isRunAsUserTheSystemUser()))) { @@ -580,25 +586,36 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp { public List doWork() { - return createDocumentsImpl(stringNodeRef, isNew, indexAllProperties, includeDirectoryDocuments); + return createDocumentsImpl(stringNodeRef, ftsStatus, indexAllProperties, includeDirectoryDocuments); } }, tenantService.getDomainUser(AuthenticationUtil.getSystemUserName(), tenantService.getDomain(new NodeRef(stringNodeRef).getStoreRef().getIdentifier()))); } else { - return createDocumentsImpl(stringNodeRef, isNew, indexAllProperties, includeDirectoryDocuments); + return createDocumentsImpl(stringNodeRef, ftsStatus, indexAllProperties, includeDirectoryDocuments); } } - private List createDocumentsImpl(String stringNodeRef, boolean isNew, boolean indexAllProperties, boolean includeDirectoryDocuments) + private List createDocumentsImpl(String stringNodeRef, FTSStatus ftsStatus, boolean indexAllProperties, boolean includeDirectoryDocuments) { NodeRef nodeRef = new NodeRef(stringNodeRef); + NodeRef.Status nodeStatus = nodeService.getNodeStatus(nodeRef); // DH: Let me know if this field gets dropped (performance) + List docs = new LinkedList(); + if (nodeStatus == null) + { + throw new InvalidNodeRefException("Node does not exist: " + nodeRef, nodeRef); + } + else if (nodeStatus.isDeleted()) + { + // If we are being called in non FTS mode on a deleted node, we must still create a new FTS marker + // document, in case FTS is currently in progress and about to restore our node! + addFtsStatusDoc(docs, ftsStatus, nodeRef, nodeStatus); + return docs; + } Map nodeCounts = getNodeCounts(nodeRef); - List docs = new ArrayList(); ChildAssociationRef qNameRef = null; Map properties = nodeService.getProperties(nodeRef); - NodeRef.Status nodeStatus = nodeService.getNodeStatus(nodeRef); // DH: Let me know if this field gets dropped (performance) Collection directPaths = new LinkedHashSet(nodeService.getPaths(nodeRef, false)); Collection> categoryPaths = getCategoryPaths(nodeRef, properties); @@ -782,19 +799,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp // forget about it if FTS is already in progress for an earlier transaction! if (!isAtomic && !indexAllProperties) { - Document ftsStatus = new Document(); - ftsStatus.add(new Field("ID", GUID.generate(), Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO)); - ftsStatus.add(new Field("FTSREF", nodeRef.toString(), Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO)); - ftsStatus.add(new Field("TX", nodeStatus.getChangeTxnId(), Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO)); - if (isNew) - { - ftsStatus.add(new Field("FTSSTATUS", "New", Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); - } - else - { - ftsStatus.add(new Field("FTSSTATUS", "Dirty", Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); - } - docs.add(ftsStatus); + addFtsStatusDoc(docs, ftsStatus, nodeRef, nodeStatus); } // { @@ -805,6 +810,24 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp return docs; } + private void addFtsStatusDoc(List docs, FTSStatus ftsStatus, NodeRef nodeRef, + NodeRef.Status nodeStatus) + { + // If we are being called during FTS failover, then don't bother generating a new doc + if (ftsStatus == FTSStatus.Clean) + { + return; + } + Document doc = new Document(); + doc.add(new Field("ID", GUID.generate(), Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO)); + doc.add(new Field("FTSREF", nodeRef.toString(), Field.Store.YES, Field.Index.NO_NORMS, Field.TermVector.NO)); + doc + .add(new Field("TX", nodeStatus.getChangeTxnId(), Field.Store.YES, Field.Index.NO_NORMS, + Field.TermVector.NO)); + doc.add(new Field("FTSSTATUS", ftsStatus.name(), Field.Store.NO, Field.Index.NO_NORMS, Field.TermVector.NO)); + docs.add(doc); + } + private Serializable convertForMT(QName propertyName, Serializable inboundValue) { if (!tenantService.isEnabled()) @@ -1561,9 +1584,7 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp // } try { - NodeRef lastId = null; - - toFTSIndex = new ArrayList(size); + toFTSIndex = new LinkedHashMap>(size * 2); BooleanQuery booleanQuery = new BooleanQuery(); booleanQuery.add(new TermQuery(new Term("FTSSTATUS", "Dirty")), Occur.SHOULD); booleanQuery.add(new TermQuery(new Term("FTSSTATUS", "New")), Occur.SHOULD); @@ -1596,20 +1617,18 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp // For backward compatibility with existing indexes, cope with FTSSTATUS being stored directly on // the real document without an FTSREF Field ftsRef = doc.getField("FTSREF"); - Field id = doc.getField("ID"); - Helper helper; - if (ftsRef == null) + String id = doc.getField("ID").stringValue(); + String ref = ftsRef == null ? id : ftsRef.stringValue(); + Helper helper = new Helper(id, doc.getField("TX").stringValue()); + Deque helpers = toFTSIndex.get(ref); + if (helpers == null) { - // Old style - we only have a node ref - helper = new Helper(id.stringValue(), id.stringValue(), doc.getField("TX").stringValue()); + helpers = new LinkedList(); + toFTSIndex.put(ref, helpers); + count++; } - else - { - // New style - we have a unique FTS ID and a noderef - helper = new Helper(id.stringValue(), ftsRef.stringValue(), doc.getField("TX").stringValue()); - } - toFTSIndex.add(helper); - if (++count >= size) + helpers.add(helper); + if (count >= size) { break; } @@ -1640,24 +1659,24 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp try { writer = getDeltaWriter(); - for (Helper helper : toFTSIndex) + int done = 0; + for (Map.Entry> entry : toFTSIndex.entrySet()) { // Document document = helper.document; - NodeRef ref = new NodeRef(helper.ref); - // bypass nodes that have disappeared - if (!nodeService.exists(ref)) - { - continue; - } - - // bypass out of date transactions - NodeRef.Status nodeStatus = nodeService.getNodeStatus(ref); - if (nodeStatus == null || !helper.tx.equals(nodeStatus.getChangeTxnId())) - { - continue; - } + NodeRef ref = new NodeRef(entry.getKey()); + done += entry.getValue().size(); - List docs = createDocuments(ref.toString(), false, true, false); + List docs; + try + { + docs = readDocuments(ref.toString(), FTSStatus.Clean, true, false); + } + catch (Throwable t) + { + // Try to recover from failure + s_logger.error("FTS index of " + ref + " failed. Reindexing without FTS", t); + docs = readDocuments(ref.toString(), FTSStatus.Clean, false, false); + } for (Document doc : docs) { try @@ -1672,23 +1691,12 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp } } - // Need to do all the current id in the TX - should all - // be - // together so skip until id changes if (writer.docCount() > size) { - if (lastId == null) - { - lastId = ref; - } - if (!lastId.equals(ref)) - { - break; - } + break; } } - int done = writer.docCount(); remainingCount = count - done; return done; } @@ -1726,14 +1734,11 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp { String id; - String ref; - String tx; - Helper(String id, String ref, String tx) + Helper(String id, String tx) { this.id = id; - this.ref = ref; this.tx = tx; } } @@ -1747,7 +1752,6 @@ public class ADMLuceneIndexerImpl extends AbstractLuceneIndexerImpl imp protected void doPrepare() throws IOException { - saveDelta(); flushPending(); // prepareToMergeIntoMain(); } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java index 54858b2889..188ea2c239 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneTest.java @@ -3730,6 +3730,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.prepare(); indexer.commit(); @@ -3755,6 +3756,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); // //indexer.clearIndex(); @@ -3937,6 +3939,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); // indexer.clearIndex(); indexer.createNode(new ChildAssociationRef(null, null, null, rootNodeRef)); indexer.createNode(new ChildAssociationRef(ContentModel.ASSOC_CHILDREN, rootNodeRef, QName.createQName("{namespace}one"), n1)); @@ -6418,6 +6421,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.updateNode(rootNodeRef); indexer.updateNode(n1); @@ -6677,6 +6681,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); ChildAssociationRef car = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("{namespace}" + COMPLEX_LOCAL_NAME), testSuperType); indexer.createNode(car); @@ -6708,6 +6713,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); ChildAssociationRef car = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("{namespace}" + COMPLEX_LOCAL_NAME), testSuperType); indexer.createNode(car); @@ -6740,6 +6746,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); testTX = transactionService.getUserTransaction(); testTX.begin(); @@ -6957,6 +6964,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); nodeService.removeChild(n2, n13); indexer.deleteChildRelationship(new ChildAssociationRef(ASSOC_TYPE_QNAME, n2, QName.createQName("{namespace}link"), n13)); @@ -7209,6 +7217,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); nodeService.removeChild(n2, n13); nodeService.addChild(n2, n13, ASSOC_TYPE_QNAME, QName.createQName("{namespace}renamed_link")); @@ -7272,6 +7281,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.updateFullTextSearch(1000); indexer.prepare(); indexer.commit(); @@ -7341,6 +7351,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.updateFullTextSearch(1000); indexer.prepare(); indexer.commit(); @@ -7742,6 +7753,7 @@ public class ADMLuceneTest extends TestCase implements DictionaryListener indexer.setTenantService(tenantService); indexer.setFullTextSearchIndexer(luceneFTS); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); if (clear) { // indexer.clearIndex(); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneUnIndexedIndexAndSearcherFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneUnIndexedIndexAndSearcherFactory.java index 6a140ec32d..9d81fe9601 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneUnIndexedIndexAndSearcherFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/ADMLuceneUnIndexedIndexAndSearcherFactory.java @@ -33,6 +33,7 @@ public class ADMLuceneUnIndexedIndexAndSearcherFactory extends ADMLuceneIndexerA // indexer.setLuceneIndexLock(luceneIndexLock); indexer.setFullTextSearchIndexer(fullTextSearchIndexer); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.setMaxAtomicTransformationTime(getMaxTransformationTime()); return indexer; } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java index 519f50527e..3be202a280 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerAndSearcherFactory.java @@ -37,6 +37,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.transaction.TransactionService; /** * Factory for AVM indexers and searchers @@ -49,6 +50,8 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd private DictionaryService dictionaryService; private NamespaceService nameSpaceService; private ContentService contentService; + protected TransactionService transactionService; + private AVMService avmService; private AVMSyncService avmSyncService; private NodeService nodeService; @@ -85,6 +88,11 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd this.contentService = contentService; } + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + /** * Set the AVM service */ @@ -131,6 +139,7 @@ public class AVMLuceneIndexerAndSearcherFactory extends AbstractLuceneIndexerAnd AVMLuceneIndexerImpl indexer = AVMLuceneIndexerImpl.getUpdateIndexer(storeRef, deltaId, this); indexer.setDictionaryService(dictionaryService); indexer.setContentService(contentService); + indexer.setTransactionService(transactionService); indexer.setMaxAtomicTransformationTime(getMaxTransformationTime()); indexer.setAvmService(avmService); indexer.setAvmSyncService(avmSyncService); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java index 7cd3ad2627..231be2f170 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java @@ -431,7 +431,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl } @Override - protected List createDocuments(String stringNodeRef, boolean isNew, boolean indexAllProperties, boolean includeDirectoryDocuments) + protected List createDocuments(String stringNodeRef, FTSStatus ftsStatus, boolean indexAllProperties, boolean includeDirectoryDocuments) { List docs = new ArrayList(); if (stringNodeRef.startsWith("\u0000")) @@ -1233,14 +1233,13 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl protected void doPrepare() throws IOException { AuthenticationUtil.runAs(new RunAsWork() - { + { public String doWork() throws Exception - { - saveDelta(); + { flushPending(); return null; } - }, AuthenticationUtil.getSystemUserName()); + }, AuthenticationUtil.getSystemUserName()); } @Override diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneIndexerImpl.java index b99c2f0945..2af659a046 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/AbstractLuceneIndexerImpl.java @@ -33,7 +33,9 @@ import javax.transaction.xa.XAResource; import org.alfresco.repo.search.IndexerException; import org.alfresco.repo.search.impl.lucene.index.TransactionStatus; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.repository.InvalidNodeRefException; +import org.alfresco.service.transaction.TransactionService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.document.Document; @@ -41,6 +43,7 @@ import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; +import org.springframework.dao.ConcurrencyFailureException; /** * Common support for indexing across implementations @@ -93,9 +96,25 @@ public abstract class AbstractLuceneIndexerImpl extends AbstractLuceneBase protected enum IndexDeleteMode {REINDEX, DELETE, MOVE}; - protected long docs; + protected enum FTSStatus {New, Dirty, Clean}; - // Failure codes to index when problems occur indexing content + protected long docs; + + // An indexer with read through activated can only see already-committed documents in the database. Useful when + // reindexing lots of old documents and not wanting to pollute the caches with stale versions of nodes. + private boolean isReadThrough; + + protected TransactionService transactionService; + + public void setReadThrough(boolean isReadThrough) + { + this.isReadThrough = isReadThrough; + } + + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } protected static class Command { @@ -157,7 +176,6 @@ public abstract class AbstractLuceneIndexerImpl extends AbstractLuceneBase /** * Logger */ - @SuppressWarnings("unused") private static Log s_logger = LogFactory.getLog(AbstractLuceneIndexerImpl.class); protected static Set deletePrimary(Collection nodeRefs, IndexReader reader, boolean delete) @@ -611,9 +629,41 @@ public abstract class AbstractLuceneIndexerImpl extends AbstractLuceneBase protected abstract void doSetRollbackOnly() throws IOException; - protected abstract List createDocuments(String stringNodeRef, boolean isNew, boolean indexAllProperties, + protected abstract List createDocuments(String stringNodeRef, FTSStatus ftsStatus, boolean indexAllProperties, boolean includeDirectoryDocuments); + protected List readDocuments(final String stringNodeRef, final FTSStatus ftsStatus, + final boolean indexAllProperties, final boolean includeDirectoryDocuments) + { + if (isReadThrough) + { + return transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionCallback>() + { + @Override + public List execute() throws Throwable + { + try + { + return createDocuments(stringNodeRef, ftsStatus, indexAllProperties, + includeDirectoryDocuments); + } + catch (InvalidNodeRefException e) + { + // Turn InvalidNodeRefExceptions into retryable exceptions. + throw new ConcurrencyFailureException( + "Possible cache integrity issue during reindexing", e); + } + + } + }, true, true); + } + else + { + return createDocuments(stringNodeRef, ftsStatus, indexAllProperties, includeDirectoryDocuments); + } + } + protected Set deleteImpl(String nodeRef, IndexDeleteMode mode, boolean cascade, IndexReader mainReader) throws LuceneIndexException, IOException @@ -741,7 +791,7 @@ public abstract class AbstractLuceneIndexerImpl extends AbstractLuceneBase try { - List docs = createDocuments(nodeRef, isNew, false, true); + List docs = readDocuments(nodeRef, isNew ? FTSStatus.New : FTSStatus.Dirty, false, true); for (Document doc : docs) { try @@ -867,11 +917,18 @@ public abstract class AbstractLuceneIndexerImpl extends AbstractLuceneBase */ public void flushPending() throws LuceneIndexException { - // Make sure the in flush deletion list is clear at the start - deletionsSinceFlush.clear(); IndexReader mainReader = null; try { + saveDelta(); + + // Make sure the in flush deletion list is clear at the start + deletionsSinceFlush.clear(); + if (commandList.isEmpty()) + { + return; + } + mainReader = getReader(); Set forIndex = new LinkedHashSet(); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByStringId.java b/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByStringId.java index 118b648e4a..d92a5d93b6 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByStringId.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/FilterIndexReaderByStringId.java @@ -19,8 +19,9 @@ package org.alfresco.repo.search.impl.lucene; import java.io.IOException; -import java.util.BitSet; import java.util.Set; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import org.alfresco.error.AlfrescoRuntimeException; import org.apache.commons.logging.Log; @@ -49,9 +50,12 @@ public class FilterIndexReaderByStringId extends FilterIndexReader { private static Log s_logger = LogFactory.getLog(FilterIndexReaderByStringId.class); - OpenBitSet deletedDocuments; + private OpenBitSet deletedDocuments; + private final Set deletions; + private final boolean deleteNodesOnly; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private String id; + private final String id; /** * Apply the filter @@ -66,21 +70,44 @@ public class FilterIndexReaderByStringId extends FilterIndexReader super(reader); reader.incRef(); this.id = id; + this.deletions = deletions; + this.deleteNodesOnly = deleteNodesOnly; - deletedDocuments = new OpenBitSet(reader.maxDoc()); - if (s_logger.isDebugEnabled()) { s_logger.debug("Applying deletions FOR "+id +" (the index ito which these are applied is the previous one ...)"); } + } + + public OpenBitSet getDeletedDocuments() + { + lock.readLock().lock(); try { + if (deletedDocuments != null) + { + return deletedDocuments; + } + } + finally + { + lock.readLock().unlock(); + } + lock.writeLock().lock(); + try + { + if (deletedDocuments != null) + { + return deletedDocuments; + } + deletedDocuments = new OpenBitSet(in.maxDoc()); + if (!deleteNodesOnly) { for (String stringRef : deletions) { - TermDocs td = reader.termDocs(new Term("ID", stringRef)); + TermDocs td = in.termDocs(new Term("ID", stringRef)); while (td.next()) { deletedDocuments.set(td.doc()); @@ -91,7 +118,7 @@ public class FilterIndexReaderByStringId extends FilterIndexReader else { - Searcher searcher = new IndexSearcher(reader); + Searcher searcher = new IndexSearcher(in); for (String stringRef : deletions) { TermQuery query = new TermQuery(new Term("ID", stringRef)); @@ -112,12 +139,18 @@ public class FilterIndexReaderByStringId extends FilterIndexReader } // searcher does not need to be closed, the reader is live } + return deletedDocuments; } catch (IOException e) { - s_logger.error("Error initialising "+id); - throw new AlfrescoRuntimeException("Failed to construct filtering index reader", e); + s_logger.error("Error initialising "+id, e); + throw new AlfrescoRuntimeException("Failed to find deleted documents to filter", e); } + finally + { + lock.writeLock().unlock(); + } + } // Prevent from actually setting the closed flag @@ -133,10 +166,8 @@ public class FilterIndexReaderByStringId extends FilterIndexReader * @author andyh * */ - public static class FilterTermDocs implements TermDocs + public class FilterTermDocs implements TermDocs { - OpenBitSet deletedDocuments; - protected TermDocs in; String id; @@ -146,10 +177,9 @@ public class FilterIndexReaderByStringId extends FilterIndexReader * @param in * @param deletedDocuments */ - public FilterTermDocs(String id, TermDocs in, OpenBitSet deletedDocuments) + public FilterTermDocs(String id, TermDocs in) { this.in = in; - this.deletedDocuments = deletedDocuments; } public void seek(Term term) throws IOException @@ -180,15 +210,20 @@ public class FilterIndexReaderByStringId extends FilterIndexReader { try { - while (in.next()) - { - if (!deletedDocuments.get(in.doc())) + if (!in.next()) + { + return false; + } + OpenBitSet deletedDocuments = getDeletedDocuments(); + while (deletedDocuments.get(in.doc())) + { + if (!in.next()) { - // Not masked - return true; - } - } - return false; + return false; + } + } + // Not masked + return true; } catch(IOException ioe) { @@ -209,10 +244,17 @@ public class FilterIndexReaderByStringId extends FilterIndexReader return 0; } - if (allDeleted(innerDocs, count)) + OpenBitSet deletedDocuments = getDeletedDocuments(); + while (allDeleted(innerDocs, count, deletedDocuments)) { - // Did not find anything - try again - return read(docs, freqs); + + count = in.read(innerDocs, innerFreq); + + // Is the stream exhausted + if (count == 0) + { + return 0; + } } // Add non deleted @@ -231,7 +273,7 @@ public class FilterIndexReaderByStringId extends FilterIndexReader return insertPosition; } - private boolean allDeleted(int[] docs, int fillSize) + private boolean allDeleted(int[] docs, int fillSize, OpenBitSet deletedDocuments) { for (int i = 0; i < fillSize; i++) { @@ -250,6 +292,7 @@ public class FilterIndexReaderByStringId extends FilterIndexReader return false; } + OpenBitSet deletedDocuments = getDeletedDocuments(); while (deletedDocuments.get(in.doc())) { if (!in.next()) @@ -268,7 +311,7 @@ public class FilterIndexReaderByStringId extends FilterIndexReader } /** Base class for filtering {@link TermPositions} implementations. */ - public static class FilterTermPositions extends FilterTermDocs implements TermPositions + public class FilterTermPositions extends FilterTermDocs implements TermPositions { TermPositions tp; @@ -278,9 +321,9 @@ public class FilterIndexReaderByStringId extends FilterIndexReader * @param in * @param deletedDocuements */ - public FilterTermPositions(String id, TermPositions in, OpenBitSet deletedDocuements) + public FilterTermPositions(String id, TermPositions in) { - super(id, in, deletedDocuements); + super(id, in); tp = in; } @@ -308,18 +351,18 @@ public class FilterIndexReaderByStringId extends FilterIndexReader @Override public int numDocs() { - return super.numDocs() - (int)deletedDocuments.cardinality(); + return super.numDocs() - (int)getDeletedDocuments().cardinality(); } @Override public TermDocs termDocs() throws IOException { - return new FilterTermDocs(id, super.termDocs(), deletedDocuments); + return new FilterTermDocs(id, super.termDocs()); } @Override public TermPositions termPositions() throws IOException { - return new FilterTermPositions(id, super.termPositions(), deletedDocuments); + return new FilterTermPositions(id, super.termPositions()); } } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneResultSet.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneResultSet.java index 8c5bdcf257..9759c2ce0d 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneResultSet.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneResultSet.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.List; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.node.NodeBulkLoader; import org.alfresco.repo.search.AbstractResultSet; import org.alfresco.repo.search.ResultSetRowIterator; @@ -196,8 +197,15 @@ public class LuceneResultSet extends AbstractResultSet prefetch.set(next); Document doc = hits.doc(next); String nodeRefStr = doc.get("ID"); - NodeRef nodeRef = tenantService.getBaseName(new NodeRef(nodeRefStr)); - fetchList.add(nodeRef); + try + { + NodeRef nodeRef = tenantService.getBaseName(new NodeRef(nodeRefStr)); + fetchList.add(nodeRef); + } + catch (AlfrescoRuntimeException e) + { + // Ignore IDs that don't parse as NodeRefs, e.g. FTSREF docs + } } // Now bulk fetch if (fetchList.size() > 1) diff --git a/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java index 4b9f055b08..192fd2a71a 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java @@ -26,8 +26,9 @@ import org.alfresco.repo.search.BackgroundIndexerAware; import org.alfresco.repo.search.Indexer; import org.alfresco.repo.search.IndexerAndSearcher; import org.alfresco.repo.search.SupportsBackgroundIndexing; -import org.alfresco.repo.search.impl.lucene.index.IndexInfo; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.transaction.TransactionService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; @@ -51,6 +52,8 @@ public class FullTextSearchIndexerImpl implements FTSIndexerAware, FullTextSearc private static Set indexing = new HashSet(); private IndexerAndSearcher indexerAndSearcherFactory; + + private TransactionService transactionService; private int pauseCount = 0; @@ -201,30 +204,42 @@ public class FullTextSearchIndexerImpl implements FTSIndexerAware, FullTextSearc int done = 0; while (done == 0) { - StoreRef toIndex = getNextRef(); + final StoreRef toIndex = getNextRef(); if (toIndex != null) { if(s_logger.isDebugEnabled()) { s_logger.debug("FTS Indexing "+toIndex+" at "+(new java.util.Date())); } - Indexer indexer = indexerAndSearcherFactory.getIndexer(toIndex); - if(indexer instanceof BackgroundIndexerAware) + try { - BackgroundIndexerAware backgroundIndexerAware = (BackgroundIndexerAware)indexer; - backgroundIndexerAware.registerCallBack(this); - try - { - done += backgroundIndexerAware.updateFullTextSearch(batchSize); - } - catch (Exception ex) - { - if(s_logger.isWarnEnabled()) - { - s_logger.warn("FTS Job threw exception", ex); - } - done = 1; // better luck next time - } + done += transactionService.getRetryingTransactionHelper().doInTransaction( + new RetryingTransactionCallback() + { + @Override + public Integer execute() throws Throwable + { + Indexer indexer = indexerAndSearcherFactory.getIndexer(toIndex); + // Activate database 'read through' behaviour so that we don't end up with stale + // caches during this potentially long running transaction + indexer.setReadThrough(true); + if (indexer instanceof BackgroundIndexerAware) + { + BackgroundIndexerAware backgroundIndexerAware = (BackgroundIndexerAware) indexer; + backgroundIndexerAware.registerCallBack(FullTextSearchIndexerImpl.this); + return backgroundIndexerAware.updateFullTextSearch(batchSize); + } + return 0; + } + }); + } + catch (Exception ex) + { + if (s_logger.isWarnEnabled()) + { + s_logger.warn("FTS Job threw exception", ex); + } + done = 1; // better luck next time } } else @@ -277,6 +292,14 @@ public class FullTextSearchIndexerImpl implements FTSIndexerAware, FullTextSearc { this.indexerAndSearcherFactory = indexerAndSearcherFactory; } + + /** + * @param transactionService + */ + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } /** * @param args diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java index 0f01b93b9a..be4c6b18f9 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/index/IndexInfo.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 * @@ -348,6 +348,7 @@ public class IndexInfo implements IndexMonitor * Main index reader */ private IndexReader mainIndexReader; + private Map mainIndexReaders = new HashMap(); /** * Index writers for deltas @@ -505,6 +506,7 @@ public class IndexInfo implements IndexMonitor } } // Delete entries that are not required + invalidateMainReadersFromFirst(deletable); for (String id : deletable) { indexEntries.remove(id); @@ -845,7 +847,6 @@ public class IndexInfo implements IndexMonitor } entry.setStatus(TransactionStatus.COMMITTED); registerReferenceCountingIndexReader(entry.getName(), buildReferenceCountingIndexReader(entry.getName(), entry.getDocumentCount())); - mainIndexReader = null; break; // States that require no action case COMMITTED: @@ -857,6 +858,7 @@ public class IndexInfo implements IndexMonitor } } // Delete entries that are not required + invalidateMainReadersFromFirst(deletable); for (String id : deletable) { indexEntries.remove(id); @@ -1281,6 +1283,36 @@ public class IndexInfo implements IndexMonitor } } + private void invalidateMainReadersFromFirst(Set ids) throws IOException + { + boolean found = false; + for (String id : indexEntries.keySet()) + { + if (!found && ids.contains(id)) + { + found = true; + } + if (found) + { + IndexReader main = mainIndexReaders.remove(id); + if (main != null) + { + ((ReferenceCounting) main).setInvalidForReuse(); + } + } + } + + if (found) + { + if(mainIndexReader != null) + { + ((ReferenceCounting) mainIndexReader).setInvalidForReuse(); + mainIndexReader = null; + } + } + + } + /** * Get the main reader for committed index data * @@ -1300,6 +1332,10 @@ public class IndexInfo implements IndexMonitor getWriteLock(); try { + if (mainIndexReader != null) + { + ((ReferenceCounting)mainIndexReader).setInvalidForReuse(); + } mainIndexReader = null; } finally @@ -1397,6 +1433,10 @@ public class IndexInfo implements IndexMonitor getWriteLock(); try { + if (mainIndexReader != null) + { + ((ReferenceCounting)mainIndexReader).setInvalidForReuse(); + } mainIndexReader = null; } finally @@ -1738,6 +1778,7 @@ public class IndexInfo implements IndexMonitor reordered.put(entry.getName(), entry); reordered.put(current.getName(), current); addedPreparedEntry = true; + invalidateMainReadersFromFirst(Collections.singleton(current.getName())); } else if (current.getName().equals(entry.getName())) { @@ -1843,6 +1884,7 @@ public class IndexInfo implements IndexMonitor if (TransactionStatus.COMMITTED.follows(entry.getStatus())) { // Do the deletions + invalidateMainReadersFromFirst(Collections.singleton(id)); if ((entry.getDocumentCount() + entry.getDeletions()) == 0) { registerReferenceCountingIndexReader(id, tl.get()); @@ -2004,6 +2046,7 @@ public class IndexInfo implements IndexMonitor if (TransactionStatus.DELETABLE.follows(entry.getStatus())) { + invalidateMainReadersFromFirst(Collections.singleton(id)); indexEntries.remove(id); writeStatus(); clearOldReaders(); @@ -2147,7 +2190,7 @@ public class IndexInfo implements IndexMonitor clearInvalid(inValid); } - private void clearInvalid(HashSet inValid) throws IOException + private void clearInvalid(Set inValid) throws IOException { boolean hasInvalid = false; for (String id : inValid) @@ -2157,13 +2200,24 @@ public class IndexInfo implements IndexMonitor { s_logger.debug("... invalidating sub reader " + id); } - ReferenceCounting referenceCounting = (ReferenceCounting) reader; - referenceCounting.setInvalidForReuse(); - deletableReaders.add(reader); - hasInvalid = true; + if (reader != null) + { + ReferenceCounting referenceCounting = (ReferenceCounting) reader; + referenceCounting.setInvalidForReuse(); + deletableReaders.add(reader); + hasInvalid = true; + } } if (hasInvalid) { + for (String id : inValid) + { + IndexReader main = mainIndexReaders.remove(id); + if (main != null) + { + ((ReferenceCounting) main).setInvalidForReuse(); + } + } if (mainIndexReader != null) { if (s_logger.isDebugEnabled()) @@ -2179,6 +2233,7 @@ public class IndexInfo implements IndexMonitor private IndexReader createMainIndexReader() throws IOException { IndexReader reader = null; + IndexReader oldReader = null; for (String id : indexEntries.keySet()) { IndexEntry entry = indexEntries.get(id); @@ -2188,33 +2243,35 @@ public class IndexInfo implements IndexMonitor if (reader == null) { reader = subReader; - reader.incRef(); } else { - if (entry.getType() == IndexType.INDEX) + boolean oldReaderIsSubReader = oldReader == null; + oldReader = reader; + reader = mainIndexReaders.get(id); + if (reader == null) { - IndexReader oldReader = reader; - reader = new MultiReader(new IndexReader[] { oldReader, subReader }, false); - // Cancel out the incRef on the old reader - oldReader.decRef(); - } - else if (entry.getType() == IndexType.DELTA) - { - try + if (entry.getType() == IndexType.INDEX) { - IndexReader oldReader = reader; - IndexReader filterReader = new FilterIndexReaderByStringId(id, oldReader, getDeletions(entry.getName()), entry.isDeletOnlyNodes()); - reader = new MultiReader(new IndexReader[] { filterReader, subReader }, false); - // Cancel out the incRef on the old readers - oldReader.decRef(); - filterReader.decRef(); + reader = new MultiReader(new IndexReader[] { oldReader, subReader }, false); } - catch (IOException ioe) + else if (entry.getType() == IndexType.DELTA) { - s_logger.error("Failed building filter reader beneath " + entry.getName(), ioe); - throw ioe; + try + { + IndexReader filterReader = new FilterIndexReaderByStringId(id, oldReader, getDeletions(entry.getName()), entry.isDeletOnlyNodes()); + reader = new MultiReader(new IndexReader[] { filterReader, subReader }, false); + // Cancel out the incRef on the filter reader + filterReader.decRef(); + } + catch (IOException ioe) + { + s_logger.error("Failed building filter reader beneath " + entry.getName(), ioe); + throw ioe; + } } + reader = ReferenceCountingReadOnlyIndexReaderFactory.createReader(id+"multi", reader, true, config); + mainIndexReaders.put(id, reader); } } } @@ -2223,6 +2280,12 @@ public class IndexInfo implements IndexMonitor { reader = IndexReader.open(emptyIndex); } + else + { + // Keep this reader open whilst it is referenced by mainIndexReaders / referenceCountingReadOnlyIndexReaders + reader.incRef(); + } + reader = ReferenceCountingReadOnlyIndexReaderFactory.createReader(MAIN_READER, reader, false, config); return reader; } @@ -2237,8 +2300,9 @@ public class IndexInfo implements IndexMonitor return reader; } - private void registerReferenceCountingIndexReader(String id, IndexReader reader) + private void registerReferenceCountingIndexReader(String id, IndexReader reader) throws IOException { + clearInvalid(Collections.singleton(id)); ReferenceCounting referenceCounting = (ReferenceCounting) reader; if (!referenceCounting.getId().equals(id)) { @@ -3160,6 +3224,14 @@ public class IndexInfo implements IndexMonitor deleteQueue.add(refCounting.getId()); i.remove(); } + else if (s_logger.isTraceEnabled() && refCounting.getCreationTime() < System.currentTimeMillis() - 120000) + { + for (Throwable t : refCounting.getReferences()) + { + s_logger.trace(t.getMessage(), t); + } + } + } Iterator j = deleteQueue.iterator(); @@ -3641,6 +3713,7 @@ public class IndexInfo implements IndexMonitor } // Delete entries that are not required + invalidateMainReadersFromFirst(deletable); for (String id : deletable) { indexEntries.remove(id); @@ -3767,96 +3840,100 @@ public class IndexInfo implements IndexMonitor } // Build readers - final HashSet invalidIndexes = new HashSet(); + int size = 2 * (toDelete.size() + indexes.size()); + final HashSet invalidIndexes = new HashSet(size); - final HashMap newIndexCounts = new HashMap(); - - LinkedHashMap readers = new LinkedHashMap(); - for (IndexEntry entry : indexes.values()) - { - File location = new File(indexDirectory, entry.getName()).getCanonicalFile(); - IndexReader reader; - if (IndexReader.indexExists(location)) - { - reader = IndexReader.open(location); - } - else - { - reader = IndexReader.open(emptyIndex); - } - readers.put(entry.getName(), reader); - } + final HashMap newIndexCounts = new HashMap(size); + LinkedHashMap readers = new LinkedHashMap(size); for (IndexEntry currentDelete : toDelete.values()) { Set deletions = getDeletions(currentDelete.getName()); - for (String key : readers.keySet()) + if (!deletions.isEmpty()) { - IndexReader reader = readers.get(key); - for (String stringRef : deletions) + for (String key : indexes.keySet()) { - if (currentDelete.isDeletOnlyNodes()) + IndexReader reader = getReferenceCountingIndexReader(key); + Searcher searcher = new IndexSearcher(reader); + try { - Searcher searcher = new IndexSearcher(reader); - - TermQuery query = new TermQuery(new Term("ID", stringRef)); - Hits hits = searcher.search(query); - if (hits.length() > 0) + for (String stringRef : deletions) { - for (int i = 0; i < hits.length(); i++) + TermQuery query = new TermQuery(new Term("ID", stringRef)); + Hits hits = searcher.search(query); + if (hits.length() > 0) { - Document doc = hits.doc(i); - if (doc.getField("ISCONTAINER") == null) + IndexReader writeableReader = readers.get(key); + if (writeableReader == null) { - reader.deleteDocument(hits.id(i)); - invalidIndexes.add(key); - // There should only be one thing to - // delete - // break; + File location = new File(indexDirectory, key).getCanonicalFile(); + if (IndexReader.indexExists(location)) + { + writeableReader = IndexReader.open(location); + } + else + { + continue; + } + readers.put(key, writeableReader); + } + + if (currentDelete.isDeletOnlyNodes()) + { + Searcher writeableSearcher = new IndexSearcher(writeableReader); + hits = writeableSearcher.search(query); + if (hits.length() > 0) + { + for (int i = 0; i < hits.length(); i++) + { + Document doc = hits.doc(i); + if (doc.getField("ISCONTAINER") == null) + { + writeableReader.deleteDocument(hits.id(i)); + invalidIndexes.add(key); + // There should only be one thing to + // delete + // break; + } + } + } + writeableSearcher.close(); + } + else + { + int deletedCount = 0; + try + { + deletedCount = writeableReader.deleteDocuments(new Term("ID", stringRef)); + } + catch (IOException ioe) + { + if (s_logger.isDebugEnabled()) + { + s_logger.debug("IO Error for " + key); + throw ioe; + } + } + if (deletedCount > 0) + { + if (s_logger.isDebugEnabled()) + { + s_logger.debug("Deleted " + deletedCount + " from " + key + " for id " + stringRef + " remaining docs " + writeableReader.numDocs()); + } + invalidIndexes.add(key); + } } } } - searcher.close(); - } - else + finally { - int deletedCount = 0; - try - { - deletedCount = reader.deleteDocuments(new Term("ID", stringRef)); - } - catch (IOException ioe) - { - if (s_logger.isDebugEnabled()) - { - s_logger.debug("IO Error for " + key); - throw ioe; - } - } - if (deletedCount > 0) - { - if (s_logger.isDebugEnabled()) - { - s_logger.debug("Deleted " + deletedCount + " from " + key + " for id " + stringRef + " remaining docs " + reader.numDocs()); - } - invalidIndexes.add(key); - } - } + searcher.close(); + } } - } - File location = new File(indexDirectory, currentDelete.getName()).getCanonicalFile(); - IndexReader reader; - if (IndexReader.indexExists(location)) - { - reader = IndexReader.open(location); - } - else - { - reader = IndexReader.open(emptyIndex); - } - readers.put(currentDelete.getName(), reader); + // The delta we have just processed now must be included when we process the deletions of its successor + indexes.put(currentDelete.getName(), currentDelete); } // Close all readers holding the write lock - so no one tries to @@ -3929,25 +4006,10 @@ public class IndexInfo implements IndexMonitor IndexReader newReader = newReaders.get(id); registerReferenceCountingIndexReader(id, newReader); } - if (invalidIndexes.size() > 0) - { - if (mainIndexReader != null) - { - if (s_logger.isDebugEnabled()) - { - s_logger.debug("... invalidating main index reader after applying deletions"); - } - ((ReferenceCounting) mainIndexReader).setInvalidForReuse(); - } - else - { - if (s_logger.isDebugEnabled()) - { - s_logger.debug("... no main index reader to invalidate after applying deletions"); - } - } - mainIndexReader = null; - } + + // Invalidate all main index readers from the first invalid index onwards + invalidateMainReadersFromFirst(invalidIndexes); + if (s_logger.isDebugEnabled()) { @@ -4047,6 +4109,7 @@ public class IndexInfo implements IndexMonitor set.put(guid, target); // rebuild merged index elements LinkedHashMap reordered = new LinkedHashMap(); + invalidateMainReadersFromFirst(Collections.singleton(firstMergeId)); for (IndexEntry current : indexEntries.values()) { if (current.getName().equals(firstMergeId)) @@ -4215,6 +4278,7 @@ public class IndexInfo implements IndexMonitor } } + invalidateMainReadersFromFirst(toDelete); for (String id : toDelete) { indexEntries.remove(id); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCounting.java b/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCounting.java index 963a09c7fb..4f50a81033 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCounting.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCounting.java @@ -19,6 +19,7 @@ package org.alfresco.repo.search.impl.lucene.index; import java.io.IOException; +import java.util.List; /** * Reference counting and caching for read only index access. @@ -31,6 +32,10 @@ import java.io.IOException; */ public interface ReferenceCounting { + public long getCreationTime(); + + public List getReferences(); + /** * Get the number of references * @return diff --git a/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCountingReadOnlyIndexReaderFactory.java b/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCountingReadOnlyIndexReaderFactory.java index b55289480c..5200c98c45 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCountingReadOnlyIndexReaderFactory.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/index/ReferenceCountingReadOnlyIndexReaderFactory.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Timer; import java.util.WeakHashMap; @@ -124,6 +125,9 @@ public class ReferenceCountingReadOnlyIndexReaderFactory private LuceneConfig config; + private final long creationTime; + private final List references; + static { Class c = IndexReader.class; @@ -146,6 +150,9 @@ public class ReferenceCountingReadOnlyIndexReaderFactory ReferenceCountingReadOnlyIndexReader(String id, IndexReader indexReader, boolean enableCaching, LuceneConfig config) { super(indexReader); + this.creationTime = System.currentTimeMillis(); + this.references = new LinkedList(); + references.add(new Exception(this.refCount + ": " + indexReader.toString())); this.id = id; if (enableCaching && (config != null)) { @@ -154,6 +161,18 @@ public class ReferenceCountingReadOnlyIndexReaderFactory this.config = config; } + @Override + public synchronized long getCreationTime() + { + return this.creationTime; + } + + @Override + public synchronized List getReferences() + { + return this.references; + } + @Override public synchronized void incRef() { @@ -184,6 +203,7 @@ public class ReferenceCountingReadOnlyIndexReaderFactory throw new AlfrescoRuntimeException("Failed to mark index as open ..", e); } } + references.add(new Exception(this.refCount + ": " + in.toString())); } private synchronized void decrementReferenceCount() throws IOException @@ -198,6 +218,7 @@ public class ReferenceCountingReadOnlyIndexReaderFactory { s_logger.error("Invalid reference count for Reader " + id + " is " + refCount + " ... " + super.toString()); } + references.add(new Exception(this.refCount + ": " + in.toString())); } private void closeIfRequired() throws IOException @@ -274,6 +295,15 @@ public class ReferenceCountingReadOnlyIndexReaderFactory super.decRef(); } } + + /** + * We want to avoid setting the closed flag on our wrapped stream, passing on all decrefs. + **/ + @Override + protected void doClose() throws IOException + { + in.decRef(); + } @Override protected void doDelete(int n) throws IOException diff --git a/source/java/org/alfresco/repo/security/SecurityTestSuite.java b/source/java/org/alfresco/repo/security/SecurityTestSuite.java index 55474eee8b..f1b2c1f155 100644 --- a/source/java/org/alfresco/repo/security/SecurityTestSuite.java +++ b/source/java/org/alfresco/repo/security/SecurityTestSuite.java @@ -22,7 +22,6 @@ import junit.framework.JUnit4TestAdapter; import junit.framework.Test; import junit.framework.TestSuite; -import org.alfresco.repo.audit.access.AccessAuditorTest; import org.alfresco.repo.ownable.impl.OwnableServiceTest; import org.alfresco.repo.security.authentication.AuthenticationBootstrapTest; import org.alfresco.repo.security.authentication.AuthenticationTest; diff --git a/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider.java b/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider.java index d4793860e2..100913d3b5 100644 --- a/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider.java +++ b/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider.java @@ -48,7 +48,7 @@ public abstract class AbstractHomeFolderProvider implements HomeFolderProvider, /** * The home folder manager */ - private HomeFolderManager homeFolderManager; + private PortableHomeFolderManager homeFolderManager; /** * The store ref in which to conduct searches @@ -97,7 +97,7 @@ public abstract class AbstractHomeFolderProvider implements HomeFolderProvider, /** * Get the home folder manager. */ - protected HomeFolderManager getHomeFolderManager() + protected PortableHomeFolderManager getHomeFolderManager() { return homeFolderManager; } @@ -106,7 +106,7 @@ public abstract class AbstractHomeFolderProvider implements HomeFolderProvider, * Set the home folder manager. * @param homeFolderManager */ - public void setHomeFolderManager(HomeFolderManager homeFolderManager) + public void setHomeFolderManager(PortableHomeFolderManager homeFolderManager) { this.homeFolderManager = homeFolderManager; } diff --git a/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider2.java b/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider2.java index 09c458c7a8..e78cccc1c1 100644 --- a/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider2.java +++ b/source/java/org/alfresco/repo/security/person/AbstractHomeFolderProvider2.java @@ -27,7 +27,7 @@ import org.springframework.beans.factory.InitializingBean; /** * Abstract class that implements {@link HomeFolderProvider2} which - * works with the {@link HomeFolderManager} (which performs most of + * works with the {@link PortableHomeFolderManager} (which performs most of * the work) to create home folders in custom locations. * * @author Alan Davis @@ -43,7 +43,7 @@ public abstract class AbstractHomeFolderProvider2 implements /** * The home folder manager */ - private HomeFolderManager homeFolderManager; + private PortableHomeFolderManager homeFolderManager; /** * The store URL. @@ -83,7 +83,7 @@ public abstract class AbstractHomeFolderProvider2 implements /** * Get the home folder manager. */ - protected HomeFolderManager getHomeFolderManager() + protected PortableHomeFolderManager getHomeFolderManager() { return homeFolderManager; } @@ -92,7 +92,7 @@ public abstract class AbstractHomeFolderProvider2 implements * Set the home folder manager. * @param homeFolderManager */ - public void setHomeFolderManager(HomeFolderManager homeFolderManager) + public void setHomeFolderManager(PortableHomeFolderManager homeFolderManager) { this.homeFolderManager = homeFolderManager; } diff --git a/source/java/org/alfresco/repo/security/person/HomeFolderManager.java b/source/java/org/alfresco/repo/security/person/HomeFolderManager.java index 1dc7da544f..eef5c2632c 100644 --- a/source/java/org/alfresco/repo/security/person/HomeFolderManager.java +++ b/source/java/org/alfresco/repo/security/person/HomeFolderManager.java @@ -18,480 +18,19 @@ */ package org.alfresco.repo.security.person; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.alfresco.model.ContentModel; -import org.alfresco.repo.node.NodeServicePolicies; -import org.alfresco.repo.policy.JavaBehaviour; -import org.alfresco.repo.policy.PolicyComponent; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.tenant.TenantService; -import org.alfresco.service.ServiceRegistry; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileFolderUtil; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; /** - * Manage home folder creation by binding to events from the cm:person type. - * - * @author Andy Hind, - * Alan Davis (support v1 and v2 HomeFolderProviders - code from - * v1 HomeFolderProviders moved into HomeFolderManager). + * An object responsible for creating / validating the home folder for a given person node child association reference. */ -public class HomeFolderManager implements NodeServicePolicies.OnCreateNodePolicy +public interface HomeFolderManager { - private PolicyComponent policyComponent; - - private NodeService nodeService; - - private boolean enableHomeFolderCreationAsPeopleAreCreated = false; - - private ServiceRegistry serviceRegistry; - - private TenantService tenantService; - /** - * A default provider - */ - private HomeFolderProvider2 defaultProvider; - - /** - * Original Providers (now depreciated) that have registered and are looked up by bean name. - */ - @SuppressWarnings("deprecation") - private Map v1Providers = new HashMap(); - - /** - * Providers that have registered and are looked up by bean name. - */ - private Map v2Providers = new HashMap(); - - /** - * Cache the result of the path look up. - */ - private Map> rootPathNodeRefMaps = - new ConcurrentHashMap>(); - - /** - * Bind the class behaviour to this implementation - */ - public void init() throws Exception - { - if (enableHomeFolderCreationAsPeopleAreCreated) - { - policyComponent.bindClassBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"), ContentModel.TYPE_PERSON, new JavaBehaviour(this, "onCreateNode")); - } - } - - public void setEnableHomeFolderCreationAsPeopleAreCreated(boolean enableHomeFolderCreationAsPeopleAreCreated) - { - this.enableHomeFolderCreationAsPeopleAreCreated = enableHomeFolderCreationAsPeopleAreCreated; - } - - /** - * Set the policy component. + * Create / move the home folder if required. * - * @param policyComponent + * @param childAssocRef + * the primary child association pointing to the person node. */ - public void setPolicyComponent(PolicyComponent policyComponent) - { - this.policyComponent = policyComponent; - } + public void makeHomeFolder(ChildAssociationRef childAssocRef); - /** - * Set the node service. - * @param nodeService - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - /** - * Set the service registry. - */ - public void setServiceRegistry(ServiceRegistry serviceRegistry) - { - this.serviceRegistry = serviceRegistry; - } - - /** - * Set the tenant service - */ - public void setTenantService(TenantService tenantService) - { - this.tenantService = tenantService; - } - - /** - * Register a home folder provider. - * - * @param provider - */ - @SuppressWarnings("deprecation") - public void addProvider(HomeFolderProvider provider) - { - v1Providers.put(provider.getName(), provider); - } - - /** - * Register a home folder provider. - * - * @param provider - */ - public void addProvider(HomeFolderProvider2 provider) - { - v2Providers.put(provider.getName(), provider); - } - - /** - * Returns the version 1 HomeFolderProvider with the given name. - */ - @SuppressWarnings("deprecation") - public HomeFolderProvider getHomeFolderProvider1(String providerName) - { - return v1Providers.get(providerName); - } - - /** - * Returns the version 2 HomeFolderProvider2 with the given name. - */ - public HomeFolderProvider2 getHomeFolderProvider2(String providerName) - { - return v2Providers.get(providerName); - } - - /** - * Set the default home folder provider (user which none is specified or when one is not found) - * @param defaultProvider - */ - public void setDefaultProvider(HomeFolderProvider2 defaultProvider) - { - this.defaultProvider = defaultProvider; - } - - /** - * Find the provider and call if eager home folder creation is enabled. - */ - public void onCreateNode(ChildAssociationRef childAssocRef) - { - if (enableHomeFolderCreationAsPeopleAreCreated) - { - makeHomeFolder(childAssocRef); - } - } - - /** - * Find the provider and call. - */ - @SuppressWarnings("deprecation") - public void makeHomeFolder(ChildAssociationRef childAssocRef) - { - HomeFolderProvider2 v2Provider = defaultProvider; - HomeFolderProvider v1Provider = null; - String providerName = DefaultTypeConverter.INSTANCE.convert( - String.class, nodeService.getProperty(childAssocRef - .getChildRef(), ContentModel.PROP_HOME_FOLDER_PROVIDER)); - if (providerName != null) - { - v2Provider = getHomeFolderProvider2(providerName); - if (v2Provider == null) - { - v1Provider = getHomeFolderProvider1(providerName); - if (v1Provider == null) - { - v2Provider = defaultProvider; - } - } - } - else - { - providerName = defaultProvider.getName(); - nodeService.setProperty(childAssocRef.getChildRef(), - ContentModel.PROP_HOME_FOLDER_PROVIDER, providerName); - } - if (v2Provider != null) - { - // If a V2Adaptor we still must call onCreateNode just like a - // v1 HomeFolderProvider in case it has been overridden - if (v2Provider instanceof AbstractHomeFolderProvider.V2Adaptor) - { - ((AbstractHomeFolderProvider.V2Adaptor)v2Provider).onCreateNode(childAssocRef); - } - else - { - homeFolderCreateAndSetPermissions(v2Provider, childAssocRef.getChildRef()); - } - } - else if (v1Provider != null) - { - v1Provider.onCreateNode(childAssocRef); - } - } - - void homeFolderCreateAndSetPermissions(HomeFolderProvider2 provider, NodeRef personNodeRef) - { - AuthenticationUtil.RunAsWork action = - new RunAsCreateAndSetPermissions(provider, personNodeRef); - AuthenticationUtil.runAs(action, AuthenticationUtil.getSystemUserName()); - } - - /** - * Helper class to encapsulate the creation and setting permissions etc - */ - private class RunAsCreateAndSetPermissions implements AuthenticationUtil.RunAsWork - { - NodeRef personNodeRef; - HomeFolderProvider2 provider; - - RunAsCreateAndSetPermissions(HomeFolderProvider2 provider, NodeRef personNodeRef) - { - this.personNodeRef = personNodeRef; - this.provider = provider; - } - - public NodeRef doWork() throws Exception - { - // Get home folder - HomeSpaceNodeRef homeFolder = provider.getHomeFolder(personNodeRef); - - // If it exists - if (homeFolder.getNodeRef() != null) - { - // Get uid and keep - String uid = DefaultTypeConverter.INSTANCE.convert(String.class, - serviceRegistry.getNodeService().getProperty( - personNodeRef, ContentModel.PROP_USERNAME)); - - // If created or found then set (other wise it was already set correctly) - if (homeFolder.getStatus() != HomeSpaceNodeRef.Status.VALID) - { - serviceRegistry.getNodeService().setProperty( - personNodeRef, ContentModel.PROP_HOMEFOLDER, homeFolder.getNodeRef()); - } - - final String providerSuppliedOwner = provider.getOwner(); - String owner = (providerSuppliedOwner == null) ? uid : providerSuppliedOwner; - // If created.. - if (homeFolder.getStatus() == HomeSpaceNodeRef.Status.CREATED) - { - PermissionsManager onCreatePermissionsManager = - provider.getOnCreatePermissionsManager(); - if (onCreatePermissionsManager != null) - { - onCreatePermissionsManager.setPermissions( - homeFolder.getNodeRef(), owner, uid); - } - } - else - { - PermissionsManager onReferencePermissionsManager = - provider.getOnReferencePermissionsManager(); - if (onReferencePermissionsManager != null) - { - onReferencePermissionsManager.setPermissions( - homeFolder.getNodeRef(), owner, uid); - } - } - } - return homeFolder.getNodeRef(); - } - } - - private StoreRef getStoreRef(HomeFolderProvider2 provider) - { - // Could check to see if provider is a V2Adaptor to avoid - // object creation, but there is little point. - return new StoreRef(provider.getStoreUrl()); - } - - /** - * Helper method for {@link HomeFolderProvider2.getHomeFolder} (so that it - * does not need its own NodeService) that returns a person property value. - */ - public String getPersonProperty(NodeRef person, QName name) - { - String value = DefaultTypeConverter.INSTANCE.convert(String.class, nodeService.getProperty(person, name)); - - if(value == null || value.length() == 0) - { - throw new PersonException("Can not create a home folder when the "+name+" property is null or empty"); - } - return value; - } - - void clearCaches(HomeFolderProvider2 provider) - { - getRootPathNodeRefMap(provider).clear(); - } - - NodeRef getRootPathNodeRef(HomeFolderProvider2 provider) - { - String rootPath = provider.getRootPath(); - String tenantDomain = (tenantService != null ? tenantService.getCurrentUserDomain() : TenantService.DEFAULT_DOMAIN); - Map rootPathNodeRefMap = getRootPathNodeRefMap(provider); - NodeRef rootPathNodeRef = rootPathNodeRefMap.get(tenantDomain); - if (rootPathNodeRef == null) - { - // ok with race condition for initial construction - rootPathNodeRef = resolvePath(provider, rootPath); - rootPathNodeRefMap.put(tenantDomain, rootPathNodeRef); - } - return rootPathNodeRef; - } - - private Map getRootPathNodeRefMap(HomeFolderProvider2 provider) - { - String name = provider.getName(); - Map rootPathNodeRefMap = rootPathNodeRefMaps.get(name); - if (rootPathNodeRefMap == null) - { - // ok with race condition for initial construction - rootPathNodeRefMap = new ConcurrentHashMap(); - rootPathNodeRefMaps.put(name, rootPathNodeRefMap); - } - return rootPathNodeRefMap; - } - - /** - * Utility method to resolve paths to nodes. - */ - NodeRef resolvePath(HomeFolderProvider2 provider, String pathToResolve) - { - List refs = serviceRegistry.getSearchService().selectNodes( - serviceRegistry.getNodeService().getRootNode(getStoreRef(provider)), - pathToResolve, null, - serviceRegistry.getNamespaceService(), false); - if (refs.size() != 1) - { - throw new IllegalStateException("Non-unique path: found : " + - pathToResolve + " " + refs.size()); - } - return refs.get(0); - } - - /** - * Helper method for {@link HomeFolderProvider2.getHomeFolder(NodeRef)} - * implementations to return a {@link HomeSpaceNodeRef} - * @param referenceRootNode indicates that a reference to the root node - * should be returned if the home folder property on the person - * has not yet been set. - */ - public HomeSpaceNodeRef getHomeFolder(HomeFolderProvider2 provider, NodeRef person, boolean referenceRootNode) - { - HomeSpaceNodeRef homeSpaceNodeRef = null; - NodeRef existingHomeFolder = DefaultTypeConverter.INSTANCE.convert( - NodeRef.class, serviceRegistry.getNodeService().getProperty( - person, ContentModel.PROP_HOMEFOLDER)); - if (existingHomeFolder != null) - { - homeSpaceNodeRef = new HomeSpaceNodeRef(existingHomeFolder, - HomeSpaceNodeRef.Status.VALID); - } - else if (referenceRootNode) - { - homeSpaceNodeRef = new HomeSpaceNodeRef(getRootPathNodeRef(provider), - HomeSpaceNodeRef.Status.REFERENCED); - } - else - { - FileFolderService fileFolderService = serviceRegistry.getFileFolderService(); - List homeFolderPath = provider.getHomeFolderPath(person); - - FileInfo fileInfo; - - // Test if it already exists - NodeRef existing = getExisting(provider, fileFolderService, homeFolderPath); - if (existing != null) - { - fileInfo = fileFolderService.getFileInfo(existing); - } - else - { - fileInfo = createTree(provider, getRootPathNodeRef(provider), homeFolderPath, - provider.getTemplateNodeRef(), fileFolderService); - } - NodeRef homeFolderNodeRef = fileInfo.getNodeRef(); - return new HomeSpaceNodeRef(homeFolderNodeRef, HomeSpaceNodeRef.Status.CREATED); - } - return homeSpaceNodeRef; - } - - private NodeRef getExisting(HomeFolderProvider2 provider, FileFolderService fileFolderService, - List homeFolderPath) - { - NodeRef existing; - try - { - FileInfo existingFileInfo = fileFolderService.resolveNamePath(getRootPathNodeRef(provider), homeFolderPath); - existing = existingFileInfo.getNodeRef(); - } - catch (FileNotFoundException fnfe) - { - existing = null;// home folder noderef doesn't exist yet - } - return existing; - } - - /** - * creates a tree of folder nodes based on the path elements provided. - */ - private FileInfo createTree(HomeFolderProvider2 provider, NodeRef root, - List homeFolderPath, NodeRef templateNodeRef, - FileFolderService fileFolderService) - { - NodeRef newParent = createNewParentIfRequired(root, homeFolderPath, fileFolderService); - String homeFolderName = homeFolderPath.get(homeFolderPath.size()-1); - FileInfo fileInfo; - if (templateNodeRef == null) - { - fileInfo = fileFolderService.create( - newParent, - homeFolderName, - ContentModel.TYPE_FOLDER); - } - else - { - try - { - fileInfo = fileFolderService.copy( - templateNodeRef, - newParent, - homeFolderName); - } - catch (FileNotFoundException e) - { - throw new PersonException("Invalid template to create home space"); - } - } - return fileInfo; - } - - private NodeRef createNewParentIfRequired(NodeRef root, - List homeFolderPath, FileFolderService fileFolderService) - { - if (homeFolderPath.size() > 1) - { - List parentPath = new ArrayList(homeFolderPath); - parentPath.remove(parentPath.size()-1); - return FileFolderUtil.makeFolders(fileFolderService, root, - parentPath, ContentModel.TYPE_FOLDER).getNodeRef(); - } - else - { - return root; - } - } -} +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/security/person/HomeFolderProvider2.java b/source/java/org/alfresco/repo/security/person/HomeFolderProvider2.java index 36900ccf3d..d31981ca48 100644 --- a/source/java/org/alfresco/repo/security/person/HomeFolderProvider2.java +++ b/source/java/org/alfresco/repo/security/person/HomeFolderProvider2.java @@ -24,7 +24,7 @@ import org.alfresco.service.cmr.repository.NodeRef; /** * Interface for home folder providers. Instances work with the - * {@link HomeFolderManager} (which performs most of the work) + * {@link PortableHomeFolderManager} (which performs most of the work) * to allow it to create home folders in custom locations. * * The home folder may be a simple structure where all users share a root folder (See @@ -94,8 +94,8 @@ public interface HomeFolderProvider2 PermissionsManager getOnReferencePermissionsManager(); /** - * Callback from {@link HomeFolderManager} to locate or create a home folder. - * Implementations normally call {@link HomeFolderManager.getHomeFolder}. + * Callback from {@link PortableHomeFolderManager} to locate or create a home folder. + * Implementations normally call {@link PortableHomeFolderManager.getHomeFolder}. */ HomeSpaceNodeRef getHomeFolder(NodeRef person); } diff --git a/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizer.java b/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizer.java index 9d7dfd6e07..c5cff08223 100644 --- a/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizer.java +++ b/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizer.java @@ -26,7 +26,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.Set; import org.alfresco.model.ContentModel; @@ -102,30 +101,28 @@ public class HomeFolderProviderSynchronizer extends AbstractLifecycleBean { private static final Log logger = LogFactory.getLog(HomeFolderProviderSynchronizer.class); - private static final String ENABLED_PROPERTY_NAME = "home_folder_provider_synchronizer.enabled"; - private static final String OVERRIDE_PROPERTY_NAME = "home_folder_provider_synchronizer.override_provider"; - private static final String KEEP_EMPTY_PARENTS_PROPERTY_NAME = "home_folder_provider_synchronizer.keep_empty_parents"; - private static final String GUEST_HOME_FOLDER_PROVIDER = "guestHomeFolderProvider"; private static final String BOOTSTRAP_HOME_FOLDER_PROVIDER = "bootstrapHomeFolderProvider"; - private final Properties properties; private final TransactionService transactionService; private final AuthorityService authorityService; private final PersonService personService; private final FileFolderService fileFolderService; private final NodeService nodeService; - private final HomeFolderManager homeFolderManager; + private final PortableHomeFolderManager homeFolderManager; private final TenantAdminService tenantAdminService; + + private boolean enabled; + private String overrideHomeFolderProviderName; + private boolean keepEmptyParents; - public HomeFolderProviderSynchronizer(Properties properties, + public HomeFolderProviderSynchronizer( TransactionService transactionService, AuthorityService authorityService, PersonService personService, FileFolderService fileFolderService, NodeService nodeService, - HomeFolderManager homeFolderManager, + PortableHomeFolderManager homeFolderManager, TenantAdminService tenantAdminService) { - this.properties = properties; this.transactionService = transactionService; this.authorityService = authorityService; this.personService = personService; @@ -135,19 +132,34 @@ public class HomeFolderProviderSynchronizer extends AbstractLifecycleBean this.tenantAdminService = tenantAdminService; } + public void setEnabled(String enabled) + { + this.enabled = "true".equalsIgnoreCase(enabled); + } + private boolean enabled() { - return "true".equalsIgnoreCase(properties.getProperty(ENABLED_PROPERTY_NAME)); + return enabled; + } + + public void setOverrideHomeFolderProviderName(String overrideHomeFolderProviderName) + { + this.overrideHomeFolderProviderName = overrideHomeFolderProviderName; } private String getOverrideHomeFolderProviderName() { - return properties.getProperty(OVERRIDE_PROPERTY_NAME); + return overrideHomeFolderProviderName; + } + + public void setKeepEmptyParents(String keepEmptyParents) + { + this.keepEmptyParents = "true".equalsIgnoreCase(keepEmptyParents); } private boolean keepEmptyParents() { - return "true".equalsIgnoreCase(properties.getProperty(KEEP_EMPTY_PARENTS_PROPERTY_NAME)); + return keepEmptyParents; } @Override @@ -865,7 +877,10 @@ public class HomeFolderProviderSynchronizer extends AbstractLifecycleBean public HomeFolderHandler(NodeRef person, String overrideProviderName) { this.person = person; - this.overrideProviderName = overrideProviderName; + this.overrideProviderName = + (overrideProviderName == null || overrideProviderName.trim().isEmpty()) + ? null + : overrideProviderName; } public void doWork() diff --git a/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizerTest.java b/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizerTest.java index 5d54406543..498295271d 100644 --- a/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizerTest.java +++ b/source/java/org/alfresco/repo/security/person/HomeFolderProviderSynchronizerTest.java @@ -77,14 +77,13 @@ public class HomeFolderProviderSynchronizerTest private static ServiceRegistry serviceRegistry; private static TransactionService transactionService; private static FileFolderService fileFolderService; - private static PersonService personService; + private static PersonServiceImpl personService; private static NodeService nodeService; private static ContentService contentService; private static AuthorityService authorityService; private static TenantAdminService tenantAdminService; private static TenantService tenantService; - private static HomeFolderManager homeFolderManager; - private static Properties properties; + private static PortableHomeFolderManager homeFolderManager; private static RegexHomeFolderProvider largeHomeFolderProvider; private static String largeHomeFolderProviderName; private static RegexHomeFolderProvider testHomeFolderProvider; @@ -104,18 +103,17 @@ public class HomeFolderProviderSynchronizerTest serviceRegistry = (ServiceRegistry) applicationContext.getBean("ServiceRegistry"); transactionService = (TransactionService) applicationContext.getBean("transactionService"); fileFolderService = (FileFolderService) applicationContext.getBean("fileFolderService"); - personService = (PersonService) applicationContext.getBean("personService"); + personService = (PersonServiceImpl) applicationContext.getBean("personService"); nodeService = (NodeService) applicationContext.getBean("nodeService"); contentService = (ContentService) applicationContext.getBean("contentService"); authorityService = (AuthorityService) applicationContext.getBean("authorityService"); tenantAdminService = (TenantAdminService) applicationContext.getBean("tenantAdminService"); tenantService = (TenantService) applicationContext.getBean("tenantService"); - homeFolderManager = (HomeFolderManager) applicationContext.getBean("homeFolderManager"); + homeFolderManager = (PortableHomeFolderManager) applicationContext.getBean("homeFolderManager"); largeHomeFolderProvider = (RegexHomeFolderProvider) applicationContext.getBean("largeHomeFolderProvider"); largeHomeFolderProviderName = largeHomeFolderProvider.getName(); storeUrl = largeHomeFolderProvider.getStoreUrl(); origRootPath = largeHomeFolderProvider.getRootPath(); - properties = (Properties) applicationContext.getBean("global-properties"); personService.setCreateMissingPeople(true); @@ -144,7 +142,7 @@ public class HomeFolderProviderSynchronizerTest homeFolderManager.addProvider(testHomeFolderProvider); homeFolderProviderSynchronizer = new HomeFolderProviderSynchronizer( - properties, transactionService, authorityService, + transactionService, authorityService, personService, fileFolderService, nodeService, homeFolderManager, tenantAdminService); } @@ -152,9 +150,9 @@ public class HomeFolderProviderSynchronizerTest @Before public void setUp() throws Exception { - properties.setProperty("home_folder_provider_synchronizer.enabled", "true"); - properties.remove("home_folder_provider_synchronizer.override_provider"); - properties.remove("home_folder_provider_synchronizer.keep_empty_parents"); + homeFolderProviderSynchronizer.setEnabled("true"); + homeFolderProviderSynchronizer.setOverrideHomeFolderProviderName(null); + homeFolderProviderSynchronizer.setKeepEmptyParents("false"); largeHomeFolderProvider.setPattern("^(..)"); testHomeFolderProvider.setRootPath(origRootPath); @@ -323,7 +321,7 @@ public class HomeFolderProviderSynchronizerTest properties.put(ContentModel.PROP_EMAIL, emailAddress); properties.put(ContentModel.PROP_HOME_FOLDER_PROVIDER, testHomeFolderProviderName); properties.put(PROP_PARENT_PATH, parentPath); - homeFolderManager.setEnableHomeFolderCreationAsPeopleAreCreated(createHomeDirectory); + personService.setHomeFolderCreationEager(createHomeDirectory); NodeRef person = personService.createPerson(properties); assertNotNull("The person nodeRef for "+domainUsername+" should have been created", person); NodeRef homeFolder = DefaultTypeConverter.INSTANCE.convert( @@ -598,7 +596,7 @@ public class HomeFolderProviderSynchronizerTest public void testNotEnabled() throws Exception { createUser("", "fred"); - properties.remove("home_folder_provider_synchronizer.enabled"); + homeFolderProviderSynchronizer.setEnabled("false"); moveUserHomeFolders(); @@ -670,7 +668,7 @@ public class HomeFolderProviderSynchronizerTest public void testKeepEmptyParents() throws Exception { createUser("a/bb/ccc", "peter"); - properties.put("home_folder_provider_synchronizer.keep_empty_parents", "true"); + homeFolderProviderSynchronizer.setKeepEmptyParents("true"); moveUserHomeFolders(); @@ -746,7 +744,7 @@ public class HomeFolderProviderSynchronizerTest createFolder("Temporary3"); // Don't delete the temporary folder - properties.put("home_folder_provider_synchronizer.keep_empty_parents", "true"); + homeFolderProviderSynchronizer.setKeepEmptyParents("true"); moveUserHomeFolders(); @@ -837,7 +835,7 @@ public class HomeFolderProviderSynchronizerTest moveUserHomeFolders(); assertHomeFolderLocation("fred", "fr/fred"); - properties.put("home_folder_provider_synchronizer.override_provider", + homeFolderProviderSynchronizer.setOverrideHomeFolderProviderName( testHomeFolderProviderName); moveUserHomeFolders(); @@ -851,7 +849,7 @@ public class HomeFolderProviderSynchronizerTest public void testNoOriginalProvider() throws Exception { createUser("a/b/c", "fred", null, true); - properties.put("home_folder_provider_synchronizer.override_provider", + homeFolderProviderSynchronizer.setOverrideHomeFolderProviderName( largeHomeFolderProviderName); moveUserHomeFolders(); @@ -885,7 +883,7 @@ public class HomeFolderProviderSynchronizerTest createUser("a/b/c", "fred"); - properties.put("home_folder_provider_synchronizer.override_provider", name); + homeFolderProviderSynchronizer.setOverrideHomeFolderProviderName(name); moveUserHomeFolders(); assertHomeFolderLocation("fred", "a/b/c/fred"); @@ -911,7 +909,7 @@ public class HomeFolderProviderSynchronizerTest createUser("a/b/c", "fred"); - properties.put("home_folder_provider_synchronizer.override_provider", name); + homeFolderProviderSynchronizer.setOverrideHomeFolderProviderName(name); moveUserHomeFolders(); assertHomeFolderLocation("fred", "fred"); diff --git a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java index 105681900f..21989ac568 100644 --- a/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java +++ b/source/java/org/alfresco/repo/security/person/PersonServiceImpl.java @@ -49,7 +49,6 @@ import org.alfresco.repo.node.getchildren.FilterPropString; import org.alfresco.repo.node.getchildren.GetChildrenCannedQuery; import org.alfresco.repo.node.getchildren.GetChildrenCannedQueryFactory; import org.alfresco.repo.node.getchildren.FilterPropString.FilterTypeString; -import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.search.SearcherException; @@ -135,7 +134,6 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per private NamespacePrefixResolver namespacePrefixResolver; private HomeFolderManager homeFolderManager; private PolicyComponent policyComponent; - private BehaviourFilter policyBehaviourFilter; private AclDAO aclDao; private PermissionsManager permissionsManager; private RepoAdminService repoAdminService; @@ -161,7 +159,9 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per private JavaBehaviour beforeCreateNodeValidationBehaviour; private JavaBehaviour beforeDeleteNodeValidationBehaviour; - + + private boolean homeFolderCreationEager; + static { Set props = new HashSet(); @@ -305,11 +305,6 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per this.policyComponent = policyComponent; } - public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter) - { - this.policyBehaviourFilter = policyBehaviourFilter; - } - public void setStoreUrl(String storeUrl) { this.storeRef = new StoreRef(storeUrl); @@ -350,6 +345,15 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per this.homeFolderManager = homeFolderManager; } + /** + * Indicates if home folders should be created when the person + * is created or delayed until first accessed. + */ + public void setHomeFolderCreationEager(boolean homeFolderCreationEager) + { + this.homeFolderCreationEager = homeFolderCreationEager; + } + public void setAclDAO(AclDAO aclDao) { this.aclDao = aclDao; @@ -809,16 +813,27 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per { public Object execute() throws Throwable { - homeFolderManager.makeHomeFolder(ref); + makeHomeFolderAsSystem(ref); return null; } }, transactionService.isReadOnly(), transactionService.isReadOnly() ? false : AlfrescoTransactionSupport.getTransactionReadState() == TxnReadState.TXN_READ_ONLY); - //homeFolder = DefaultTypeConverter.INSTANCE.convert(NodeRef.class, nodeService.getProperty(person, ContentModel.PROP_HOMEFOLDER)); - //assert(homeFolder != null); } } } + private void makeHomeFolderAsSystem(final ChildAssociationRef childAssocRef) + { + AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + @Override + public Object doWork() throws Exception + { + homeFolderManager.makeHomeFolder(childAssocRef); + return null; + } + }, AuthenticationUtil.getSystemUserName()); + } + private HashMap getDefaultProperties(String userName) { HashMap properties = new HashMap(); @@ -1328,8 +1343,10 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per // Make sure there is an authority entry - with a DB constraint for uniqueness // aclDao.createAuthority(username); - // work around for policy bug ... - homeFolderManager.onCreateNode(childAssocRef); + if (homeFolderCreationEager) + { + makeHomeFolderAsSystem(childAssocRef); + } } private QName getChildNameLower(String userName) diff --git a/source/java/org/alfresco/repo/security/person/PortableHomeFolderManager.java b/source/java/org/alfresco/repo/security/person/PortableHomeFolderManager.java new file mode 100644 index 0000000000..54d0e61e49 --- /dev/null +++ b/source/java/org/alfresco/repo/security/person/PortableHomeFolderManager.java @@ -0,0 +1,442 @@ +/* + * 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.security.person; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.tenant.TenantService; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileFolderUtil; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.model.FileNotFoundException; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; + +/** + * Manage home folder creation by binding to events from the cm:person type. + * + * @author Andy Hind, + * Alan Davis (support v1 and v2 HomeFolderProviders - code from + * v1 HomeFolderProviders moved into HomeFolderManager). + */ +public class PortableHomeFolderManager implements HomeFolderManager +{ + private NodeService nodeService; + private FileFolderService fileFolderService; + private NamespaceService namespaceService; + private SearchService searchService; + private TenantService tenantService; + + /** + * A default provider + */ + private HomeFolderProvider2 defaultProvider; + + /** + * Original Providers (now depreciated) that have registered and are looked up by bean name. + */ + @SuppressWarnings("deprecation") + private Map v1Providers = new HashMap(); + + /** + * Providers that have registered and are looked up by bean name. + */ + private Map v2Providers = new HashMap(); + + /** + * Cache the result of the path look up. + */ + private Map> rootPathNodeRefMaps = + new ConcurrentHashMap>(); + + /** + * Set the node service. + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * Set the FileFolderService + */ + public void setFileFolderService(FileFolderService fileFolderService) + { + this.fileFolderService = fileFolderService; + } + + /** + * Set the namespaceService + */ + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + /** + * @param searchService the searchService to set + */ + public void setSearchService(SearchService searchService) + { + this.searchService = searchService; + } + + /** + * Set the tenant service + */ + public void setTenantService(TenantService tenantService) + { + this.tenantService = tenantService; + } + + /** + * Register a home folder provider. + * + * @param provider + */ + @SuppressWarnings("deprecation") + public void addProvider(HomeFolderProvider provider) + { + v1Providers.put(provider.getName(), provider); + } + + /** + * Register a home folder provider. + * + * @param provider + */ + public void addProvider(HomeFolderProvider2 provider) + { + v2Providers.put(provider.getName(), provider); + } + + /** + * Returns the version 1 HomeFolderProvider with the given name. + */ + @SuppressWarnings("deprecation") + public HomeFolderProvider getHomeFolderProvider1(String providerName) + { + return v1Providers.get(providerName); + } + + /** + * Returns the version 2 HomeFolderProvider2 with the given name. + */ + public HomeFolderProvider2 getHomeFolderProvider2(String providerName) + { + return v2Providers.get(providerName); + } + + /** + * Set the default home folder provider (user which none is specified or when one is not found) + * @param defaultProvider + */ + public void setDefaultProvider(HomeFolderProvider2 defaultProvider) + { + this.defaultProvider = defaultProvider; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.security.person.HomeFolderManager#makeHomeFolder(org.alfresco.service.cmr.repository.ChildAssociationRef) + */ + @SuppressWarnings("deprecation") + @Override + public void makeHomeFolder(final ChildAssociationRef childAssocRef) + { + HomeFolderProvider2 v2Provider = defaultProvider; + HomeFolderProvider v1Provider = null; + String providerName = DefaultTypeConverter.INSTANCE.convert( + String.class, nodeService.getProperty(childAssocRef + .getChildRef(), ContentModel.PROP_HOME_FOLDER_PROVIDER)); + if (providerName != null) + { + v2Provider = getHomeFolderProvider2(providerName); + if (v2Provider == null) + { + v1Provider = getHomeFolderProvider1(providerName); + if (v1Provider == null) + { + v2Provider = defaultProvider; + } + } + } + else + { + providerName = defaultProvider.getName(); + nodeService.setProperty(childAssocRef.getChildRef(), + ContentModel.PROP_HOME_FOLDER_PROVIDER, providerName); + } + if (v2Provider != null) + { + // If a V2Adaptor we still must call onCreateNode just like a + // v1 HomeFolderProvider in case it has been overridden + if (v2Provider instanceof AbstractHomeFolderProvider.V2Adaptor) + { + ((AbstractHomeFolderProvider.V2Adaptor)v2Provider).onCreateNode(childAssocRef); + } + else + { + homeFolderCreateAndSetPermissions(v2Provider, childAssocRef.getChildRef()); + } + } + else if (v1Provider != null) + { + v1Provider.onCreateNode(childAssocRef); + } + } + + void homeFolderCreateAndSetPermissions(HomeFolderProvider2 provider, NodeRef personNodeRef) + { + // Get home folder + HomeSpaceNodeRef homeFolder = provider.getHomeFolder(personNodeRef); + + // If it exists + if (homeFolder.getNodeRef() != null) + { + // Get uid and keep + String uid = DefaultTypeConverter.INSTANCE.convert(String.class, + nodeService.getProperty(personNodeRef, ContentModel.PROP_USERNAME)); + + // If created or found then set (other wise it was already set correctly) + if (homeFolder.getStatus() != HomeSpaceNodeRef.Status.VALID) + { + nodeService.setProperty( + personNodeRef, ContentModel.PROP_HOMEFOLDER, homeFolder.getNodeRef()); + } + + final String providerSuppliedOwner = provider.getOwner(); + String owner = (providerSuppliedOwner == null) ? uid : providerSuppliedOwner; + // If created.. + if (homeFolder.getStatus() == HomeSpaceNodeRef.Status.CREATED) + { + PermissionsManager onCreatePermissionsManager = + provider.getOnCreatePermissionsManager(); + if (onCreatePermissionsManager != null) + { + onCreatePermissionsManager.setPermissions( + homeFolder.getNodeRef(), owner, uid); + } + } + else + { + PermissionsManager onReferencePermissionsManager = + provider.getOnReferencePermissionsManager(); + if (onReferencePermissionsManager != null) + { + onReferencePermissionsManager.setPermissions( + homeFolder.getNodeRef(), owner, uid); + } + } + } + } + + private StoreRef getStoreRef(HomeFolderProvider2 provider) + { + // Could check to see if provider is a V2Adaptor to avoid + // object creation, but there is little point. + return new StoreRef(provider.getStoreUrl()); + } + + /** + * Helper method for {@link HomeFolderProvider2.getHomeFolder} (so that it + * does not need its own NodeService) that returns a person property value. + */ + public String getPersonProperty(NodeRef person, QName name) + { + String value = DefaultTypeConverter.INSTANCE.convert(String.class, nodeService.getProperty(person, name)); + + if(value == null || value.length() == 0) + { + throw new PersonException("Can not create a home folder when the "+name+" property is null or empty"); + } + return value; + } + + void clearCaches(HomeFolderProvider2 provider) + { + getRootPathNodeRefMap(provider).clear(); + } + + NodeRef getRootPathNodeRef(HomeFolderProvider2 provider) + { + String rootPath = provider.getRootPath(); + String tenantDomain = (tenantService != null ? tenantService.getCurrentUserDomain() : TenantService.DEFAULT_DOMAIN); + Map rootPathNodeRefMap = getRootPathNodeRefMap(provider); + NodeRef rootPathNodeRef = rootPathNodeRefMap.get(tenantDomain); + if (rootPathNodeRef == null) + { + // ok with race condition for initial construction + rootPathNodeRef = resolvePath(provider, rootPath); + rootPathNodeRefMap.put(tenantDomain, rootPathNodeRef); + } + return rootPathNodeRef; + } + + private Map getRootPathNodeRefMap(HomeFolderProvider2 provider) + { + String name = provider.getName(); + Map rootPathNodeRefMap = rootPathNodeRefMaps.get(name); + if (rootPathNodeRefMap == null) + { + // ok with race condition for initial construction + rootPathNodeRefMap = new ConcurrentHashMap(); + rootPathNodeRefMaps.put(name, rootPathNodeRefMap); + } + return rootPathNodeRefMap; + } + + /** + * Utility method to resolve paths to nodes. + */ + NodeRef resolvePath(HomeFolderProvider2 provider, String pathToResolve) + { + List refs = searchService.selectNodes( + nodeService.getRootNode(getStoreRef(provider)), + pathToResolve, null, namespaceService, false); + if (refs.size() != 1) + { + throw new IllegalStateException("Non-unique path: found : " + + pathToResolve + " " + refs.size()); + } + return refs.get(0); + } + + /** + * Helper method for {@link HomeFolderProvider2.getHomeFolder(NodeRef)} + * implementations to return a {@link HomeSpaceNodeRef} + * @param referenceRootNode indicates that a reference to the root node + * should be returned if the home folder property on the person + * has not yet been set. + */ + public HomeSpaceNodeRef getHomeFolder(HomeFolderProvider2 provider, NodeRef person, boolean referenceRootNode) + { + HomeSpaceNodeRef homeSpaceNodeRef = null; + NodeRef existingHomeFolder = DefaultTypeConverter.INSTANCE.convert( + NodeRef.class, nodeService.getProperty( + person, ContentModel.PROP_HOMEFOLDER)); + if (existingHomeFolder != null) + { + homeSpaceNodeRef = new HomeSpaceNodeRef(existingHomeFolder, + HomeSpaceNodeRef.Status.VALID); + } + else if (referenceRootNode) + { + homeSpaceNodeRef = new HomeSpaceNodeRef(getRootPathNodeRef(provider), + HomeSpaceNodeRef.Status.REFERENCED); + } + else + { + List homeFolderPath = provider.getHomeFolderPath(person); + + FileInfo fileInfo; + + // Test if it already exists + NodeRef existing = getExisting(provider, fileFolderService, homeFolderPath); + if (existing != null) + { + fileInfo = fileFolderService.getFileInfo(existing); + } + else + { + fileInfo = createTree(provider, getRootPathNodeRef(provider), homeFolderPath, + provider.getTemplateNodeRef(), fileFolderService); + } + NodeRef homeFolderNodeRef = fileInfo.getNodeRef(); + return new HomeSpaceNodeRef(homeFolderNodeRef, HomeSpaceNodeRef.Status.CREATED); + } + return homeSpaceNodeRef; + } + + private NodeRef getExisting(HomeFolderProvider2 provider, FileFolderService fileFolderService, + List homeFolderPath) + { + NodeRef existing; + try + { + FileInfo existingFileInfo = fileFolderService.resolveNamePath(getRootPathNodeRef(provider), homeFolderPath); + existing = existingFileInfo.getNodeRef(); + } + catch (FileNotFoundException fnfe) + { + existing = null;// home folder noderef doesn't exist yet + } + return existing; + } + + /** + * creates a tree of folder nodes based on the path elements provided. + */ + private FileInfo createTree(HomeFolderProvider2 provider, NodeRef root, + List homeFolderPath, NodeRef templateNodeRef, + FileFolderService fileFolderService) + { + NodeRef newParent = createNewParentIfRequired(root, homeFolderPath, fileFolderService); + String homeFolderName = homeFolderPath.get(homeFolderPath.size()-1); + FileInfo fileInfo; + if (templateNodeRef == null) + { + fileInfo = fileFolderService.create( + newParent, + homeFolderName, + ContentModel.TYPE_FOLDER); + } + else + { + try + { + fileInfo = fileFolderService.copy( + templateNodeRef, + newParent, + homeFolderName); + } + catch (FileNotFoundException e) + { + throw new PersonException("Invalid template to create home space"); + } + } + return fileInfo; + } + + private NodeRef createNewParentIfRequired(NodeRef root, + List homeFolderPath, FileFolderService fileFolderService) + { + if (homeFolderPath.size() > 1) + { + List parentPath = new ArrayList(homeFolderPath); + parentPath.remove(parentPath.size()-1); + return FileFolderUtil.makeFolders(fileFolderService, root, + parentPath, ContentModel.TYPE_FOLDER).getNodeRef(); + } + else + { + return root; + } + } +} diff --git a/source/java/org/apache/lucene/search/TermQuery.java b/source/java/org/apache/lucene/search/TermQuery.java new file mode 100644 index 0000000000..eb80103526 --- /dev/null +++ b/source/java/org/apache/lucene/search/TermQuery.java @@ -0,0 +1,180 @@ +package org.apache.lucene.search; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; +import java.util.Set; + +import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermDocs; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.util.ToStringUtils; + +/** A Query that matches documents containing a term. + This may be combined with other terms with a {@link BooleanQuery}. + */ +public class TermQuery extends Query { + private Term term; + + private class TermWeight implements Weight { + private Similarity similarity; + private float value; + private float idf; + private float queryNorm; + private float queryWeight; + + public TermWeight(Searcher searcher) + throws IOException { + this.similarity = getSimilarity(searcher); + idf = similarity.idf(term, searcher); // compute idf + } + + public String toString() { return "weight(" + TermQuery.this + ")"; } + + public Query getQuery() { return TermQuery.this; } + public float getValue() { return value; } + + public float sumOfSquaredWeights() { + queryWeight = idf * getBoost(); // compute query weight + return queryWeight * queryWeight; // square it + } + + public void normalize(float queryNorm) { + this.queryNorm = queryNorm; + queryWeight *= queryNorm; // normalize query weight + value = queryWeight * idf; // idf for document + } + + public Scorer scorer(IndexReader reader) throws IOException { + TermDocs termDocs = reader.termDocs(term); + + if (termDocs == null) + return null; + + String field = term.field(); + return new TermScorer(this, termDocs, similarity, + reader.hasNorms(field) ? reader.norms(field) : null); + } + + public Explanation explain(IndexReader reader, int doc) + throws IOException { + + ComplexExplanation result = new ComplexExplanation(); + result.setDescription("weight("+getQuery()+" in "+doc+"), product of:"); + + Explanation idfExpl = + new Explanation(idf, "idf(docFreq=" + reader.docFreq(term) + + ", numDocs=" + reader.numDocs() + ")"); + + // explain query weight + Explanation queryExpl = new Explanation(); + queryExpl.setDescription("queryWeight(" + getQuery() + "), product of:"); + + Explanation boostExpl = new Explanation(getBoost(), "boost"); + if (getBoost() != 1.0f) + queryExpl.addDetail(boostExpl); + queryExpl.addDetail(idfExpl); + + Explanation queryNormExpl = new Explanation(queryNorm,"queryNorm"); + queryExpl.addDetail(queryNormExpl); + + queryExpl.setValue(boostExpl.getValue() * + idfExpl.getValue() * + queryNormExpl.getValue()); + + result.addDetail(queryExpl); + + // explain field weight + String field = term.field(); + ComplexExplanation fieldExpl = new ComplexExplanation(); + fieldExpl.setDescription("fieldWeight("+term+" in "+doc+ + "), product of:"); + + Explanation tfExpl = scorer(reader).explain(doc); + fieldExpl.addDetail(tfExpl); + fieldExpl.addDetail(idfExpl); + + Explanation fieldNormExpl = new Explanation(); + byte[] fieldNorms = reader.norms(field); + float fieldNorm = + fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) : 0.0f; + fieldNormExpl.setValue(fieldNorm); + fieldNormExpl.setDescription("fieldNorm(field="+field+", doc="+doc+")"); + fieldExpl.addDetail(fieldNormExpl); + + fieldExpl.setMatch(Boolean.valueOf(tfExpl.isMatch())); + fieldExpl.setValue(tfExpl.getValue() * + idfExpl.getValue() * + fieldNormExpl.getValue()); + + result.addDetail(fieldExpl); + result.setMatch(fieldExpl.getMatch()); + + // combine them + result.setValue(queryExpl.getValue() * fieldExpl.getValue()); + + if (queryExpl.getValue() == 1.0f) + return fieldExpl; + + return result; + } + } + + /** Constructs a query for the term t. */ + public TermQuery(Term t) { + term = t; + } + + /** Returns the term of this query. */ + public Term getTerm() { return term; } + + protected Weight createWeight(Searcher searcher) throws IOException { + return new TermWeight(searcher); + } + + public void extractTerms(Set terms) { + terms.add(getTerm()); + } + + /** Prints a user-readable version of this query. */ + public String toString(String field) { + StringBuffer buffer = new StringBuffer(); + if (!term.field().equals(field)) { + buffer.append(term.field()); + buffer.append(":"); + } + buffer.append(term.text()); + buffer.append(ToStringUtils.boost(getBoost())); + return buffer.toString(); + } + + /** Returns true iff o is equal to this. */ + public boolean equals(Object o) { + if (!(o instanceof TermQuery)) + return false; + TermQuery other = (TermQuery)o; + return (this.getBoost() == other.getBoost()) + && this.term.equals(other.term); + } + + /** Returns a hash code value for this object.*/ + public int hashCode() { + return Float.floatToIntBits(getBoost()) ^ term.hashCode(); + } + +} diff --git a/source/java/org/apache/lucene/search/TermScorer.java b/source/java/org/apache/lucene/search/TermScorer.java new file mode 100644 index 0000000000..9ac5d46da9 --- /dev/null +++ b/source/java/org/apache/lucene/search/TermScorer.java @@ -0,0 +1,190 @@ +package org.apache.lucene.search; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; + +import org.apache.lucene.index.TermDocs; + +/** Expert: A Scorer for documents matching a Term. + */ +final class TermScorer extends Scorer { + private Weight weight; + private TermDocs termDocs; + private byte[] norms; + private float weightValue; + private int doc; + + private final int[] docs = new int[32]; // buffered doc numbers + private final int[] freqs = new int[32]; // buffered term freqs + private int pointer; + private int pointerMax; + + private static final int SCORE_CACHE_SIZE = 32; + private float[] scoreCache = new float[SCORE_CACHE_SIZE]; + private static final byte DEFAULT_NORM = DefaultSimilarity.encodeNorm(1.0f); + + /** Construct a TermScorer. + * @param weight The weight of the Term in the query. + * @param td An iterator over the documents matching the Term. + * @param similarity The Similarity implementation to be used for score computations. + * @param norms The field norms of the document fields for the Term. + */ + TermScorer(Weight weight, TermDocs td, Similarity similarity, + byte[] norms) { + super(similarity); + this.weight = weight; + this.termDocs = td; + this.norms = norms; + this.weightValue = weight.getValue(); + + for (int i = 0; i < SCORE_CACHE_SIZE; i++) + scoreCache[i] = getSimilarity().tf(i) * weightValue; + } + + public void score(HitCollector hc) throws IOException { + next(); + score(hc, Integer.MAX_VALUE); + } + + protected boolean score(HitCollector c, int end) throws IOException { + Similarity similarity = getSimilarity(); // cache sim in local + float[] normDecoder = Similarity.getNormDecoder(); + while (doc < end) { // for docs in window + int f = freqs[pointer]; + float score = // compute tf(f)*weight + f < SCORE_CACHE_SIZE // check cache + ? scoreCache[f] // cache hit + : similarity.tf(f)*weightValue; // cache miss + + score *= normDecoder[(norms == null ? DEFAULT_NORM : norms[doc]) & 0xFF]; // normalize for field + + c.collect(doc, score); // collect score + + if (++pointer >= pointerMax) { + pointerMax = termDocs.read(docs, freqs); // refill buffers + if (pointerMax != 0) { + pointer = 0; + } else { + termDocs.close(); // close stream + doc = Integer.MAX_VALUE; // set to sentinel value + return false; + } + } + doc = docs[pointer]; + } + return true; + } + + /** Returns the current document number matching the query. + * Initially invalid, until {@link #next()} is called the first time. + */ + public int doc() { return doc; } + + /** Advances to the next document matching the query. + *
The iterator over the matching documents is buffered using + * {@link TermDocs#read(int[],int[])}. + * @return true iff there is another document matching the query. + */ + public boolean next() throws IOException { + pointer++; + if (pointer >= pointerMax) { + pointerMax = termDocs.read(docs, freqs); // refill buffer + if (pointerMax != 0) { + pointer = 0; + } else { + termDocs.close(); // close stream + doc = Integer.MAX_VALUE; // set to sentinel value + return false; + } + } + doc = docs[pointer]; + return true; + } + + public float score() { + int f = freqs[pointer]; + float raw = // compute tf(f)*weight + f < SCORE_CACHE_SIZE // check cache + ? scoreCache[f] // cache hit + : getSimilarity().tf(f)*weightValue; // cache miss + + return raw * Similarity.decodeNorm(norms == null ? DEFAULT_NORM : norms[doc]); // normalize for field + } + + /** Skips to the first match beyond the current whose document number is + * greater than or equal to a given target. + *
The implementation uses {@link TermDocs#skipTo(int)}. + * @param target The target document number. + * @return true iff there is such a match. + */ + public boolean skipTo(int target) throws IOException { + // first scan in cache + for (pointer++; pointer < pointerMax; pointer++) { + if (docs[pointer] >= target) { + doc = docs[pointer]; + return true; + } + } + + // not found in cache, seek underlying stream + boolean result = termDocs.skipTo(target); + if (result) { + pointerMax = 1; + pointer = 0; + docs[pointer] = doc = termDocs.doc(); + freqs[pointer] = termDocs.freq(); + } else { + doc = Integer.MAX_VALUE; + } + return result; + } + + /** Returns an explanation of the score for a document. + *
When this method is used, the {@link #next()} method + * and the {@link #score(HitCollector)} method should not be used. + * @param doc The document number for the explanation. + */ + public Explanation explain(int doc) throws IOException { + TermQuery query = (TermQuery)weight.getQuery(); + Explanation tfExplanation = new Explanation(); + int tf = 0; + while (pointer < pointerMax) { + if (docs[pointer] == doc) + tf = freqs[pointer]; + pointer++; + } + if (tf == 0) { + if (termDocs.skipTo(doc)) + { + if (termDocs.doc() == doc) + { + tf = termDocs.freq(); + } + } + } + termDocs.close(); + tfExplanation.setValue(getSimilarity().tf(tf)); + tfExplanation.setDescription("tf(termFreq("+query.getTerm()+")="+tf+")"); + + return tfExplanation; + } + + /** Returns a string representation of this TermScorer. */ + public String toString() { return "scorer(" + weight + ")"; } +}