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