/* $Id$ */ /** * 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.alfresco; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import org.alfresco.webservice.types.NamedValue; import org.apache.commons.lang.StringUtils; import org.apache.manifoldcf.agents.interfaces.RepositoryDocument; import org.apache.manifoldcf.core.common.DateParser; import org.apache.manifoldcf.core.interfaces.ManifoldCFException; /** * Utility class dedicatd to manage Alfresco properties * @author Piergiorgio Lucidi * */ public class PropertiesUtils { private static final String PROP_CONTENT_PREFIX = "contentUrl"; private static final String PROP_CONTENT_SEP = "|"; private static final String PROP_MIMETYPE_SEP = "="; private static final String PROP_MODIFIED = Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, "modified"); public static String[] getPropertyValues(NamedValue[] properties, String qname){ String[] propertyValues = null; for(NamedValue property : properties){ if(property.getName().endsWith(qname)){ if(property.getIsMultiValue()){ propertyValues = property.getValues(); } else { propertyValues = new String[]{property.getValue()}; } } } return propertyValues; } public static void ingestProperties(RepositoryDocument rd, NamedValue[] properties, List<NamedValue> contentProperties) throws ManifoldCFException, ParseException{ for(NamedValue property : properties){ if(property!=null && StringUtils.isNotEmpty(property.getName())){ if(property.getIsMultiValue()){ String[] values = property.getValues(); if(values!=null){ for (String value : values) { if(StringUtils.isNotEmpty(value)){ rd.addField(property.getName(), value); } } } } else { if(StringUtils.isNotEmpty(property.getValue())){ rd.addField(property.getName(), property.getValue()); } } } } String fileName = StringUtils.EMPTY; String[] propertyValues = PropertiesUtils.getPropertyValues(properties, Constants.PROP_NAME); if(propertyValues!=null && propertyValues.length>0){ fileName = propertyValues[0]; } String mimeType = PropertiesUtils.getMimeType(contentProperties); Date createdDate = PropertiesUtils.getDatePropertyValue(properties, Constants.PROP_CREATED); Date modifiedDate = PropertiesUtils.getDatePropertyValue(properties, PROP_MODIFIED); if(StringUtils.isNotEmpty(fileName)){ rd.setFileName(fileName); } if(StringUtils.isNotEmpty(mimeType)){ rd.setMimeType(mimeType); } if(createdDate!=null){ rd.setCreatedDate(createdDate); } if(modifiedDate!=null){ rd.setModifiedDate(modifiedDate); } } /** * * @param properties * @return a list of binary properties for the current node */ public static List<NamedValue> getContentProperties(NamedValue[] properties){ List<NamedValue> contentProperties = new ArrayList<NamedValue>(); if(properties!=null){ for (NamedValue property : properties) { if(property!=null){ if(property.getIsMultiValue()!=null && !property.getIsMultiValue()){ if(StringUtils.isNotEmpty(property.getValue()) && property.getValue().startsWith(PROP_CONTENT_PREFIX)){ contentProperties.add(property); } } } } } return contentProperties; } /** * Build the Alfresco node identifier * @param properties * @return the node reference for the current document */ public static String getNodeReference(NamedValue[] properties){ String nodeReference = StringUtils.EMPTY; String storeProtocol = StringUtils.EMPTY; String storeId = StringUtils.EMPTY; String uuid = StringUtils.EMPTY; if(properties!=null){ for (NamedValue property : properties) { if(Constants.PROP_STORE_PROTOCOL.equals(property.getName())){ storeProtocol = property.getValue(); } else if(Constants.PROP_STORE_ID.equals(property.getName())){ storeId = property.getValue(); } else if(Constants.PROP_NODE_UUID.equals(property.getName())){ uuid = property.getValue(); } } } if(StringUtils.isNotEmpty(storeProtocol) && StringUtils.isNotEmpty(storeId) && StringUtils.isNotEmpty(uuid)) { nodeReference = storeProtocol+"://"+storeId+"/"+uuid; } return nodeReference; } /** * * @param properties * @return version label of the latest version of the node */ public static String getVersionLabel(NamedValue[] properties){ String[] versionLabelList = PropertiesUtils.getPropertyValues(properties, Constants.PROP_VERSION_LABEL); String versionLabel = StringUtils.EMPTY; if(versionLabelList!=null && versionLabelList.length>0){ versionLabel = versionLabelList[0]; } return versionLabel; } /** * This method returns the mimetype of the default content defined for the node. * Notice that more than one binary can be defined in a custom model of Alfresco and also that * it could exist some contents that don't have a binary * @param contentProperties * @return mimetype of the default content property */ public static String getMimeType(List<NamedValue> contentProperties){ if(contentProperties!=null && contentProperties.size()>0){ Iterator<NamedValue> i = contentProperties.iterator(); while(i.hasNext()){ NamedValue contentProperty = i.next(); if(Constants.PROP_CONTENT.equals(contentProperty.getName())){ String defaultContentPropertyValue = contentProperty.getValue(); String[] contentSplitted = StringUtils.split(defaultContentPropertyValue, PROP_CONTENT_SEP); if (contentSplitted.length > 1) { String[] mimeTypeSplitted = StringUtils.split(contentSplitted[1], PROP_MIMETYPE_SEP); return mimeTypeSplitted[1]; } return contentSplitted[0]; } } } return StringUtils.EMPTY; } /** * * @param properties * @return version label of the latest version of the node * @throws ParseException */ public static Date getDatePropertyValue(NamedValue[] properties, String qname) throws ParseException{ Date date = null; if(properties!=null && properties.length>0){ String[] propertyValues = PropertiesUtils.getPropertyValues(properties, qname); if(propertyValues!=null && propertyValues.length>0){ String dateString = propertyValues[0]; if(StringUtils.isNotEmpty(dateString)){ date = DateParser.parseISO8601Date(dateString); } } } return date; } }