alfresco-community-repo/source/java/org/alfresco/service/cmr/ml/MultilingualContentService.java
Alan Davis 29f7f5d073 Merged BRANCHES/DEV/V3.4-BUG-FIX to HEAD
28236: ALF-8810: Removed trailing space from discussion.discussion_for Italian translation
   28241: Incremented version revision for 3.4.4
   28284: ALF-835 - WCM/AVM: copy (empty) folder into itself
   28285: ALF-6863: More than one cifs device breaks the web UI (explorer)
   28290: ALF-8840: user-*.atomentry.ftl
   28291: ALF-6863: Continuation of fix by Arseny
   28336: ALF-8768: Fixed typo in comment on wcm-bootstrap-context.xml
   28363: Merged DEV to V3.4-BUG-FIX
      28262: ALF-8847: WCM: OrphanReaper contention throws error after 39 retries.
             Checkin Comment:
                Use JobLockService to make sure that only one OrphanReaper job is working.
                Generate list of nodes that must be processed in OrphanReaper.doBatch() transaction. 
   28386: ALF-9100: Merged PATCHES/V3.4.1 to V3.4-BUG-FIX
      28249: ALF-8946: Avoid one full table scan per batch in full reindex
         - Now each batch scans a single time sample, dynamically adjusted based on the number of transactions
		   in the previous sample, always aiming for 1000 transactions per sample.
   28394: Fixed ALF-9090: NPE during inter-cluster subsystem messaging
    - Bean ID is a List<String> and might not be recognized on receiving machine
    - Log warning when bean ID is not available (unsymmetrical configuration, perhaps?)
   28396: Merged DEV to V3.4-BUG-FIX
      28384: ALF-6150: Initial state lost when non-versionable document is saved for the first time
             Creation of new version of document before writing its content was added to
             - AbstractAlfrescoMethodHandler->putDocument (this method is used by Office 2003, 2007)
             - VtiIfHeaderAction->doPut (this method is used by Office 2007 and 2010 on Windows 7)
               Creation of new version was added twice to AbstractAlfrescoMethodHandler to avoid affecting
               initial version when transaction is committed. 
   28432: Merged DEV to V3.4-BUG-FIX
      28431: ALF-8530: Pressing the info icon creates an unrecorded file in the ContentStore
             Use ContentService.getTempWriter() in BaseContentNode$TemplateContentData.getContentAsText() method. 
   28435: Merged DEV/TEMPORARY to V3.4-BUG-FIX
      28428: ALF-9015: cm:modifier not updated when document is updated via CIFS
         In ContentDiskDriver.closeFile() added ContentModel.PROP_MODIFIER property update.
   28436: ALF-8550: Number of http requests (currentThreadsBusy) increases when session times out during creation of webform
   - Corrected use of read and write locks
   28465: Fix for ALF-8023 Share preview doesn't work if...
     fixed as outlined by Dmitry.
   28478: Merged BRANCHES/DEV/ALAN/AUDIT to BRANCHES/DEV/V3.4-BUG-FIX:
      28062-28477 (28062,28063,28080,28081,28302,28303,28334,28340,28464,28469,28477) ALF-8438 Need higher level audit of user actions

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28481 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2011-06-20 12:42:10 +00:00

201 lines
9.2 KiB
Java

/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.service.cmr.ml;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.alfresco.service.Auditable;
import org.alfresco.service.PublicService;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* The API to manage multilingual content and related structures.
*
* @author Derek Hulley
* @author Philippe Dubois
*/
public interface MultilingualContentService
{
/**
* Checks whether an existing document is part of a translation group.
*
* @param contentNodeRef An existing <b>cm:content</b>
* @return Returns <tt>true</tt> if the document has a <b>cm:mlContainer</b> parent
*/
@Auditable(parameters = {"contentNodeRef"})
boolean isTranslation(NodeRef contentNodeRef);
/**
* Make an existing document into a translation by adding the <b>cm:mlDocument</b> aspect and
* creating a <b>cm:mlContainer</b> parent. If it is already a translation, then nothing is done.
*
* @param contentNodeRef An existing <b>cm:content</b>
*
* @see org.alfresco.model.ContentModel#ASPECT_MULTILINGUAL_DOCUMENT
*/
@Auditable(parameters = {"contentNodeRef", "locale"})
void makeTranslation(NodeRef contentNodeRef, Locale locale);
/**
* Removes the node from any associated translations. If the translation is the
* pivot translation, then the entire set of translations will be unhooked.
*
* @param translationNodeRef an existing <b>cm:mlDocument</b>
*/
@Auditable(parameters = {"translationNodeRef"})
void unmakeTranslation(NodeRef translationNodeRef);
/**
* Make a translation out of an existing document. The necessary translation structures will be created
* as necessary.
*
* @param newTranslationNodeRef An existing <b>cm:content</b>
* @param translationOfNodeRef An existing <b>cm:mlDocument</b>
*/
@Auditable(parameters = {"newTranslationNodeRef", "translationOfNodeRef", "locale"})
void addTranslation(NodeRef newTranslationNodeRef, NodeRef translationOfNodeRef, Locale locale);
/**
* Convenience method for super user.
*
* @param translationNodeRef An existing <b>cm:mlDocument</b>
* @return Returns the <b>cm:mlContainer</b> translation parent
*/
@Auditable(parameters = {"translationNodeRef"})
NodeRef getTranslationContainer(NodeRef translationNodeRef);
/**
* Gets the set of sibling translations associated with the given <b>cm:mlDocument</b> or
* <b>cm:mlContainer</b>.
*
* @param translationOfNodeRef An existing <b>cm:mlDocument</b> or <b>cm:mlContainer</b>
* @return Returns a map of translation nodes keyed by locale
*/
@Auditable(parameters = {"translationOfNodeRef"})
Map<Locale, NodeRef> getTranslations(NodeRef translationOfNodeRef);
/**
* Given a <b>cm:mlDocument</b>, this method attempts to find the best translation for the given
* locale. If there is not even a
* {@link org.springframework.extensions.surf.util.I18NUtil#getNearestLocale(Locale, Set) partial match}, then the
* {@link #getPivotTranslation(NodeRef) pivot translation} is used. If that also gives no results
* then the translation itself is returned.
*
* @param translationNodeRef the <b>cm:mlDocument</b>
* @param locale the target locale
* @return Returns the best match for the locale (never <tt>null</tt>)
*
* @see #getTranslations(NodeRef)
* @see org.springframework.extensions.surf.util.I18NUtil#getNearestLocale(Locale, Set)
*/
@Auditable(parameters = {"translationNodeRef", "locale"})
NodeRef getTranslationForLocale(NodeRef translationNodeRef, Locale locale);
/**
* Given a <b>cm:mlDocument</b> or <b>cm:mlContainer</b> this node returns each locale for
* which there isn't a translation.
*
* @param localizedNodeRef the <b>cm:mlDocument</b> or <b>cm:mlContainer</b>
* @param addThisNodeLocale if true, add the locale of the given <b>cm:mlDocument</b> in the list.
* @return Returns a list of missng locales
*/
@Auditable(parameters = {"localizedNodeRef", "addThisNodeLocale"})
List<Locale> getMissingTranslations(NodeRef localizedNodeRef, boolean addThisNodeLocale);
/**
* Given any node, this returns the pivot translation. All multilingual documents belong to
* a group linked by a hidden parent node of type <b>cm:mlContainer</b>. The pivot language
* for the translations is stored on the parent, and the child that has the same locale is the
* pivot translation.
*
* @param nodeRef a <b>cm:mlDocument</b> translation or <b>cm:mlContainer</b> translation
* container
* @return Returns a corresponding <b>cm:mlDocument</b> that matches the locale of
* of the <b>cm:mlContainer</b>. <tt>null</tt> is returned if there is no
* pivot translation.
*/
@Auditable(parameters = {"nodeRef"})
NodeRef getPivotTranslation(NodeRef nodeRef);
/**
* Make a empty translation out of an existing pivot translation. The given translation or
* container will be used to find the pivot translation. Failing this, the given translation
* will be used directly. If no name is provided or if the name is the same as the original's
* then the locale will be added to the main portion of the filename, i.e.
* <pre>
* Document.txt --> Document_fr.txt
* </pre>
* <p/>
* The necessary translation structures will be created as necessary.
*
* @param translationOfNodeRef An existing <b>cm:mlDocument</b>
* @param name The name of the file to create, or <tt>null</tt> to use
* the default naming convention.
* @return Returns the new created <b>cm:mlEmptyTranslation</b>
*/
@Auditable(parameters = {"translationOfNodeRef", "name", "locale"})
NodeRef addEmptyTranslation(NodeRef translationOfNodeRef, String name, Locale locale);
/**
* Copies the given <b>cm:mlContainer</b>.
* <p>
* This involves the copy of the <b>cm:mlContainer</b> node and the copy of its <b>cm:mlDocument</b>.
* <p>
*
* @param translationNodeRef The <b>cm:mlContainer</b> to copy
* @param newParentRef The new parent of the copied <b>cm:mlDocument</b>
* @param prefixName The prefix of the name of the copied translations. Can be null.
* @return The copied <b>cm:mlContainer</b>
* @throws FileNotFoundException
* @throws FileExistsException
* @throws Exception
*/
@Auditable(parameters = {"mlContainerNodeRef", "newParentRef"})
NodeRef copyTranslationContainer(NodeRef mlContainerNodeRef, NodeRef newParentRef, String prefixName) throws FileExistsException, FileNotFoundException, Exception;
/**
* Moves the location of the given <b>cm:mlContainer</b>.
* <p>
* This not involves changing the <b>cm:mlContainer</b> node but moves its <b>cm:mlDocument</b>.
* <p>
*
* @param translationNodeRef The <b>cm:mlContainer</b> to move
* @param newParentRef The new parent of the moved <b>cm:mlDocument</b>
* @throws FileExistsException
* @throws FileNotFoundException
*/
@Auditable(parameters = {"mlContainerNodeRef", "newParentRef"})
void moveTranslationContainer(NodeRef mlContainerNodeRef, NodeRef newParentRef) throws FileExistsException, FileNotFoundException;
/**
* Delete the given mlContainer and its translations. The translations will lost their <b>cm:mlDocument</b> aspect and
* will be archved. The empty translations will be permanently deleted.
*
* @param mlContainerNodeRef The <b>cm:mlContainer</b> to remove
*/
@Auditable(parameters = {"mlContainerNodeRef"})
void deleteTranslationContainer(NodeRef mlContainerNodeRef);
}