Option to export content as node folder hierarchy inside ACP

- enable with following setters on ACPExportPackageHandler
        ACPExportPackageHandler acpHandler = new ACPExportPackageHandler(...);
        acpHandler.setNodeService(nodeService);
        acpHandler.setExportAsFolders(true);

- results in ACP contents as follows:
   /export.xml
   /content
        /a
           /b.txt
           /b
             /c.pdf

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16078 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
David Caruana
2009-09-03 18:41:17 +00:00
parent 786bca9a67
commit b5b09541ef
3 changed files with 86 additions and 14 deletions

View File

@@ -33,8 +33,14 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.repository.Path.ChildAssocElement;
import org.alfresco.service.cmr.view.ExportPackageHandler; import org.alfresco.service.cmr.view.ExportPackageHandler;
import org.alfresco.service.cmr.view.ExporterException; import org.alfresco.service.cmr.view.ExporterException;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
@@ -54,6 +60,7 @@ public class ACPExportPackageHandler
public final static String ACP_EXTENSION = "acp"; public final static String ACP_EXTENSION = "acp";
protected MimetypeService mimetypeService; protected MimetypeService mimetypeService;
protected NodeService nodeService;
protected OutputStream outputStream; protected OutputStream outputStream;
protected File dataFile; protected File dataFile;
protected File contentDir; protected File contentDir;
@@ -61,7 +68,8 @@ public class ACPExportPackageHandler
protected OutputStream tempDataFileStream; protected OutputStream tempDataFileStream;
protected ZipOutputStream zipStream; protected ZipOutputStream zipStream;
protected int iFileCnt = 0; protected int iFileCnt = 0;
protected boolean exportAsFolders;
/** /**
* Construct * Construct
@@ -120,6 +128,25 @@ public class ACPExportPackageHandler
this.mimetypeService = mimetypeService; this.mimetypeService = mimetypeService;
} }
/**
* @param nodeService
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* Export content into folder structure of nodes
*
* @param exportAsFolders
*/
public void setExportAsFolders(boolean exportAsFolders)
{
this.exportAsFolders = exportAsFolders;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.service.cmr.view.ExportPackageHandler#startExport() * @see org.alfresco.service.cmr.view.ExportPackageHandler#startExport()
*/ */
@@ -165,23 +192,33 @@ public class ACPExportPackageHandler
{ {
contentDirPath = contentDirPath.substring(0, contentDirPath.lastIndexOf(".")); contentDirPath = contentDirPath.substring(0, contentDirPath.lastIndexOf("."));
} }
String extension = "bin";
if (mimetypeService != null) File file;
if (exportAsFolders && nodeService != null && contentData instanceof NodeContentData)
{ {
String mimetype = contentData.getMimetype(); NodeContentData nodeContentData = (NodeContentData)contentData;
if (mimetype != null && mimetype.length() > 0) file = new File(contentDirPath + toDisplayPath(nodeService.getPath(nodeContentData.getNodeRef())));
}
else
{
String extension = "bin";
if (mimetypeService != null)
{ {
try String mimetype = contentData.getMimetype();
if (mimetype != null && mimetype.length() > 0)
{ {
extension = mimetypeService.getExtension(mimetype); try
} {
catch(AlfrescoRuntimeException e) extension = mimetypeService.getExtension(mimetype);
{ }
// use default extension catch(AlfrescoRuntimeException e)
{
// use default extension
}
} }
} }
file = new File(contentDirPath, "content" + iFileCnt++ + "." + extension);
} }
File file = new File(contentDirPath, "content" + iFileCnt++ + "." + extension);
try try
{ {
@@ -267,4 +304,32 @@ public class ACPExportPackageHandler
} }
} }
/**
* @param path
* @return display path
*/
private String toDisplayPath(Path path)
{
StringBuffer displayPath = new StringBuffer();
if (path.size() == 1)
{
displayPath.append("/");
}
else
{
for (int i = 1; i < path.size(); i++)
{
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement)
{
ChildAssociationRef assocRef = ((ChildAssocElement)element).getRef();
NodeRef node = assocRef.getChildRef();
displayPath.append("/");
displayPath.append(nodeService.getProperty(node, ContentModel.PROP_NAME));
}
}
}
return displayPath.toString();
}
} }

View File

@@ -111,7 +111,14 @@ public class ExporterComponentTest extends BaseSpringTest
parameters.setExportFrom(location); parameters.setExportFrom(location);
// parameters.setExcludeAspects(new QName[] { ContentModel.ASPECT_AUDITABLE }); // parameters.setExcludeAspects(new QName[] { ContentModel.ASPECT_AUDITABLE });
// parameters.setExcludeChildAssocs(new QName[] { ContentModel.ASSOC_CONTAINS }); // parameters.setExcludeChildAssocs(new QName[] { ContentModel.ASSOC_CONTAINS });
exporterService.exportView(output, parameters, testProgress);
File acpFile = TempFileProvider.createTempFile("alf", ACPExportPackageHandler.ACP_EXTENSION);
File dataFile = new File("test");
File contentDir = new File("test");
ACPExportPackageHandler acpHandler = new ACPExportPackageHandler(new FileOutputStream(acpFile), dataFile, contentDir, null);
acpHandler.setNodeService(nodeService);
acpHandler.setExportAsFolders(true);
exporterService.exportView(acpHandler, parameters, testProgress);
output.close(); output.close();
} }

View File

@@ -224,7 +224,7 @@ import org.alfresco.util.ParameterCheck;
public void content(NodeRef nodeRef, QName property, InputStream content, ContentData contentData, int index) public void content(NodeRef nodeRef, QName property, InputStream content, ContentData contentData, int index)
{ {
// Handle the stream by converting it to a URL and export the URL // Handle the stream by converting it to a URL and export the URL
ContentData exportedContentData = streamHandler.exportContent(content, contentData); ContentData exportedContentData = streamHandler.exportContent(content, new NodeContentData(nodeRef, contentData));
value(nodeRef, property, exportedContentData, index); value(nodeRef, property, exportedContentData, index);
} }