]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
32d6dc5c3e3d57af47fa05e47e5b566c9c829b6f
[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 \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
25 \r
26 // based loosely on package org.nuxeo.ecm.shell.commands.io.ImportCommand;\r
27 public class ImportCommand {\r
28 \r
29     private final Logger logger = LoggerFactory.getLogger(ImportCommand.class);\r
30 \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
36         try {\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
40                 logger.debug(msg);\r
41             }\r
42             return importTree(repoSession, file, workspacesPath);\r
43         } catch (Exception e) {\r
44             throw e;\r
45         } finally {\r
46             if (logger.isDebugEnabled()) {\r
47                 String msg = String.format("End of import is Local time: %tT", Calendar.getInstance());\r
48                 logger.debug(msg);\r
49             }\r
50             client.releaseRepository(repoSession);\r
51         }\r
52     }\r
53 \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
60         String docType;\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
65         try {\r
66             if (logger.isInfoEnabled()) {\r
67                 logger.info("importTree reading file: " + file + (file != null ? " exists? " + file.exists() : " file param is null"));\r
68             }\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
82                     continue;\r
83                 }\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
94                 } else {\r
95                     recordsImportedForDocType.put(docType, 1);\r
96                 }\r
97                 totalRecordsImported++;\r
98             }\r
99             dump.append("</importedRecords>");\r
100         } catch (Exception e) {\r
101             failed = e;\r
102             throw failed;\r
103         } finally {\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
114             }\r
115             dump.append("</numRecordsImportedByDocType>");\r
116             if (reader != null) {\r
117                 dump.append("<report>" + (((LoggedXMLDirectoryReader) reader).report()) + "</report>");\r
118                 reader.close();\r
119             }\r
120             if (writer != null) {\r
121                 writer.close();\r
122             }\r
123 \r
124             if (failed != null) {\r
125                 String msg = "The Import service encountered an exception: " + failed.getLocalizedMessage();\r
126                 logger.error(msg, failed);\r
127             }\r
128         }\r
129         return dump.toString();\r
130     }\r
131 }