This project has retired. For details please refer to its
Attic page.
FileCopier xref
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.chemistry.opencmis.client.filecopy;
20
21 import java.io.File;
22 import java.io.FileInputStream;
23 import java.io.IOException;
24 import java.util.HashMap;
25 import java.util.Map;
26
27 import org.apache.chemistry.opencmis.client.api.Document;
28 import org.apache.chemistry.opencmis.client.api.Folder;
29 import org.apache.chemistry.opencmis.client.api.ObjectId;
30 import org.apache.chemistry.opencmis.client.api.Session;
31 import org.apache.chemistry.opencmis.client.api.SessionFactory;
32 import org.apache.chemistry.opencmis.client.mapper.Configurator;
33 import org.apache.chemistry.opencmis.client.mapper.MapperException;
34 import org.apache.chemistry.opencmis.client.mapper.PropertyMapper;
35 import org.apache.chemistry.opencmis.client.parser.MetadataParser;
36 import org.apache.chemistry.opencmis.client.parser.MetadataParserTika;
37 import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
38 import org.apache.chemistry.opencmis.commons.PropertyIds;
39 import org.apache.chemistry.opencmis.commons.data.ContentStream;
40 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
41 import org.apache.chemistry.opencmis.commons.enums.VersioningState;
42 import org.apache.commons.logging.Log;
43 import org.apache.commons.logging.LogFactory;
44 import org.apache.tika.Tika;
45
46 public class FileCopier {
47
48 private static final Log LOG = LogFactory.getLog(FileCopier.class.getName());
49
50 private static final Configurator CFG = Configurator.getInstance();
51
52 private Session session;
53
54 public FileCopier() {
55 }
56
57 public void connect(Map<String, String> parameters) {
58 System.out.println("Connecting to a repository ...");
59
60
61 SessionFactory sessionFactory = SessionFactoryImpl.newInstance();
62
63 session = sessionFactory.createSession(parameters);
64
65 LOG.debug("Got a connection to repository.");
66 }
67
68 public void copyRecursive(String folderName, String folderId) {
69
70 try {
71 File fileOrDir = new File(folderName);
72 if (fileOrDir.isDirectory()) {
73 String newFolderId = createFolderInRepository(fileOrDir.getAbsolutePath(), folderId);
74 File[] children = fileOrDir.listFiles();
75 for (File file: children) {
76 if (!file.getName().equals(".") && !file.getName().equals("..")) {
77 copyRecursive(file.getAbsolutePath(), newFolderId);
78 }
79 }
80 } else {
81 copyFileToRepository(fileOrDir.getAbsolutePath(), folderId);
82 }
83 } catch (Exception e) {
84 LOG.error(e);
85 } finally {
86 }
87 }
88
89 private String copyFileToRepository(String fileName, String folderId) {
90 LOG.debug("uploading file " + fileName);
91 FileInputStream is = null;
92 Map<String, Object> properties = new HashMap<String, Object>();
93 Folder parentFolder;
94 String id = null;
95
96 if (null == folderId)
97 parentFolder = session.getRootFolder();
98 else
99 parentFolder = (Folder) session.getObject(folderId);
100
101 try {
102 File f = new File(fileName);
103 Tika tika = new Tika();
104 String mimeType = tika.detect(f);
105 LOG.info("Detected MIME type: "+ mimeType);
106
107
108 MetadataParser parser = CFG.getParser(mimeType);
109 if (null == parser) {
110 properties.put(PropertyIds.NAME, f.getName());
111 properties.put(PropertyIds.OBJECT_TYPE_ID, CFG.getDefaultDocumentType());
112 } else {
113 parser.reset();
114 PropertyMapper mapper = CFG.getPropertyMapper(mimeType);
115 if (null == mapper)
116 throw new MapperException("Unknown mime type (no configuration): " + mimeType);
117 String typeId = mapper.getMappedTypeId();
118 if (null == typeId)
119 throw new MapperException("No CMIS type configured for mime type" + mimeType);
120 TypeDefinition td = session.getTypeDefinition(typeId);
121 if (null == td)
122 throw new MapperException("CMIS type " + typeId + " does not exist on server.");
123
124 LOG.info("Detected MIME type: "+ mimeType + " is mapped to CMIS type id: " + td.getId());
125 parser.extractMetadata(f, td);
126 properties = parser.getCmisProperties();
127 }
128
129
130 int posLastDot = f.getName().indexOf('.');
131 String ext = posLastDot < 0 ? null : f.getName().substring(posLastDot+1, f.getName().length());
132 String overridden = null;
133 if (null != ext && (overridden = CFG.getContentType(ext)) != null)
134 mimeType = overridden;
135 long length = f.length();
136
137 is = new FileInputStream(fileName);
138
139 ContentStream contentStream = session.getObjectFactory().createContentStream(fileName,
140 length, mimeType, is);
141 if (!properties.containsKey(PropertyIds.NAME))
142 properties.put(PropertyIds.NAME, f.getName());
143 Document doc = parentFolder.createDocument(properties, contentStream, VersioningState.NONE);
144 id = doc.getId();
145 LOG.info("New document created with id: " + id + ", name: " + properties.get(PropertyIds.NAME) + " in folder: " + parentFolder.getId());
146 } catch (Exception e) {
147 LOG.error("Failed to create CMIS document.", e);
148 } finally {
149 if (null != is) {
150 try {
151 is.close();
152 } catch (IOException e) {
153 LOG.error(e);
154 }
155 }
156 LOG.debug("Conversion and transfer done.");
157 }
158 return id;
159 }
160
161 private String createFolderInRepository(String fileName, String parentFolderId) {
162 Folder parentFolder;
163 String id = null;
164 if (null == parentFolderId)
165 parentFolder = session.getRootFolder();
166 else
167 parentFolder = (Folder) session.getObject(parentFolderId);
168 Map<String, Object> properties = new HashMap<String, Object>();
169 File f = new File(fileName);
170 properties.put(PropertyIds.NAME, f.getName());
171 properties.put(PropertyIds.OBJECT_TYPE_ID, CFG.getDefaultFolderType());
172 try {
173 Folder folder = parentFolder.createFolder(properties);
174 id = folder.getId();
175 LOG.debug("New folder created with id: " + folder.getId() + ", path: " + folder.getPaths().get(0));
176 } catch (Exception e) {
177 LOG.error("Failed to create CMIS document.", e);
178 } finally {
179 }
180 LOG.info("New folder created with id: " + id + ", name: " + properties.get(PropertyIds.NAME) + " in parent folder: " + parentFolder.getId());
181 return id;
182 }
183
184 public void listMetadata(String fileName) {
185 try {
186 File f = new File(fileName);
187 Tika tika = new Tika();
188 String mimeType = tika.detect(f);
189 LOG.info("Detected MIME type: "+ mimeType);
190
191
192 MetadataParser parser = CFG.getParser(mimeType);
193 if (null == parser) {
194 LOG.warn("Unknown content type " + mimeType + " no metadata found, listing all tags found in file.");
195 MetadataParserTika mpt = new MetadataParserTika();
196 mpt.listMetadata(f);
197 } else {
198 PropertyMapper mapper = CFG.getPropertyMapper(mimeType);
199 if (null == mapper)
200 throw new MapperException("Unknown mime type (no configuration): " + mimeType);
201 String typeId = mapper.getMappedTypeId();
202 if (null == typeId)
203 throw new MapperException("No CMIS type configured for mime type" + mimeType);
204
205
206 TypeDefinition td = null;
207 if (null!= session) {
208 session.getTypeDefinition(typeId);
209 if (null == td)
210 throw new MapperException("CMIS type " + typeId + " does not exist on server.");
211 }
212 LOG.info("Detected MIME type: "+ mimeType + " is mapped to CMIS type id: " + td.getId());
213
214 parser.extractMetadata(f, td);
215 Map<String, Object> properties = parser.getCmisProperties();
216 for (String key : properties.keySet()) {
217 LOG.info("Found metadata tag " + key + "mapped to " + properties.get(key));
218 }
219 }
220 } catch (Exception e) {
221 LOG.error("Failed to list metadata", e);
222 } finally {
223 }
224 LOG.debug("Conversion and transfer done.");
225 }
226
227 static public void main(String[] args) {
228 String fileName = args[0];
229 LOG.debug("extracting CMIS properties for file " + fileName);
230 try {
231 new FileCopier().listMetadata(fileName);
232 } catch (Exception e) {
233 LOG.error(e);
234 } finally {
235 }
236 LOG.debug("Extraction done.");
237 }
238 }