]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
7e66710419cf488c2bab279605b206eaef09cdb5
[tmp/jakarta-migration.git] /
1 package org.collectionspace.services.imports.nuxeo;
2
3 import java.io.File;
4 import java.util.Calendar;
5 import java.util.HashMap;
6 import java.util.Map;
7 import java.util.TreeSet;
8
9 import org.collectionspace.services.nuxeo.client.java.NuxeoClientEmbedded;
10 import org.collectionspace.services.nuxeo.client.java.NuxeoConnectorEmbedded;
11 import org.collectionspace.services.nuxeo.client.java.CoreSessionInterface;
12
13 import org.nuxeo.ecm.core.api.DocumentModel;
14 import org.nuxeo.ecm.core.api.DocumentRef;
15 import org.nuxeo.ecm.core.io.DocumentPipe;
16 import org.nuxeo.ecm.core.io.DocumentReader;
17 import org.nuxeo.ecm.core.io.DocumentTranslationMap;
18 import org.nuxeo.ecm.core.io.DocumentWriter;
19 import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl;
20 import org.nuxeo.ecm.core.io.impl.plugins.DocumentModelWriter;
21 // we use our own override of this: import org.nuxeo.ecm.core.io.impl.plugins.XMLDirectoryReader;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 // based loosely on package org.nuxeo.ecm.shell.commands.io.ImportCommand;
26 public class ImportCommand {
27
28     private final Logger logger = LoggerFactory.getLogger(ImportCommand.class);
29
30     public String run(String src, String repoName, String workspacesPath, int timeout) throws Exception {
31         File file = new File(src);
32         ///cspace way of configuring client and auth:
33         NuxeoClientEmbedded client = NuxeoConnectorEmbedded.getInstance().getClient();
34         CoreSessionInterface repoSession = null;
35         try {
36             repoSession = client.openRepository(repoName, timeout);
37             if (logger.isDebugEnabled()) {
38                 String msg = String.format("Start of import is Local time: %tT", Calendar.getInstance());
39                 logger.debug(msg);
40             }
41             return importTree(repoSession, file, workspacesPath, timeout);
42         } catch (Exception e) {
43             throw e;
44         } finally {
45             if (logger.isDebugEnabled()) {
46                 String msg = String.format("End of import is Local time: %tT", Calendar.getInstance());
47                 logger.debug(msg);
48             }
49             client.releaseRepository(repoSession);
50         }
51     }
52
53     /*
54      * If the import exceeds the number of seconds in 'timeout', we'll thrown an exception and rollback all import work
55      */
56     String importTree(CoreSessionInterface repoSession, File file, String toPath, int timeout) throws Exception {
57         Exception failed = null;
58         DocumentReader reader = null;
59         DocumentWriter writer = null;
60         DocumentModel docModel = null;
61         DocumentRef keyDocRef, valueDocRef;
62         String docType;
63         StringBuffer dump = new StringBuffer();
64         Map<String, Integer> recordsImportedForDocType = new HashMap<String, Integer>();
65         Integer numRecordsImportedForDocType = new Integer(0);
66         int totalRecordsImported = 0;
67         try {
68             if (logger.isInfoEnabled()) {
69                 logger.info("ImportCommand.importTree() method reading file: " + file + (file != null ? " exists? " + file.exists() : " file param is null"));
70                 logger.info(String.format("ImportCommand.importTree() will timeout if import does not complete in %d seconds.", timeout));
71             }
72             reader = new LoggedXMLDirectoryReader(file, timeout);  //our overload of XMLDirectoryReader.
73             writer = new DocumentModelWriter(repoSession.getCoreSession(), toPath, 10);
74             DocumentPipe pipe = new DocumentPipeImpl(10);
75             // pipe.addTransformer(transformer);
76             pipe.setReader(reader);
77             pipe.setWriter(writer);
78             DocumentTranslationMap dtm = pipe.run();
79             Map<DocumentRef, DocumentRef> documentRefs = dtm.getDocRefMap(); // FIXME: Should be checking for null here!
80             dump.append("<importedRecords>");
81             for (Map.Entry<DocumentRef, DocumentRef> entry : documentRefs.entrySet()) {
82                 keyDocRef = (DocumentRef) entry.getKey();
83                 valueDocRef = (DocumentRef) entry.getValue();
84                 if (keyDocRef == null || valueDocRef == null) {
85                     continue;
86                 }
87                 dump.append("<importedRecord>");
88                 docModel = repoSession.getDocument(valueDocRef);
89                 docType = docModel.getDocumentType().getName();
90                 dump.append("<doctype>" + docType + "</doctype>");
91                 dump.append("<csid>" + keyDocRef.toString() + "</csid>");
92                 dump.append("</importedRecord>");
93                 if (recordsImportedForDocType.containsKey(docType)) {
94                     numRecordsImportedForDocType = (Integer) recordsImportedForDocType.get(docType);
95                     numRecordsImportedForDocType = Integer.valueOf(numRecordsImportedForDocType.intValue() + 1);
96                     recordsImportedForDocType.put(docType, numRecordsImportedForDocType);
97                 } else {
98                     recordsImportedForDocType.put(docType, 1);
99                 }
100                 totalRecordsImported++;
101             }
102             dump.append("</importedRecords>");
103         } catch (Exception e) {
104             failed = e;
105             throw failed;
106         } finally {
107             String status = failed == null ? "Success" : "Failed";
108             dump.append("<status>" + status + "</status>");
109             dump.append("<totalRecordsImported>" + totalRecordsImported + "</totalRecordsImported>");
110             dump.append("<numRecordsImportedByDocType>");
111             TreeSet<String> keys = new TreeSet<String>(recordsImportedForDocType.keySet());
112             for (String key : keys) {
113                 dump.append("<numRecordsImported>");
114                 dump.append("<docType>" + key + "</docType>");
115                 dump.append("<numRecords>" + recordsImportedForDocType.get(key).intValue() + "</numRecords>");
116                 dump.append("</numRecordsImported>");
117             }
118             dump.append("</numRecordsImportedByDocType>");
119             if (reader != null) {
120                 dump.append("<report>" + (((LoggedXMLDirectoryReader) reader).report()) + "</report>");
121                 reader.close();
122             }
123             if (writer != null) {
124                 writer.close();
125             }
126
127             if (failed != null) {
128                 String msg = "The Import service encountered an exception: " + failed.getLocalizedMessage();
129                 logger.error(msg, failed);
130             }
131         }
132         return dump.toString();
133     }
134 }