blob: 0561422c35c3e136f1fe991264f132f140ad79b1 [file] [log] [blame]
/*
* 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.chemistry.opencmis.client.runtime.repository;
import static org.apache.chemistry.opencmis.commons.impl.CollectionsHelper.*;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.chemistry.opencmis.client.api.ChangeEvent;
import org.apache.chemistry.opencmis.client.api.ChangeEvents;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.ObjectFactory;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.OperationContext;
import org.apache.chemistry.opencmis.client.api.Policy;
import org.apache.chemistry.opencmis.client.api.Property;
import org.apache.chemistry.opencmis.client.api.QueryResult;
import org.apache.chemistry.opencmis.client.api.Rendition;
import org.apache.chemistry.opencmis.client.api.SecondaryType;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.runtime.ChangeEventImpl;
import org.apache.chemistry.opencmis.client.runtime.ChangeEventsImpl;
import org.apache.chemistry.opencmis.client.runtime.DocumentImpl;
import org.apache.chemistry.opencmis.client.runtime.FolderImpl;
import org.apache.chemistry.opencmis.client.runtime.ItemImpl;
import org.apache.chemistry.opencmis.client.runtime.PolicyImpl;
import org.apache.chemistry.opencmis.client.runtime.PropertyImpl;
import org.apache.chemistry.opencmis.client.runtime.QueryResultImpl;
import org.apache.chemistry.opencmis.client.runtime.RelationshipImpl;
import org.apache.chemistry.opencmis.client.runtime.RenditionImpl;
import org.apache.chemistry.opencmis.client.runtime.SessionImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.DocumentTypeImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.FolderTypeImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.ItemTypeImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.PolicyTypeImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.RelationshipTypeImpl;
import org.apache.chemistry.opencmis.client.runtime.objecttype.SecondaryTypeImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.data.PropertyId;
import org.apache.chemistry.opencmis.commons.data.RenditionData;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.FolderTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.ItemTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PolicyTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyBooleanDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDateTimeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDecimalDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyHtmlDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyIdDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyIntegerDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyStringDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyUriDefinition;
import org.apache.chemistry.opencmis.commons.definitions.RelationshipTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.SecondaryTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.Cardinality;
import org.apache.chemistry.opencmis.commons.enums.ChangeType;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.PartialContentStreamImpl;
import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
/**
* Persistent model object factory.
*/
public class ObjectFactoryImpl implements ObjectFactory, Serializable {
private static final long serialVersionUID = 1L;
private Session session;
/**
* Default constructor.
*/
public ObjectFactoryImpl() {
}
public void initialize(Session session, Map<String, String> parameters) {
assert session != null;
this.session = session;
}
/**
* Returns the bindings object factory.
*/
protected BindingsObjectFactory getBindingsObjectFactory() {
return session.getBinding().getObjectFactory();
}
// repository info
public RepositoryInfo convertRepositoryInfo(RepositoryInfo repositoryInfo) {
return repositoryInfo;
}
// ACL and ACE
public Acl convertAces(List<Ace> aces) {
if (aces == null) {
return null;
}
BindingsObjectFactory bof = getBindingsObjectFactory();
List<Ace> bindingAces = new ArrayList<Ace>();
for (Ace ace : aces) {
bindingAces.add(bof.createAccessControlEntry(ace.getPrincipalId(), ace.getPermissions()));
}
return bof.createAccessControlList(bindingAces);
}
public Ace createAce(String principal, List<String> permissions) {
BindingsObjectFactory bof = getBindingsObjectFactory();
Ace ace = bof.createAccessControlEntry(principal, permissions);
return ace;
}
public Acl createAcl(List<Ace> aces) {
BindingsObjectFactory bof = getBindingsObjectFactory();
Acl acl = bof.createAccessControlList(aces);
return acl;
}
// policies
public List<String> convertPolicies(List<Policy> policies) {
if (policies == null) {
return null;
}
List<String> result = new ArrayList<String>();
for (Policy policy : policies) {
if ((policy != null) && (policy.getId() != null)) {
result.add(policy.getId());
}
}
return result;
}
// renditions
public Rendition convertRendition(String objectId, RenditionData rendition) {
if (rendition == null) {
throw new IllegalArgumentException("Rendition must be set!");
}
long length = (rendition.getBigLength() == null ? -1 : rendition.getBigLength().longValue());
int height = (rendition.getBigHeight() == null ? -1 : rendition.getBigHeight().intValue());
int width = (rendition.getBigWidth() == null ? -1 : rendition.getBigWidth().intValue());
return new RenditionImpl(this.session, objectId, rendition.getStreamId(), rendition.getRenditionDocumentId(),
rendition.getKind(), length, rendition.getMimeType(), rendition.getTitle(), height, width);
}
// content stream
public ContentStream createContentStream(String filename, long length, String mimetype, InputStream stream) {
return createContentStream(filename, length, mimetype, stream, false);
}
public ContentStream createContentStream(String filename, long length, String mimetype, InputStream stream,
boolean partial) {
if (partial) {
return new PartialContentStreamImpl(filename, (length < 0 ? null : BigInteger.valueOf(length)), mimetype,
stream);
} else {
return new ContentStreamImpl(filename, (length < 0 ? null : BigInteger.valueOf(length)), mimetype, stream);
}
}
public ContentStream convertContentStream(ContentStream contentStream) {
if (contentStream == null) {
return null;
}
BigInteger length = (contentStream.getLength() < 0 ? null : BigInteger.valueOf(contentStream.getLength()));
return getBindingsObjectFactory().createContentStream(contentStream.getFileName(), length,
contentStream.getMimeType(), contentStream.getStream());
}
// types
public ObjectType convertTypeDefinition(TypeDefinition typeDefinition) {
if (typeDefinition instanceof DocumentTypeDefinition) {
return new DocumentTypeImpl(this.session, (DocumentTypeDefinition) typeDefinition);
} else if (typeDefinition instanceof FolderTypeDefinition) {
return new FolderTypeImpl(this.session, (FolderTypeDefinition) typeDefinition);
} else if (typeDefinition instanceof RelationshipTypeDefinition) {
return new RelationshipTypeImpl(this.session, (RelationshipTypeDefinition) typeDefinition);
} else if (typeDefinition instanceof PolicyTypeDefinition) {
return new PolicyTypeImpl(this.session, (PolicyTypeDefinition) typeDefinition);
} else if (typeDefinition instanceof ItemTypeDefinition) {
return new ItemTypeImpl(this.session, (ItemTypeDefinition) typeDefinition);
} else if (typeDefinition instanceof SecondaryTypeDefinition) {
return new SecondaryTypeImpl(this.session, (SecondaryTypeDefinition) typeDefinition);
} else if (typeDefinition == null) {
throw new CmisRuntimeException("No base type supplied!");
} else {
throw new CmisRuntimeException("Unknown base type! Received " + typeDefinition.getClass().getName());
}
}
public ObjectType getTypeFromObjectData(ObjectData objectData) {
if ((objectData == null) || (objectData.getProperties() == null)
|| (objectData.getProperties().getProperties() == null)) {
return null;
}
PropertyData<?> typeProperty = objectData.getProperties().getProperties().get(PropertyIds.OBJECT_TYPE_ID);
if (!(typeProperty instanceof PropertyId)) {
return null;
}
return this.session.getTypeDefinition((String) typeProperty.getFirstValue());
}
// properties
public <T> Property<T> createProperty(PropertyDefinition<T> type, List<T> values) {
return new PropertyImpl<T>(type, values);
}
@SuppressWarnings("unchecked")
protected <T> Property<T> convertProperty(ObjectType objectType, Collection<SecondaryType> secondaryTypes,
PropertyData<T> pd) {
PropertyDefinition<T> definition = (PropertyDefinition<T>) objectType.getPropertyDefinitions().get(pd.getId());
// search secondary types
if (definition == null && secondaryTypes != null) {
for (SecondaryType secondaryType : secondaryTypes) {
if (secondaryType != null && secondaryType.getPropertyDefinitions() != null) {
definition = (PropertyDefinition<T>) secondaryType.getPropertyDefinitions().get(pd.getId());
if (definition != null) {
break;
}
}
}
}
// the type might have changed -> reload type definitions
if (definition == null) {
TypeDefinition reloadedObjectType = session.getTypeDefinition(objectType.getId(), false);
definition = (PropertyDefinition<T>) reloadedObjectType.getPropertyDefinitions().get(pd.getId());
if (definition == null && secondaryTypes != null) {
for (SecondaryType secondaryType : secondaryTypes) {
if (secondaryType != null) {
TypeDefinition reloadedSecondaryType = session.getTypeDefinition(secondaryType.getId(), false);
if (reloadedSecondaryType.getPropertyDefinitions() != null) {
definition = (PropertyDefinition<T>) reloadedSecondaryType.getPropertyDefinitions().get(
pd.getId());
if (definition != null) {
break;
}
}
}
}
}
}
if (definition == null) {
// property without definition
throw new CmisRuntimeException("Property '" + pd.getId() + "' doesn't exist!");
}
return createProperty(definition, pd.getValues());
}
public Map<String, Property<?>> convertProperties(ObjectType objectType, Collection<SecondaryType> secondaryTypes,
Properties properties) {
// check input
if (objectType == null) {
throw new IllegalArgumentException("Object type must set!");
}
if (objectType.getPropertyDefinitions() == null) {
throw new IllegalArgumentException("Object type has no property defintions!");
}
if ((properties == null) || (properties.getProperties() == null)) {
throw new IllegalArgumentException("Properties must be set!");
}
// iterate through properties and convert them
Map<String, Property<?>> result = new LinkedHashMap<String, Property<?>>();
for (Map.Entry<String, PropertyData<?>> entry : properties.getProperties().entrySet()) {
// find property definition
Property<?> apiProperty = convertProperty(objectType, secondaryTypes, entry.getValue());
result.put(entry.getKey(), apiProperty);
}
return result;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Properties convertProperties(Map<String, ?> properties, ObjectType type,
Collection<SecondaryType> secondaryTypes, Set<Updatability> updatabilityFilter) {
// check input
if (properties == null) {
return null;
}
// get the type
if (type == null) {
Object typeId = properties.get(PropertyIds.OBJECT_TYPE_ID);
if (typeId instanceof String) {
type = session.getTypeDefinition(typeId.toString());
} else if (typeId instanceof List && !((List) typeId).isEmpty() && ((List) typeId).get(0) instanceof String) {
type = session.getTypeDefinition(((List) typeId).get(0).toString());
} else {
throw new IllegalArgumentException("Type or type property must be set!");
}
}
// get secondary types
Collection<SecondaryType> allSecondaryTypes = null;
Object secondaryTypeIds = properties.get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
if (secondaryTypeIds instanceof List) {
allSecondaryTypes = new ArrayList<SecondaryType>();
for (Object secondaryTypeId : (List<?>) secondaryTypeIds) {
if (!(secondaryTypeId instanceof String)) {
throw new IllegalArgumentException("Secondary types property contains an invalid entry: "
+ secondaryTypeId);
}
ObjectType secondaryType = session.getTypeDefinition(secondaryTypeId.toString());
if (!(secondaryType instanceof SecondaryType)) {
throw new IllegalArgumentException(
"Secondary types property contains a type that is not a secondary type: " + secondaryTypeId);
}
allSecondaryTypes.add((SecondaryType) secondaryType);
}
}
if (secondaryTypes != null && allSecondaryTypes == null) {
allSecondaryTypes = secondaryTypes;
}
// some preparation
BindingsObjectFactory bof = getBindingsObjectFactory();
List<PropertyData<?>> propertyList = new ArrayList<PropertyData<?>>();
// the big loop
for (Map.Entry<String, ?> property : properties.entrySet()) {
if ((property == null) || (property.getKey() == null)) {
continue;
}
String id = property.getKey();
Object value = property.getValue();
if (value instanceof Property<?>) {
Property<?> p = (Property<?>) value;
if (!id.equals(p.getId())) {
throw new IllegalArgumentException("Property id mismatch: '" + id + "' != '" + p.getId() + "'!");
}
value = (p.getDefinition().getCardinality() == Cardinality.SINGLE ? p.getFirstValue() : p.getValues());
}
// get the property definition
PropertyDefinition<?> definition = type.getPropertyDefinitions().get(id);
if (definition == null && allSecondaryTypes != null) {
for (SecondaryType secondaryType : allSecondaryTypes) {
if (secondaryType != null && secondaryType.getPropertyDefinitions() != null) {
definition = (PropertyDefinition<?>) secondaryType.getPropertyDefinitions().get(id);
if (definition != null) {
break;
}
}
}
}
if (definition == null) {
throw new IllegalArgumentException("Property '" + id
+ "' is not valid for this type or one of the secondary types!");
}
// check updatability
if (updatabilityFilter != null) {
if (!updatabilityFilter.contains(definition.getUpdatability())) {
continue;
}
}
// single and multi value check
List<?> values;
if (value == null) {
values = null;
} else if (value instanceof List<?>) {
if (definition.getCardinality() != Cardinality.MULTI) {
throw new IllegalArgumentException("Property '" + id + "' is not a multi value property!");
}
values = (List<?>) value;
// check if the list is homogeneous and does not contain null
// values
Class<?> valueClazz = null;
for (Object o : values) {
if (o == null) {
throw new IllegalArgumentException("Property '" + id + "' contains null values!");
}
if (valueClazz == null) {
valueClazz = o.getClass();
} else {
if (!valueClazz.isInstance(o)) {
throw new IllegalArgumentException("Property '" + id + "' is inhomogeneous!");
}
}
}
} else {
if (definition.getCardinality() != Cardinality.SINGLE) {
throw new IllegalArgumentException("Property '" + id + "' is not a single value property!");
}
values = Collections.singletonList(value);
}
// assemble property
PropertyData<?> propertyData = null;
Object firstValue = (isNullOrEmpty(values) ? null : values.get(0));
if (definition instanceof PropertyStringDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyStringData(id, (List<String>) null);
} else if (firstValue instanceof String) {
propertyData = bof.createPropertyStringData(id, (List<String>) values);
} else {
throwWrongTypeError(firstValue, "string", String.class, id);
}
} else if (definition instanceof PropertyIdDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyIdData(id, (List<String>) null);
} else if (firstValue instanceof String) {
propertyData = bof.createPropertyIdData(id, (List<String>) values);
} else {
throwWrongTypeError(firstValue, "string", String.class, id);
}
} else if (definition instanceof PropertyHtmlDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyHtmlData(id, (List<String>) values);
} else if (firstValue instanceof String) {
propertyData = bof.createPropertyHtmlData(id, (List<String>) values);
} else {
throwWrongTypeError(firstValue, "html", String.class, id);
}
} else if (definition instanceof PropertyUriDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyUriData(id, (List<String>) null);
} else if (firstValue instanceof String) {
propertyData = bof.createPropertyUriData(id, (List<String>) values);
} else {
throwWrongTypeError(firstValue, "uri", String.class, id);
}
} else if (definition instanceof PropertyIntegerDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyIntegerData(id, (List<BigInteger>) null);
} else if (firstValue instanceof BigInteger) {
propertyData = bof.createPropertyIntegerData(id, (List<BigInteger>) values);
} else if ((firstValue instanceof Byte) || (firstValue instanceof Short)
|| (firstValue instanceof Integer) || (firstValue instanceof Long)) {
// we accept all kinds of integers
List<BigInteger> list = new ArrayList<BigInteger>(values.size());
for (Object v : values) {
list.add(BigInteger.valueOf(((Number) v).longValue()));
}
propertyData = bof.createPropertyIntegerData(id, list);
} else {
throwWrongTypeError(firstValue, "integer", BigInteger.class, id);
}
} else if (definition instanceof PropertyBooleanDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyBooleanData(id, (List<Boolean>) null);
} else if (firstValue instanceof Boolean) {
propertyData = bof.createPropertyBooleanData(id, (List<Boolean>) values);
} else {
throwWrongTypeError(firstValue, "boolean", Boolean.class, id);
}
} else if (definition instanceof PropertyDecimalDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyDecimalData(id, (List<BigDecimal>) null);
} else if (firstValue instanceof BigDecimal) {
propertyData = bof.createPropertyDecimalData(id, (List<BigDecimal>) values);
} else if ((firstValue instanceof Float) || (firstValue instanceof Double)
|| (firstValue instanceof Byte) || (firstValue instanceof Short)
|| (firstValue instanceof Integer) || (firstValue instanceof Long)) {
// we accept all kinds of integers
// as well as floats and doubles
List<BigDecimal> list = new ArrayList<BigDecimal>(values.size());
for (Object v : values) {
list.add(new BigDecimal(v.toString()));
}
propertyData = bof.createPropertyDecimalData(id, list);
} else {
throwWrongTypeError(firstValue, "decimal", BigDecimal.class, id);
}
} else if (definition instanceof PropertyDateTimeDefinition) {
if (firstValue == null) {
propertyData = bof.createPropertyDateTimeData(id, (List<GregorianCalendar>) null);
} else if (firstValue instanceof GregorianCalendar) {
propertyData = bof.createPropertyDateTimeData(id, (List<GregorianCalendar>) values);
} else if (firstValue instanceof Date) {
List<GregorianCalendar> list = new ArrayList<GregorianCalendar>(values.size());
for (Object d : values) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime((Date) d);
list.add(cal);
}
propertyData = bof.createPropertyDateTimeData(id, list);
} else {
throwWrongTypeError(firstValue, "datetime", GregorianCalendar.class, id);
}
}
// do we have something?
if (propertyData == null) {
throw new IllegalArgumentException("Property '" + id + "' doesn't match the property defintion!");
}
propertyList.add(propertyData);
}
return bof.createPropertiesData(propertyList);
}
public List<PropertyData<?>> convertQueryProperties(Properties properties) {
// check input
if ((properties == null) || (properties.getProperties() == null)) {
throw new IllegalArgumentException("Properties must be set!");
}
return new ArrayList<PropertyData<?>>(properties.getPropertyList());
}
// objects
public CmisObject convertObject(ObjectData objectData, OperationContext context) {
if (objectData == null) {
throw new IllegalArgumentException("Object data is null!");
}
if (objectData.getBaseTypeId() == null) {
throw new IllegalArgumentException("Base type ID property not set!");
}
ObjectType type = getTypeFromObjectData(objectData);
/* determine type */
switch (objectData.getBaseTypeId()) {
case CMIS_DOCUMENT:
return new DocumentImpl((SessionImpl) this.session, type, objectData, context);
case CMIS_FOLDER:
return new FolderImpl((SessionImpl) this.session, type, objectData, context);
case CMIS_POLICY:
return new PolicyImpl((SessionImpl) this.session, type, objectData, context);
case CMIS_RELATIONSHIP:
return new RelationshipImpl((SessionImpl) this.session, type, objectData, context);
case CMIS_ITEM:
return new ItemImpl((SessionImpl) this.session, type, objectData, context);
case CMIS_SECONDARY:
throw new CmisRuntimeException("Secondary type is used as object type: " + objectData.getBaseTypeId());
default:
throw new CmisRuntimeException("Unsupported base type: " + objectData.getBaseTypeId());
}
}
public QueryResult convertQueryResult(ObjectData objectData) {
if (objectData == null) {
throw new IllegalArgumentException("Object data is null!");
}
return new QueryResultImpl(session, objectData);
}
public ChangeEvent convertChangeEvent(ObjectData objectData) {
ChangeType changeType = null;
GregorianCalendar changeTime = null;
String objectId = null;
Map<String, List<?>> properties = null;
List<String> policyIds = null;
Acl acl = null;
if (objectData.getChangeEventInfo() != null) {
changeType = objectData.getChangeEventInfo().getChangeType();
changeTime = objectData.getChangeEventInfo().getChangeTime();
}
if ((objectData.getProperties() != null) && (objectData.getProperties().getPropertyList() != null)) {
properties = new HashMap<String, List<?>>();
for (PropertyData<?> property : objectData.getProperties().getPropertyList()) {
properties.put(property.getId(), property.getValues());
}
if (properties.containsKey(PropertyIds.OBJECT_ID)) {
List<?> objectIdList = properties.get(PropertyIds.OBJECT_ID);
if (isNotEmpty(objectIdList)) {
objectId = objectIdList.get(0).toString();
}
}
if ((objectData.getPolicyIds() != null) && (objectData.getPolicyIds().getPolicyIds() != null)) {
policyIds = objectData.getPolicyIds().getPolicyIds();
}
if (objectData.getAcl() != null) {
acl = objectData.getAcl();
}
}
return new ChangeEventImpl(changeType, changeTime, objectId, properties, policyIds, acl);
}
public ChangeEvents convertChangeEvents(String changeLogToken, ObjectList objectList) {
if (objectList == null) {
return null;
}
List<ChangeEvent> events = new ArrayList<ChangeEvent>();
if (objectList.getObjects() != null) {
for (ObjectData objectData : objectList.getObjects()) {
if (objectData == null) {
continue;
}
events.add(convertChangeEvent(objectData));
}
}
boolean hasMoreItems = (objectList.hasMoreItems() == null ? false : objectList.hasMoreItems().booleanValue());
long totalNumItems = (objectList.getNumItems() == null ? -1 : objectList.getNumItems().longValue());
return new ChangeEventsImpl(changeLogToken, events, hasMoreItems, totalNumItems);
}
private void throwWrongTypeError(Object obj, String type, Class<?> clazz, String id) {
String expectedTypes;
if (BigInteger.class.isAssignableFrom(clazz)) {
expectedTypes = "<BigInteger, Byte, Short, Integer, Long>";
} else if (BigDecimal.class.isAssignableFrom(clazz)) {
expectedTypes = "<BigDecimal, Double, Float, Byte, Short, Integer, Long>";
} else if (GregorianCalendar.class.isAssignableFrom(clazz)) {
expectedTypes = "<java.util.GregorianCalendar, java.util.Date>";
} else {
expectedTypes = clazz.getName();
}
String message = "Property '" + id + "' is a " + type + " property. Expected type '" + expectedTypes
+ "' but received a '" + obj.getClass().getName() + "' property.";
throw new IllegalArgumentException(message);
}
}