/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.manifoldcf.crawler.connectors.nuxeo.model; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.nuxeo.client.api.NuxeoClient; import org.nuxeo.client.api.objects.Document; import org.nuxeo.client.api.objects.Documents; import org.nuxeo.client.api.objects.Operation; import org.nuxeo.client.api.objects.acl.ACE; import org.nuxeo.client.api.objects.acl.ACL; import org.nuxeo.client.api.objects.blob.Blob; import com.google.common.collect.Maps; public class DocumentManifold { private static final String URI_TAGGING = "SELECT * FROM Tagging"; private static final String DEFAULT_MIMETYPE = "text/html; charset=utf-8"; private static final String[] avoid_properties = { "file:filename", "file:content", "files:files" }; public Document document; public InputStream content; protected String mimetype; public static final String DELETED = "deleted"; public static final String DOC_UID = "uid"; public static final String DOC_ENTITY_TYPE = "entity-type"; public static final String DOC_LAST_MODIFIED = "last-modified"; public static final String DOC_STATE = "state"; // Constructor public DocumentManifold(Document document) { this.document = document; processDocument(); } /** * * * @return Map<String, Object> */ public Map<String, Object> getMetadata() { Map<String, Object> docMetadata = Maps.newHashMap(); for (Entry<String, Object> property : this.document.getProperties().entrySet()) { if (!Arrays.asList(avoid_properties).contains(property.getKey())) { addIfNotEmpty(docMetadata, property.getKey(), property.getValue()); } } addIfNotEmpty(docMetadata, DOC_UID, this.document.getUid()); addIfNotEmpty(docMetadata, DOC_ENTITY_TYPE, this.document.getEntityType()); addIfNotEmpty(docMetadata, DOC_LAST_MODIFIED, this.document.getLastModified()); addIfNotEmpty(docMetadata, DOC_STATE, this.document.getState()); return docMetadata; } public void addIfNotEmpty(Map<String, Object> docMetadata, String key, Object obj) { if (obj != null && ((obj instanceof String && !((String) obj).isEmpty()) || !(obj instanceof String))) { docMetadata.put(key, obj); } } private void processDocument() { // Content InputStream is = null; String mimetype = null; try { is = document.fetchBlob().getStream(); this.mimetype = (String) ((LinkedHashMap<?, ?>) this.getDocument().get("file:content")).get("mime-type"); } catch (Exception ex) { is = new ByteArrayInputStream("".getBytes()); mimetype = DEFAULT_MIMETYPE; } this.content = is; this.mimetype = mimetype; } // GETTERS AND SETERS public Document getDocument() { return this.document; } public String getMimeType() { return this.mimetype; } public int getLenght() { int size; try { size = this.getContent().available(); } catch (IOException ex) { size = 0; } return size; } public InputStream getContent() { return this.content; } public String[] getPermissions(NuxeoClient nuxeoClient) { List<String> permissions = new ArrayList<String>(); try { for (ACL acl : this.getDocument().fetchPermissions().getAcls()) { for (ACE ace : acl.getAces()) { if (ace.getStatus().equalsIgnoreCase("effective") && ace.getGranted().equalsIgnoreCase("true")) { permissions.add(ace.getUsername()); } } } return permissions.toArray(new String[permissions.size()]); } catch (Exception e) { return new String[] {}; } } public List<Attachment> getAttachments(NuxeoClient nuxeoClient) { List<Attachment> attachments = new ArrayList<Attachment>(); List<?> arrayList = (List<?>) this.document.get(Attachment.ATT_KEY_FILES); for (Object object : arrayList) { Attachment attach = new Attachment(); LinkedHashMap<?, ?> file = (LinkedHashMap<?, ?>) ((LinkedHashMap<?, ?>) object) .get(Attachment.ATT_KEY_FILE); attach.name = (String) file.get("name"); attach.encoding = (String) file.get("encoding"); attach.mime_type = (String) file.get("mime-type"); attach.digestAlgorithm = (String) file.get("digestAlgorithm"); attach.digest = (String) file.get("digest"); attach.length = Long.valueOf((String) file.get("length")); attach.url = (String) file.get("data"); try { Blob blob = nuxeoClient.repository().fetchBlobById(this.document.getUid(), getAttachPath(attach.url)); attach.data = blob.getStream(); } catch (Exception ex) { attach.data = new ByteArrayInputStream("".getBytes()); } attachments.add(attach); } return attachments; } public String getAttachPath(String absolutePath) { String[] splitPath = absolutePath.split("/"); int size = splitPath.length; String path = String.join("/", splitPath[size - 4], splitPath[size - 3], splitPath[size - 2]); return path; } public String[] getTags(NuxeoClient nuxeoClient) { try { Operation op = nuxeoClient.automation("Repository.Query").param("query", URI_TAGGING + " where relation:source='" + this.document.getUid() + "'"); Documents tags = op.execute(); List<String> ls = new ArrayList<String>(); for (Document tag : tags.getDocuments()) { ls.add(tag.getTitle()); } return ls.toArray(new String[tags.size()]); } catch (Exception e) { return new String[] {}; } } }