This project has retired. For details please refer to its Attic page.
FileCopier xref

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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      // initialize configurator to get parsers and property mappings
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          // Create a SessionFactory and set up the SessionParameter map
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             // extract metadata: first get a parser
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             // check if there is an overridden content type configured
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             // extract metadata: first get a parser
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                 // Session available? if yes do conversion
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 }