/**
* Copyright (C) 2010 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xcmis.restatom.abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.ExtensibleElementWrapper;
import org.xcmis.restatom.AtomCMIS;
import org.xcmis.spi.InvalidArgumentException;
import org.xcmis.spi.model.BaseType;
import org.xcmis.spi.model.ContentStreamAllowed;
import org.xcmis.spi.model.PropertyDefinition;
import org.xcmis.spi.model.TypeDefinition;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
/**
* @author <a href="mailto:alexey.zavizionov@exoplatform.com">Alexey
* Zavizionov</a>
* @version $Id: CmisTypeDefinitionTypeElementWrapper.java 2192 2009-07-17
* 13:19:12Z sunman $ Jul 14, 2009
*/
public class TypeDefinitionTypeElement extends ExtensibleElementWrapper
{
/**
* Instantiates a new type definition type element.
*
* @param internal the internal
*/
public TypeDefinitionTypeElement(Element internal)
{
super(internal);
}
/**
* Instantiates a new type definition type element.
*
* @param factory the factory
* @param qname the qname
*/
public TypeDefinitionTypeElement(Factory factory, QName qname)
{
super(factory, qname);
}
/**
* Gets the properties element.
*
* @return the properties element
*/
public Map<String, PropertyDefinition<?>> getPropertyDefinitions()
{
Map<String, PropertyDefinition<?>> propDefs = new HashMap<String, PropertyDefinition<?>>();
for (QName q : AtomCMIS.PROPERTY_DEFINITIONS)
{
List<PropertyDefinitionTypeElement> propDefEls = getExtensions(q);
for (PropertyDefinitionTypeElement propDefEl : propDefEls)
{
PropertyDefinition<?> propDef = propDefEl.getPropertyDefinition();
propDefs.put(propDef.getId(), propDef);
}
}
return propDefs;
}
/**
* Gets the type definition.
*
* @return the type definition
*/
public TypeDefinition getTypeDefinition()
{
String baseId = getSimpleExtension(AtomCMIS.BASE_ID);
BaseType baseType;
try
{
baseType = BaseType.fromValue(baseId);
}
catch (IllegalArgumentException e)
{
throw new InvalidArgumentException("Unable to parse Type Definition element. Unknown baseTypeId " + baseId);
}
TypeDefinition type = new TypeDefinition();
switch (baseType)
{
case DOCUMENT :
type.setVersionable(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.VERSIONABLE)));
String contentAllowed = getSimpleExtension(AtomCMIS.CONTENT_STREAM_ALLOWED);
try
{
type.setContentStreamAllowed(ContentStreamAllowed.fromValue(contentAllowed));
}
catch (IllegalArgumentException e)
{
throw new InvalidArgumentException(
"Unable to parse Type Definition element. Unsupported 'content stream allowed attribute': "
+ contentAllowed);
}
break;
case FOLDER :
break;
case POLICY :
break;
case RELATIONSHIP :
type.setAllowedSourceTypes(new String[]{getSimpleExtension(AtomCMIS.ALLOWED_SOURCE_TYPES)});
type.setAllowedTargetTypes(new String[]{getSimpleExtension(AtomCMIS.ALLOWED_TARGET_TYPES)});
break;
}
if (type == null)
{
String msg = "Specified baseType does not match with any allowed BaseTypeId";
throw new InvalidArgumentException(msg);
}
type.setId(getSimpleExtension(AtomCMIS.ID));
type.setLocalName(getSimpleExtension(AtomCMIS.LOCAL_NAME));
type.setLocalNamespace(getSimpleExtension(AtomCMIS.LOCAL_NAMESPACE));
type.setDisplayName(getSimpleExtension(AtomCMIS.DISPLAY_NAME));
type.setQueryName(getSimpleExtension(AtomCMIS.QUERY_NAME));
type.setDescription(getSimpleExtension(AtomCMIS.DESCRIPTION));
type.setBaseId(baseType);
type.setParentId(getSimpleExtension(AtomCMIS.PARENT_ID));
type.setCreatable(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.CREATABLE)));
type.setFileable(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.FILEABLE)));
type.setQueryable(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.QUERYABLE)));
type.setFulltextIndexed(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.FULLTEXT_INDEXED)));
type.setIncludedInSupertypeQuery(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.INCLUDED_IN_SUPERTYPE_QUERY)));
type.setControllablePolicy(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.CONTROLLABLE_POLICY)));
type.setControllableACL(Boolean.parseBoolean(getSimpleExtension(AtomCMIS.CONTROLLABLE_ACL)));
//Property definitions
Map<String, PropertyDefinition<?>> propDefs = getPropertyDefinitions();
type.setPropertyDefinitions(propDefs);
return type;
}
/**
* Builds the element.
*
* @param type the type
*/
public void build(TypeDefinition type)
{
if (type != null)
{
addSimpleExtension(AtomCMIS.ID, type.getId());
addSimpleExtension(AtomCMIS.LOCAL_NAME, type.getLocalName());
addSimpleExtension(AtomCMIS.LOCAL_NAMESPACE, type.getLocalNamespace());
addSimpleExtension(AtomCMIS.DISPLAY_NAME, type.getDisplayName());
addSimpleExtension(AtomCMIS.QUERY_NAME, type.getQueryName());
addSimpleExtension(AtomCMIS.DESCRIPTION, type.getDescription());
/* base type */
if (type.getBaseId() != null)
{
addSimpleExtension(AtomCMIS.BASE_ID, type.getBaseId().value());
}
/* parent */
addSimpleExtension(AtomCMIS.PARENT_ID, type.getParentId());
/* flags */
addSimpleExtension(AtomCMIS.CREATABLE, Boolean.toString(type.isCreatable()));
addSimpleExtension(AtomCMIS.FILEABLE, Boolean.toString(type.isFileable()));
addSimpleExtension(AtomCMIS.QUERYABLE, Boolean.toString(type.isQueryable()));
addSimpleExtension(AtomCMIS.FULLTEXT_INDEXED, Boolean.toString(type.isFulltextIndexed()));
addSimpleExtension(AtomCMIS.INCLUDED_IN_SUPERTYPE_QUERY, Boolean.toString(type.isIncludedInSupertypeQuery()));
/* controllable */
addSimpleExtension(AtomCMIS.CONTROLLABLE_POLICY, Boolean.toString(type.isControllablePolicy()));
addSimpleExtension(AtomCMIS.CONTROLLABLE_ACL, Boolean.toString(type.isControllableACL()));
switch (type.getBaseId())
{
case DOCUMENT :
setAttributeValue(AtomCMIS.X_TYPE, "cmis:cmisTypeDocumentDefinitionType");
addSimpleExtension(AtomCMIS.VERSIONABLE, Boolean.toString(type.isVersionable()));
if (type.getContentStreamAllowed() != null)
{
addSimpleExtension(AtomCMIS.CONTENT_STREAM_ALLOWED, type.getContentStreamAllowed().value());
}
else
{
addSimpleExtension(AtomCMIS.CONTENT_STREAM_ALLOWED, ContentStreamAllowed.ALLOWED.value());
}
break;
case RELATIONSHIP :
setAttributeValue(AtomCMIS.X_TYPE, "cmis:cmisTypeRelationshipDefinitionType");
String[] arrayAllowedSource = type.getAllowedSourceTypes();
if (arrayAllowedSource != null && arrayAllowedSource.length > 0)
{
for (String string : arrayAllowedSource)
{
addSimpleExtension(AtomCMIS.ALLOWED_SOURCE_TYPES, string);
}
}
String[] arrayAllowedTarget = type.getAllowedTargetTypes();
if (arrayAllowedTarget != null && arrayAllowedTarget.length > 0)
{
for (String string : arrayAllowedTarget)
{
addSimpleExtension(AtomCMIS.ALLOWED_TARGET_TYPES, string);
}
}
break;
case FOLDER :
setAttributeValue(AtomCMIS.X_TYPE, "cmis:cmisTypeFolderDefinitionType");
break;
case POLICY :
setAttributeValue(AtomCMIS.X_TYPE, "cmis:cmisTypePolicyDefinitionType");
break;
}
if (type.getBaseId() == null)
{
String msg = "Specified baseType does not match with any allowed BaseTypeId";
throw new InvalidArgumentException(msg);
}
/* property definitions */
if (type.getPropertyDefinitions() != null && type.getPropertyDefinitions().size() > 0)
{
for (PropertyDefinition<?> propertyDefinition : type.getPropertyDefinitions())
{
PropertyDefinitionTypeElement propDefEl =
addExtension(CMISExtensionFactory.getPropertyDefinitionTypeElementName(propertyDefinition
.getPropertyType()));
propDefEl.build(propertyDefinition);
}
}
}
}
}