1 package org.collectionspace.services.imports.nuxeo;
\r
4 import java.util.Calendar;
\r
5 import java.util.HashMap;
\r
6 import java.util.Map;
\r
7 import java.util.TreeSet;
\r
9 import org.collectionspace.services.common.api.Tools;
\r
10 import org.collectionspace.services.nuxeo.client.java.NuxeoClientEmbedded;
\r
11 import org.collectionspace.services.nuxeo.client.java.NuxeoConnectorEmbedded;
\r
12 import org.collectionspace.services.nuxeo.client.java.RepositoryInstanceInterface;
\r
13 import org.nuxeo.ecm.core.api.DocumentModel;
\r
14 import org.nuxeo.ecm.core.api.DocumentRef;
\r
15 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;
\r
16 import org.nuxeo.ecm.core.io.DocumentPipe;
\r
17 import org.nuxeo.ecm.core.io.DocumentReader;
\r
18 import org.nuxeo.ecm.core.io.DocumentTranslationMap;
\r
19 import org.nuxeo.ecm.core.io.DocumentWriter;
\r
20 import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl;
\r
21 import org.nuxeo.ecm.core.io.impl.plugins.DocumentModelWriter;
\r
22 // we use our own override of this: import org.nuxeo.ecm.core.io.impl.plugins.XMLDirectoryReader;
\r
23 import org.slf4j.Logger;
\r
24 import org.slf4j.LoggerFactory;
\r
26 // based loosely on package org.nuxeo.ecm.shell.commands.io.ImportCommand;
\r
27 public class ImportCommand {
\r
29 private final Logger logger = LoggerFactory.getLogger(ImportCommand.class);
\r
31 public String run(String src, String repoName, String workspacesPath, int timeOut) throws Exception {
\r
32 File file = new File(src);
\r
33 ///cspace way of configuring client and auth:
\r
34 NuxeoClientEmbedded client = NuxeoConnectorEmbedded.getInstance().getClient();
\r
35 RepositoryInstanceInterface repoSession = null;
\r
37 repoSession = client.openRepository(repoName, timeOut);
\r
38 if (logger.isDebugEnabled()) {
\r
39 String msg = String.format("Start of import is Local time: %tT", Calendar.getInstance());
\r
42 return importTree(repoSession, file, workspacesPath);
\r
43 } catch (Exception e) {
\r
46 if (logger.isDebugEnabled()) {
\r
47 String msg = String.format("End of import is Local time: %tT", Calendar.getInstance());
\r
50 client.releaseRepository(repoSession);
\r
54 String importTree(RepositoryInstanceInterface repoSession, File file, String toPath) throws Exception {
\r
55 Exception failed = null;
\r
56 DocumentReader reader = null;
\r
57 DocumentWriter writer = null;
\r
58 DocumentModel docModel = null;
\r
59 DocumentRef keyDocRef, valueDocRef;
\r
61 StringBuffer dump = new StringBuffer();
\r
62 Map<String, Integer> recordsImportedForDocType = new HashMap<String, Integer>();
\r
63 Integer numRecordsImportedForDocType = new Integer(0);
\r
64 int totalRecordsImported = 0;
\r
66 if (logger.isInfoEnabled()) {
\r
67 logger.info("importTree reading file: " + file + (file != null ? " exists? " + file.exists() : " file param is null"));
\r
69 reader = new LoggedXMLDirectoryReader(file); //our overload of XMLDirectoryReader.
\r
70 writer = new DocumentModelWriter(repoSession.getRepositoryInstance(), toPath, 10);
\r
71 DocumentPipe pipe = new DocumentPipeImpl(10);
\r
72 // pipe.addTransformer(transformer);
\r
73 pipe.setReader(reader);
\r
74 pipe.setWriter(writer);
\r
75 DocumentTranslationMap dtm = pipe.run();
\r
76 Map<DocumentRef, DocumentRef> documentRefs = dtm.getDocRefMap(); // FIXME: Should be checking for null here!
\r
77 dump.append("<importedRecords>");
\r
78 for (Map.Entry entry : documentRefs.entrySet()) {
\r
79 keyDocRef = (DocumentRef) entry.getKey();
\r
80 valueDocRef = (DocumentRef) entry.getValue();
\r
81 if (keyDocRef == null || valueDocRef == null) {
\r
84 dump.append("<importedRecord>");
\r
85 docModel = repoSession.getDocument(valueDocRef);
\r
86 docType = docModel.getDocumentType().getName();
\r
87 dump.append("<doctype>" + docType + "</doctype>");
\r
88 dump.append("<csid>" + keyDocRef.toString() + "</csid>");
\r
89 dump.append("</importedRecord>");
\r
90 if (recordsImportedForDocType.containsKey(docType)) {
\r
91 numRecordsImportedForDocType = (Integer) recordsImportedForDocType.get(docType);
\r
92 numRecordsImportedForDocType = Integer.valueOf(numRecordsImportedForDocType.intValue() + 1);
\r
93 recordsImportedForDocType.put(docType, numRecordsImportedForDocType);
\r
95 recordsImportedForDocType.put(docType, 1);
\r
97 totalRecordsImported++;
\r
99 dump.append("</importedRecords>");
\r
100 } catch (Exception e) {
\r
104 String status = failed == null ? "Success" : "Failed";
\r
105 dump.append("<status>" + status + "</status>");
\r
106 dump.append("<totalRecordsImported>" + totalRecordsImported + "</totalRecordsImported>");
\r
107 dump.append("<numRecordsImportedByDocType>");
\r
108 TreeSet<String> keys = new TreeSet<String>(recordsImportedForDocType.keySet());
\r
109 for (String key : keys) {
\r
110 dump.append("<numRecordsImported>");
\r
111 dump.append("<docType>" + key + "</docType>");
\r
112 dump.append("<numRecords>" + recordsImportedForDocType.get(key).intValue() + "</numRecords>");
\r
113 dump.append("</numRecordsImported>");
\r
115 dump.append("</numRecordsImportedByDocType>");
\r
116 if (reader != null) {
\r
117 dump.append("<report>" + (((LoggedXMLDirectoryReader) reader).report()) + "</report>");
\r
120 if (writer != null) {
\r
124 if (failed != null) {
\r
125 String msg = "The Import service encountered an exception: " + failed.getLocalizedMessage();
\r
126 logger.error(msg, failed);
\r
129 return dump.toString();
\r