Further ML implementation: createEdition

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4744 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-01-05 18:02:22 +00:00
parent 2747df2afa
commit 8973f5f01b
4 changed files with 104 additions and 11 deletions

View File

@@ -44,6 +44,7 @@
<bean name="multilingualContentService" class="org.alfresco.repo.model.ml.MultilingualContentServiceImpl" > <bean name="multilingualContentService" class="org.alfresco.repo.model.ml.MultilingualContentServiceImpl" >
<property name="nodeService"><ref bean="NodeService" /></property> <property name="nodeService"><ref bean="NodeService" /></property>
<property name="searchService"><ref bean="SearchService" /></property> <property name="searchService"><ref bean="SearchService" /></property>
<property name="versionService"><ref bean="VersionService" /></property>
</bean> </bean>
</beans> </beans>

View File

@@ -29,6 +29,7 @@ import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.version.Version;
import org.alfresco.service.cmr.version.VersionService; import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
@@ -279,8 +280,50 @@ public class MultilingualContentServiceImpl implements MultilingualContentServic
return mlContainerNodeRef; return mlContainerNodeRef;
} }
public NodeRef createEdition(NodeRef mlContainerNodeRef, NodeRef translationNodeRef) public void createEdition(NodeRef mlContainerNodeRef, NodeRef translationNodeRef)
{ {
throw new UnsupportedOperationException(); // Ensure that the translation given is one of the children
getOrCreateMLContainer(translationNodeRef, false);
// Get all the container's children
List<ChildAssociationRef> childAssocRefs = nodeService.getChildAssocs(
mlContainerNodeRef,
ContentModel.ASSOC_MULTILINGUAL_CHILD,
RegexQNamePattern.MATCH_ALL);
// Version the container and all its children
versionService.createVersion(mlContainerNodeRef, null, true);
// Remove all the child documents apart from the given node
boolean found = false;
for (ChildAssociationRef childAssoc : childAssocRefs)
{
NodeRef documentNodeRef = childAssoc.getChildRef();
// Is this the node to keep?
if (documentNodeRef.equals(translationNodeRef))
{
// It is, so keep it
found = true;
continue;
}
// Delete it
nodeService.deleteNode(documentNodeRef);
}
// Check that we left a document
if (!found)
{
throw new AlfrescoRuntimeException(
"The translation provided is not a child of the multilingual container: \n" +
" Container: " + mlContainerNodeRef + "\n" +
" Translation: " + translationNodeRef);
}
// Done
if (logger.isDebugEnabled())
{
// Get the version information
Version mlContainerVersion = versionService.getCurrentVersion(mlContainerNodeRef);
String mlContainerVersionLabel = mlContainerVersion.getVersionLabel();
logger.debug(
"Versioned multilingual container: \n" +
" Container: " + mlContainerNodeRef + "\n" +
" Current Version: " + mlContainerVersionLabel);
}
} }
} }

View File

@@ -16,6 +16,8 @@
*/ */
package org.alfresco.repo.model.ml; package org.alfresco.repo.model.ml;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -27,10 +29,14 @@ import org.alfresco.repo.transaction.TransactionUtil.TransactionWork;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.ml.MultilingualContentService; import org.alfresco.service.cmr.ml.MultilingualContentService;
import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.version.Version;
import org.alfresco.service.cmr.version.VersionHistory;
import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService; import org.alfresco.service.transaction.TransactionService;
@@ -51,6 +57,7 @@ public class MultilingualContentServiceImplTest extends TestCase
private TransactionService transactionService; private TransactionService transactionService;
private NodeService nodeService; private NodeService nodeService;
private FileFolderService fileFolderService; private FileFolderService fileFolderService;
private VersionService versionService;
private MultilingualContentService multilingualContentService; private MultilingualContentService multilingualContentService;
private NodeRef folderNodeRef; private NodeRef folderNodeRef;
@@ -62,6 +69,7 @@ public class MultilingualContentServiceImplTest extends TestCase
transactionService = serviceRegistry.getTransactionService(); transactionService = serviceRegistry.getTransactionService();
nodeService = serviceRegistry.getNodeService(); nodeService = serviceRegistry.getNodeService();
fileFolderService = serviceRegistry.getFileFolderService(); fileFolderService = serviceRegistry.getFileFolderService();
versionService = serviceRegistry.getVersionService();
multilingualContentService = (MultilingualContentService) ctx.getBean("MultilingualContentService"); multilingualContentService = (MultilingualContentService) ctx.getBean("MultilingualContentService");
// Run as admin // Run as admin
@@ -128,8 +136,7 @@ public class MultilingualContentServiceImplTest extends TestCase
// Check it // Check it
assertNotNull("Container not created", mlContainerNodeRef); assertNotNull("Container not created", mlContainerNodeRef);
// Check the container child count // Check the container child count
int childCount = nodeService.getChildAssocs(mlContainerNodeRef).size(); assertEquals("Incorrect number of child nodes", 1, nodeService.getChildAssocs(mlContainerNodeRef).size());
assertEquals("Incorrect number of child nodes", 1, childCount);
} }
public void testAddTranslationUsingContainer() throws Exception public void testAddTranslationUsingContainer() throws Exception
@@ -147,8 +154,7 @@ public class MultilingualContentServiceImplTest extends TestCase
// Make sure that the original container was used // Make sure that the original container was used
assertEquals("Existing container should have been used", mlContainerNodeRef, newMLContainerNodeRef); assertEquals("Existing container should have been used", mlContainerNodeRef, newMLContainerNodeRef);
// Check the container child count // Check the container child count
int childCount = nodeService.getChildAssocs(mlContainerNodeRef).size(); assertEquals("Incorrect number of child nodes", 2, nodeService.getChildAssocs(mlContainerNodeRef).size());
assertEquals("Incorrect number of child nodes", 2, childCount);
} }
public void testAddTranslationUsingContent() throws Exception public void testAddTranslationUsingContent() throws Exception
@@ -166,7 +172,51 @@ public class MultilingualContentServiceImplTest extends TestCase
// Make sure that the original container was used // Make sure that the original container was used
assertEquals("Existing container should have been used", mlContainerNodeRef, newMLContainerNodeRef); assertEquals("Existing container should have been used", mlContainerNodeRef, newMLContainerNodeRef);
// Check the container child count // Check the container child count
int childCount = nodeService.getChildAssocs(mlContainerNodeRef).size(); assertEquals("Incorrect number of child nodes", 2, nodeService.getChildAssocs(mlContainerNodeRef).size());
assertEquals("Incorrect number of child nodes", 2, childCount); }
@SuppressWarnings("unused")
public void testCreateEdition() throws Exception
{
// Make some content
NodeRef chineseContentNodeRef = createContent();
NodeRef frenchContentNodeRef = createContent();
NodeRef japaneseContentNodeRef = createContent();
// Add to container
NodeRef mlContainerNodeRef = multilingualContentService.makeTranslation(chineseContentNodeRef, Locale.CHINESE);
multilingualContentService.addTranslation(frenchContentNodeRef, mlContainerNodeRef, Locale.FRENCH);
multilingualContentService.addTranslation(japaneseContentNodeRef, mlContainerNodeRef, Locale.JAPANESE);
// Check the container child count
assertEquals("Incorrect number of child nodes", 3, nodeService.getChildAssocs(mlContainerNodeRef).size());
// Version each of the documents
List<NodeRef> nodeRefs = new ArrayList<NodeRef>(3);
nodeRefs.add(chineseContentNodeRef);
nodeRefs.add(frenchContentNodeRef);
nodeRefs.add(japaneseContentNodeRef);
versionService.createVersion(nodeRefs, null);
// Get the current versions of each of the documents
Version chineseVersionPreEdition = versionService.getCurrentVersion(chineseContentNodeRef);
Version frenchVersionPreEdition = versionService.getCurrentVersion(frenchContentNodeRef);
Version japaneseVersionPreEdition = versionService.getCurrentVersion(japaneseContentNodeRef);
// Create the edition, keeping the Chinese translation as the basis
multilingualContentService.createEdition(mlContainerNodeRef, chineseContentNodeRef);
// Check the container child count
assertEquals("Incorrect number of child nodes", 1, nodeService.getChildAssocs(mlContainerNodeRef).size());
// Get the document versions now
Version chineseVersionPostEdition = versionService.getCurrentVersion(chineseContentNodeRef);
assertFalse("Expected document to be gone", nodeService.exists(frenchContentNodeRef));
assertFalse("Expected document to be gone", nodeService.exists(japaneseContentNodeRef));
// Now be sure that we can get the required information using the version service
VersionHistory mlContainerVersionHistory = versionService.getVersionHistory(mlContainerNodeRef);
Version mlContainerRootVersion = mlContainerVersionHistory.getRootVersion();
NodeRef mlContainerRootVersionNodeRef = mlContainerRootVersion.getVersionedNodeRef();
// Get the root version's children
List<ChildAssociationRef> mlContainerRootVersionChildren = nodeService.getChildAssocs(mlContainerRootVersionNodeRef);
// Check them
// assertEquals("Incorrect number of child nodes for root version", 3, mlContainerRootVersionChildren.size());
} }
} }

View File

@@ -75,9 +75,8 @@ public interface MultilingualContentService
* *
* @param mlContainerNodeRef An existing <b>cm:mlContainer</b> * @param mlContainerNodeRef An existing <b>cm:mlContainer</b>
* @param translationNodeRef The specific <b>cm:mlDocument</b> to use as the starting point * @param translationNodeRef The specific <b>cm:mlDocument</b> to use as the starting point
* of the new edition. * of the new edition. All other translations will be removed.
* @return Returns the <b>cm:mlContainer</b>
*/ */
@Auditable(key = Auditable.Key.ARG_0, parameters = {"mlContainerNodeRef", "translationNodeRef"}) @Auditable(key = Auditable.Key.ARG_0, parameters = {"mlContainerNodeRef", "translationNodeRef"})
NodeRef createEdition(NodeRef mlContainerNodeRef, NodeRef translationNodeRef); void createEdition(NodeRef mlContainerNodeRef, NodeRef translationNodeRef);
} }