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