package jp.aegif.nemaki.util; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.List; import java.util.TimeZone; import jp.aegif.nemaki.model.Content; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.data.ObjectData; import org.apache.chemistry.opencmis.commons.data.Properties; import org.apache.chemistry.opencmis.commons.data.PropertyBoolean; import org.apache.chemistry.opencmis.commons.data.PropertyData; import org.apache.chemistry.opencmis.commons.data.PropertyId; import org.apache.chemistry.opencmis.commons.data.PropertyString; import org.apache.chemistry.opencmis.commons.definitions.Choice; import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition; import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition; import org.apache.chemistry.opencmis.commons.enums.Cardinality; import org.apache.chemistry.opencmis.commons.enums.CmisVersion; import org.apache.chemistry.opencmis.commons.enums.DateTimeResolution; import org.apache.chemistry.opencmis.commons.enums.DecimalPrecision; import org.apache.chemistry.opencmis.commons.enums.PropertyType; import org.apache.chemistry.opencmis.commons.enums.Updatability; import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException; import org.apache.chemistry.opencmis.commons.impl.WSConverter; import org.apache.chemistry.opencmis.commons.impl.dataobjects.AbstractPropertyDefinition; import org.apache.chemistry.opencmis.commons.impl.dataobjects.ChoiceImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.ObjectDataImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyBooleanDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDateTimeDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyHtmlDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIdDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl; import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyUriDefinitionImpl; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.document.DateTools.Resolution; public class DataUtil { private static final String NAMESPACE = "http://www.aegif.jp/Nemaki"; private static final Log log = LogFactory.getLog(DataUtil.class); public static String getObjectTypeId(Properties properties) { PropertyData<?> typeProperty = properties.getProperties().get( PropertyIds.OBJECT_TYPE_ID); if (!(typeProperty instanceof PropertyId)) { throw new CmisInvalidArgumentException("Type id must be set!"); } String typeId = ((PropertyId) typeProperty).getFirstValue(); if (typeId == null) { throw new CmisInvalidArgumentException("Type id must be set!"); } return typeId; } public static String getStringProperty(Properties properties, String name) { PropertyData<?> property = properties.getProperties().get(name); if (!(property instanceof PropertyString)) { return null; } return ((PropertyString) property).getFirstValue(); } public static Boolean getBooleanProperty(Properties properties, String name) { PropertyData<?> property = properties.getProperties().get(name); if (!(property instanceof PropertyBoolean)) { return null; } return ((PropertyBoolean) property).getFirstValue(); } public static String getIdProperty(Properties properties, String name) { PropertyData<?> property = properties.getProperties().get(name); if (!(property instanceof PropertyId)) { return null; } return ((PropertyId) property).getFirstValue(); } public static List<String> getIdListProperty(Properties properties, String name) { PropertyData<?> property = properties.getProperties().get(name); if (!(property instanceof PropertyId)) { return null; } return ((PropertyId) property).getValues(); } public static List<String> getIds(List<Content> list) { List<String> ids = new ArrayList<String>(); for (Content c : list) { ids.add(c.getId()); } return ids; } public static GregorianCalendar millisToCalendar(long millis) { GregorianCalendar calendar = new GregorianCalendar(); calendar.setTimeZone(TimeZone.getTimeZone("GMT")); calendar.setTimeInMillis(millis); return calendar; } // /////////////////////////////////////////////// // Type // /////////////////////////////////////////////// public static TypeDefinition copyTypeDefinition(TypeDefinition type) { try { return WSConverter.convert(WSConverter.convert(type)); } catch (Exception e) { return null; } } public static PropertyDefinition<?> createPropDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean required, boolean queryable, boolean inherited, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, boolean orderable, List<?> defaultValue, Long minValue, Long maxValue, Resolution resolution, DecimalPrecision decimalPrecision, BigDecimal decimalMinValue, BigDecimal decimalMaxValue, Long maxLength ) { PropertyDefinition<?> result = null; if (datatype != null) { switch (datatype) { case BOOLEAN: result = createPropBooleanDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(Boolean.class, defaultValue)); break; case DATETIME: result = createPropDateTimeDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(GregorianCalendar.class, defaultValue), DateTimeResolution.TIME); break; case DECIMAL: result = createPropDecimalDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(BigDecimal.class, defaultValue), DecimalPrecision.BITS64, null, null); break; case HTML: result = createPropHtmlDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(String.class, defaultValue)); break; case ID: result = createPropIdDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(String.class, defaultValue)); break; case INTEGER: result = createPropIntegerDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(BigInteger.class, defaultValue), null, null); break; case STRING: result = createPropStringDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(String.class, defaultValue), null); break; case URI: result = createPropUriDef(id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, choices, openChoice, convertListType(String.class, defaultValue)); break; default: throw new RuntimeException("Unknown datatype! Spec change?"); } } return result; } public static <T> List<T> convertListType(final Class<T> clazz, List<?> list) { if (CollectionUtils.isEmpty(list)) return null; List<T> result = new ArrayList<T>(); for (Object o : list) { result.add(clazz.cast(o)); } return result; } public static <T> List<Choice<T>> convertChoices(Class<T> clazz, List<jp.aegif.nemaki.model.Choice> choices) { if (CollectionUtils.isEmpty(choices)) { return null; } else { List<Choice<T>> results = new ArrayList<Choice<T>>(); for (jp.aegif.nemaki.model.Choice choice : choices) { ChoiceImpl<T> cmisChoice = new ChoiceImpl<T>(); // displayName cmisChoice.setDisplayName(choice.getDisplayName()); // value List<Object> value = choice.getValue(); List<T> convertedValue = new ArrayList<T>(); for (Object obj : value) { convertedValue.add((T) obj); } cmisChoice.setValue(convertedValue); // children List<jp.aegif.nemaki.model.Choice> children = choice .getChildren(); List<Choice<T>> convertedChildren = convertChoices(clazz, children); cmisChoice.setChoice(convertedChildren); results.add(cmisChoice); } return results; } } public static PropertyDefinition<?> createPropBooleanDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<Boolean> defaultValue) { // Set base attributes PropertyBooleanDefinitionImpl result = new PropertyBooleanDefinitionImpl(); result = (PropertyBooleanDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(Boolean.class, choices)); result.setDefaultValue(defaultValue); return result; } public static PropertyDefinition<?> createPropDateTimeDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<GregorianCalendar> defaultValue, DateTimeResolution resolution) { // Set base attributes PropertyDateTimeDefinitionImpl result = new PropertyDateTimeDefinitionImpl(); result = (PropertyDateTimeDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(GregorianCalendar.class, choices)); result.setDefaultValue(defaultValue); // Set DateTime-specific attributes result.setDateTimeResolution(resolution); return result; } public static PropertyDefinition<?> createPropDecimalDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<BigDecimal> defaultValue, DecimalPrecision precision, BigDecimal minValue, BigDecimal maxValue) { // Set base attributes PropertyDecimalDefinitionImpl result = new PropertyDecimalDefinitionImpl(); result = (PropertyDecimalDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(BigDecimal.class, choices)); result.setDefaultValue(defaultValue); // Set Decimal-specific attributes result.setMinValue(minValue); result.setMaxValue(maxValue); return result; } public static PropertyDefinition<?> createPropHtmlDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<String> defaultValue) { // Set base attributes PropertyHtmlDefinitionImpl result = new PropertyHtmlDefinitionImpl(); result = (PropertyHtmlDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(String.class, choices)); result.setDefaultValue(defaultValue); return result; } public static PropertyDefinition<?> createPropIdDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<String> defaultValue) { // Set base attributes PropertyIdDefinitionImpl result = new PropertyIdDefinitionImpl(); result = (PropertyIdDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(String.class, choices)); result.setDefaultValue(defaultValue); return result; } public static PropertyDefinition<?> createPropIntegerDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<BigInteger> defaultValue, BigInteger minValue, BigInteger maxValue) { // Set base attributes PropertyIntegerDefinitionImpl result = new PropertyIntegerDefinitionImpl(); result = (PropertyIntegerDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(BigInteger.class, choices)); result.setDefaultValue(defaultValue); // Set Integer-specific attributes result.setMinValue(minValue); result.setMaxValue(maxValue); return result; } public static PropertyDefinition<?> createPropStringDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<String> defaultValue, BigInteger maxLength) { // Set base attributes PropertyStringDefinitionImpl result = new PropertyStringDefinitionImpl(); result = (PropertyStringDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(String.class, choices)); result.setDefaultValue(defaultValue); // Set String-specific attributes if (maxLength != null) result.setMaxLength(maxLength); return result; } public static PropertyDefinition<?> createPropUriDef(String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, List<jp.aegif.nemaki.model.Choice> choices, boolean openChoice, List<String> defaultValue) { // Set base attributes PropertyUriDefinitionImpl result = new PropertyUriDefinitionImpl(); result = (PropertyUriDefinitionImpl) createPropBaseDef(result, id, localName, localNameSpace, queryName, displayName, description, datatype, cardinality, updatability, inherited, required, queryable, orderable, openChoice); result.setChoices(convertChoices(String.class, choices)); result.setDefaultValue(defaultValue); return result; } public static PropertyDefinition<?> createPropBaseDef( AbstractPropertyDefinition<?> result, String id, String localName, String localNameSpace, String queryName, String displayName, String description, PropertyType datatype, Cardinality cardinality, Updatability updatability, boolean inherited, boolean required, boolean queryable, boolean orderable, boolean openChoice) { // Set default value if not set(null) localName = (localName == null) ? id : localName; localNameSpace = (localNameSpace == null) ? NAMESPACE : localNameSpace; queryName = (queryName == null) ? id : queryName; displayName = (displayName == null) ? id : displayName; description = (description == null) ? id : description; // Set base attributes result.setId(id); result.setLocalName(localName); result.setLocalNamespace(localNameSpace); result.setQueryName(queryName); result.setDisplayName(displayName); result.setDescription(description); result.setPropertyType(datatype); result.setCardinality(cardinality); result.setUpdatability(updatability); result.setIsInherited(inherited); result.setIsRequired(required); result.setIsQueryable(queryable); result.setIsOrderable(orderable); result.setIsOpenChoice(openChoice); return result; } public static PropertyDefinition<?> createPropDefCore(String id, String queryName, PropertyType propertyType, Cardinality cardinality) { PropertyDefinition<?> core = createPropDef(id, null, null, queryName, null, null, propertyType, cardinality, null, false, false, false, null, false, false, null, null, null, null, null, null, null, null); return core; } public static ObjectData copyObjectData(ObjectData objectData) { try { return WSConverter.convert(WSConverter.convert(objectData, CmisVersion.CMIS_1_1)); } catch (Exception e) { return null; } } public static ObjectDataImpl convertObjectDataImpl(ObjectData objectData){ ObjectDataImpl result = new ObjectDataImpl(); result.setAcl(objectData.getAcl()); result.setAllowableActions(objectData.getAllowableActions()); result.setChangeEventInfo(objectData.getChangeEventInfo()); result.setExtensions(objectData.getExtensions()); result.setIsExactAcl(objectData.isExactAcl()); result.setPolicyIds(objectData.getPolicyIds()); result.setProperties(objectData.getProperties()); result.setRelationships(objectData.getRelationships()); result.setRenditions(objectData.getRenditions()); return result; } public static String buildPrefixTypeProperty(String typeId, String propertyId){ List<String> list = new ArrayList<String>(); if(StringUtils.isNotBlank(typeId)){ list.add("typeId=" + typeId); } if(StringUtils.isNotBlank(propertyId)){ list.add("propertyId=" + propertyId); } return "[" + StringUtils.join(list, ",") + "]"; } public static boolean valueExist(List<?> values){ if(CollectionUtils.isEmpty(values)){ return false; }else if(values.size() == 1){ Object v = values.get(0); if(v instanceof String){ return StringUtils.isNotBlank((String)v); }else{ return (v != null); } }else{ //TODO what if ["", null,null,...] case? return true; } } public static BigInteger convertToBigInteger(String string){ if(StringUtils.isBlank(string)){ return null; }else{ Long l = Long.valueOf(string); return BigInteger.valueOf(l); } } }