/** * 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.apache.abdera.parser.stax.FOMExtensibleElement; import org.xcmis.restatom.AtomCMIS; import org.xcmis.spi.InvalidArgumentException; import org.xcmis.spi.model.AccessControlEntry; import org.xcmis.spi.model.AllowableActions; import org.xcmis.spi.model.ChangeInfo; import org.xcmis.spi.model.CmisObject; import org.xcmis.spi.model.Property; import org.xcmis.spi.model.PropertyType; import org.xcmis.spi.model.Rendition; import org.xcmis.spi.model.impl.BooleanProperty; import org.xcmis.spi.model.impl.DateTimeProperty; import org.xcmis.spi.model.impl.DecimalProperty; import org.xcmis.spi.model.impl.HtmlProperty; import org.xcmis.spi.model.impl.IdProperty; import org.xcmis.spi.model.impl.IntegerProperty; import org.xcmis.spi.model.impl.StringProperty; import org.xcmis.spi.model.impl.UriProperty; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; /** * @author <a href="mailto:andrey.parfonov@exoplatform.com">Andrey Parfonov</a> * @version $Id: ObjectTypeElement.java 218 2010-02-15 07:38:06Z andrew00x $ */ public class ObjectTypeElement extends ExtensibleElementWrapper { /** * Instantiates a new object type element. * * @param internal the internal */ public ObjectTypeElement(Element internal) { super(internal); } /** * Instantiates a new object type element. * * @param factory the factory * @param qname the qname */ public ObjectTypeElement(Factory factory, QName qname) { super(factory, qname); } /** * Gets the allowable actions element. * * @return the allowable actions element */ public AllowableActionsElement getAllowableActionsElement() { return getExtension(AtomCMIS.ALLOWABLE_ACTIONS); } /** * Gets the object. * * @return the object */ public CmisObject getObject() { CmisObject object = new CmisObject(); // PROPERTIES FOMExtensibleElement propertiesElement = getExtension(AtomCMIS.PROPERTIES); if (propertiesElement != null) { Map<String, Property<?>> properties = object.getProperties(); List<PropertyElement<?>> propertyElementList = propertiesElement.getElements(); for (PropertyElement<?> propertyElement : propertyElementList) { Property<?> property = propertyElement.getProperty(); properties.put(propertyElement.getProperty().getId(), property); } } return object; } /** * Builds the element. * * @param objectType the object type */ public void build(CmisObject objectType) { if (objectType != null) { // XXX: Workaround to get work updating properties under 'Cmis Connector Firefox plugin'. // Plugin miss namespace when create entry for updating. Namespace for prefix 'cmisra' // declared in entry tag. But this tag is overwritten in plugin and has no namespace // declaration any more. setAttributeValue("xmlns:" + AtomCMIS.CMISRA_PREFIX, AtomCMIS.CMISRA_NS_URI); // PROPERTIES Map<String, Property<?>> properties = objectType.getProperties(); if (properties != null && !properties.isEmpty()) { FOMExtensibleElement propertiesElement = addExtension(AtomCMIS.PROPERTIES); Set<String> keys = properties.keySet(); for (String key : keys) { Property<?> prop = properties.get(key); PropertyType propertyType = prop.getType(); switch (propertyType) { case BOOLEAN : { PropertyBooleanElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_BOOLEAN); propElement.build((BooleanProperty)prop); break; } case DATETIME : { PropertyDateTimeElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_DATE_TIME); propElement.build((DateTimeProperty)prop); break; } case DECIMAL : { PropertyDecimalElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_DECIMAL); propElement.build((DecimalProperty)prop); break; } case HTML : { PropertyHtmlElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_HTML); propElement.build((HtmlProperty)prop); break; } case ID : { PropertyIdElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_ID); propElement.build((IdProperty)prop); break; } case STRING : { PropertyStringElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_STRING); propElement.build((StringProperty)prop); break; } case INTEGER : { PropertyIntegerElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_INTEGER); propElement.build((IntegerProperty)prop); break; } case URI : { PropertyUriElement propElement = propertiesElement.addExtension(AtomCMIS.PROPERTY_URI); propElement.build((UriProperty)prop); break; } default : // Should never happen. Exception will throw early. throw new InvalidArgumentException("Unknown property type " + propertyType.value()); } } } // ALLOWABLE_ACTIONS AllowableActions allowableActions = objectType.getAllowableActions(); if (allowableActions != null) { AllowableActionsElement actionsElement = addExtension(AtomCMIS.ALLOWABLE_ACTIONS); actionsElement.build(allowableActions); } // RELATIOSNHIP List<CmisObject> relationship = objectType.getRelationship(); if (relationship != null && relationship.size() > 0) { ObjectTypeElement relationshipElement = addExtension(AtomCMIS.RELATIOSNHIP); for (CmisObject cmisObject : relationship) { relationshipElement.build(cmisObject); } } // ChangeEventInfo ChangeInfo changeInfo = objectType.getChangeInfo(); if (changeInfo != null) { ChangeEventTypeElement changeEventInfoElement = addExtension(AtomCMIS.CHANGE_EVENT_INFO); changeEventInfoElement.build(changeInfo); } // acl List<AccessControlEntry> accessControlList = objectType.getACL(); if (accessControlList != null) { FOMExtensibleElement accessControlListTypeElement = addExtension(AtomCMIS.ACL); for (AccessControlEntry element : accessControlList) { AccessControlEntryTypeElement ace = accessControlListTypeElement.addExtension(AtomCMIS.PERMISSION); ace.build(element); } } // exactACL addSimpleExtension(AtomCMIS.EXACT_ACL, Boolean.valueOf(objectType.isExactACL()).toString()); // policyIds Collection<String> policyIds = objectType.getPolicyIds(); if (policyIds != null) { FOMExtensibleElement listOfIdsTypeTypeElement = addExtension(AtomCMIS.POLICY_IDS); for (Element element : listOfIdsTypeTypeElement) { listOfIdsTypeTypeElement.addSimpleExtension(AtomCMIS.ID, element.getText()); } } // rendition List<Rendition> listRendition = objectType.getRenditions(); if (listRendition != null) { RenditionTypeElement renditionElement = addExtension(AtomCMIS.RENDITION); for (Rendition rendition : listRendition) { renditionElement.build(rendition); } } } } }