Search in sources :

Example 1 with InvalidAspectException

use of org.alfresco.service.cmr.dictionary.InvalidAspectException in project alfresco-repository by Alfresco.

the class CMISConnector method setAspectProperties.

private void setAspectProperties(NodeRef nodeRef, boolean isNameChanging, CmisExtensionElement aspectExtension) {
    if (aspectExtension.getChildren() == null) {
        return;
    }
    List<String> aspectsToAdd = new ArrayList<String>();
    List<String> aspectsToRemove = new ArrayList<String>();
    Map<QName, List<Serializable>> aspectProperties = new HashMap<QName, List<Serializable>>();
    for (CmisExtensionElement extension : aspectExtension.getChildren()) {
        if (!ALFRESCO_EXTENSION_NAMESPACE.equals(extension.getNamespace())) {
            continue;
        }
        if (ASPECTS_TO_ADD.equals(extension.getName()) && (extension.getValue() != null)) {
            aspectsToAdd.add(extension.getValue());
        } else if (ASPECTS_TO_REMOVE.equals(extension.getName()) && (extension.getValue() != null)) {
            aspectsToRemove.add(extension.getValue());
        } else if (PROPERTIES.equals(extension.getName()) && (extension.getChildren() != null)) {
            for (CmisExtensionElement property : extension.getChildren()) {
                if (!property.getName().startsWith("property")) {
                    continue;
                }
                String propertyId = (property.getAttributes() == null ? null : property.getAttributes().get("propertyDefinitionId"));
                if ((propertyId == null) || (property.getChildren() == null)) {
                    continue;
                }
                PropertyType propertyType = PropertyType.STRING;
                DatatypeFactory df = null;
                if (property.getName().equals("propertyBoolean")) {
                    propertyType = PropertyType.BOOLEAN;
                } else if (property.getName().equals("propertyInteger")) {
                    propertyType = PropertyType.INTEGER;
                } else if (property.getName().equals("propertyDateTime")) {
                    propertyType = PropertyType.DATETIME;
                    try {
                        df = DatatypeFactory.newInstance();
                    } catch (DatatypeConfigurationException e) {
                        throw new CmisRuntimeException("Aspect conversation exception: " + e.getMessage(), e);
                    }
                } else if (property.getName().equals("propertyDecimal")) {
                    propertyType = PropertyType.DECIMAL;
                }
                ArrayList<Serializable> values = new ArrayList<Serializable>();
                if (property.getChildren() != null) {
                    // {
                    for (CmisExtensionElement valueElement : property.getChildren()) {
                        if ("value".equals(valueElement.getName())) {
                            switch(propertyType) {
                                case BOOLEAN:
                                    try {
                                        values.add(Boolean.parseBoolean(valueElement.getValue()));
                                    } catch (Exception e) {
                                        throw new CmisInvalidArgumentException("Invalid property aspect value: " + propertyId, e);
                                    }
                                    break;
                                case DATETIME:
                                    try {
                                        values.add(df.newXMLGregorianCalendar(valueElement.getValue()).toGregorianCalendar());
                                    } catch (Exception e) {
                                        throw new CmisInvalidArgumentException("Invalid property aspect value: " + propertyId, e);
                                    }
                                    break;
                                case INTEGER:
                                    BigInteger value = null;
                                    try {
                                        value = new BigInteger(valueElement.getValue());
                                    } catch (Exception e) {
                                        throw new CmisInvalidArgumentException("Invalid property aspect value: " + propertyId, e);
                                    }
                                    // overflow check
                                    PropertyDefinitionWrapper propDef = getOpenCMISDictionaryService().findProperty(propertyId);
                                    if (propDef == null) {
                                        throw new CmisInvalidArgumentException("Property " + propertyId + " is unknown!");
                                    }
                                    QName propertyQName = propDef.getPropertyAccessor().getMappedProperty();
                                    if (propertyQName == null) {
                                        throw new CmisConstraintException("Unable to set property " + propertyId + "!");
                                    }
                                    org.alfresco.service.cmr.dictionary.PropertyDefinition def = dictionaryService.getProperty(propertyQName);
                                    QName dataDef = def.getDataType().getName();
                                    if (dataDef.equals(DataTypeDefinition.INT) && (value.compareTo(maxInt) > 0 || value.compareTo(minInt) < 0)) {
                                        throw new CmisConstraintException("Value is out of range for property " + propertyId);
                                    }
                                    if (dataDef.equals(DataTypeDefinition.LONG) && (value.compareTo(maxLong) > 0 || value.compareTo(minLong) < 0)) {
                                        throw new CmisConstraintException("Value is out of range for property " + propertyId);
                                    }
                                    values.add(value);
                                    break;
                                case DECIMAL:
                                    try {
                                        values.add(new BigDecimal(valueElement.getValue()));
                                    } catch (Exception e) {
                                        throw new CmisInvalidArgumentException("Invalid property aspect value: " + propertyId, e);
                                    }
                                    break;
                                default:
                                    values.add(valueElement.getValue());
                            }
                        }
                    }
                }
                aspectProperties.put(QName.createQName(propertyId, namespaceService), values);
            }
        }
    }
    // remove and add aspects
    String aspectType = null;
    try {
        for (String aspect : aspectsToRemove) {
            aspectType = aspect;
            TypeDefinitionWrapper type = getType(aspect);
            if (type == null) {
                throw new CmisInvalidArgumentException("Invalid aspect: " + aspectType);
            }
            QName typeName = type.getAlfrescoName();
            // if aspect is hidden aspect, remove only if hidden node is not client controlled
            if (typeName.equals(ContentModel.ASPECT_HIDDEN)) {
                if (hiddenAspect.isClientControlled(nodeRef) || aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED)) {
                    // manipulate hidden aspect only if client controlled
                    nodeService.removeAspect(nodeRef, typeName);
                }
            // if(!isNameChanging && !hiddenAspect.isClientControlled(nodeRef) && !aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED))
            // {
            // nodeService.removeAspect(nodeRef, typeName);
            // }
            } else {
                nodeService.removeAspect(nodeRef, typeName);
            }
        }
        for (String aspect : aspectsToAdd) {
            aspectType = aspect;
            TypeDefinitionWrapper type = getType(aspect);
            if (type == null) {
                throw new CmisInvalidArgumentException("Invalid aspect: " + aspectType);
            }
            QName typeName = type.getAlfrescoName();
            // if aspect is hidden aspect, remove only if hidden node is not client controlled
            if (typeName.equals(ContentModel.ASPECT_HIDDEN)) {
                if (hiddenAspect.isClientControlled(nodeRef) || aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED)) {
                    // manipulate hidden aspect only if client controlled
                    nodeService.addAspect(nodeRef, type.getAlfrescoName(), Collections.<QName, Serializable>emptyMap());
                }
            // if(!isNameChanging && !hiddenAspect.isClientControlled(nodeRef) && !aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED))
            // {
            // nodeService.addAspect(nodeRef, type.getAlfrescoName(),
            // Collections.<QName, Serializable> emptyMap());
            // }
            } else {
                nodeService.addAspect(nodeRef, type.getAlfrescoName(), Collections.<QName, Serializable>emptyMap());
            }
        }
    } catch (InvalidAspectException e) {
        throw new CmisInvalidArgumentException("Invalid aspect: " + aspectType);
    } catch (InvalidNodeRefException e) {
        throw new CmisInvalidArgumentException("Invalid node: " + nodeRef);
    }
    // set property
    for (Map.Entry<QName, List<Serializable>> property : aspectProperties.entrySet()) {
        QName propertyQName = property.getKey();
        if (property.getValue().isEmpty()) {
            if (HiddenAspect.HIDDEN_PROPERTIES.contains(property.getKey())) {
                if (hiddenAspect.isClientControlled(nodeRef) || aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED)) {
                    // manipulate hidden aspect property only if client controlled
                    nodeService.removeProperty(nodeRef, propertyQName);
                }
            } else {
                nodeService.removeProperty(nodeRef, property.getKey());
            }
        } else {
            if (HiddenAspect.HIDDEN_PROPERTIES.contains(property.getKey())) {
                if (hiddenAspect.isClientControlled(nodeRef) || aspectProperties.containsKey(ContentModel.PROP_CLIENT_CONTROLLED)) {
                    // manipulate hidden aspect property only if client controlled
                    nodeService.setProperty(nodeRef, property.getKey(), property.getValue().size() == 1 ? property.getValue().get(0) : (Serializable) property.getValue());
                }
            } else {
                Serializable value = (Serializable) property.getValue();
                nodeService.setProperty(nodeRef, property.getKey(), property.getValue().size() == 1 ? property.getValue().get(0) : value);
            }
        }
    }
}
Also used : Serializable(java.io.Serializable) CmisRuntimeException(org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException) HashMap(java.util.HashMap) ItemTypeDefinitionWrapper(org.alfresco.opencmis.dictionary.ItemTypeDefinitionWrapper) TypeDefinitionWrapper(org.alfresco.opencmis.dictionary.TypeDefinitionWrapper) DocumentTypeDefinitionWrapper(org.alfresco.opencmis.dictionary.DocumentTypeDefinitionWrapper) ArrayList(java.util.ArrayList) PropertyString(org.apache.chemistry.opencmis.commons.data.PropertyString) PropertyType(org.apache.chemistry.opencmis.commons.enums.PropertyType) PropertyDefinitionWrapper(org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper) CmisInvalidArgumentException(org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException) Collections.singletonList(java.util.Collections.singletonList) ObjectList(org.apache.chemistry.opencmis.commons.data.ObjectList) ArrayList(java.util.ArrayList) List(java.util.List) InvalidNodeRefException(org.alfresco.service.cmr.repository.InvalidNodeRefException) DatatypeFactory(javax.xml.datatype.DatatypeFactory) QName(org.alfresco.service.namespace.QName) CmisConstraintException(org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException) CmisContentAlreadyExistsException(org.apache.chemistry.opencmis.commons.exceptions.CmisContentAlreadyExistsException) FileExistsException(org.alfresco.service.cmr.model.FileExistsException) InvalidAspectException(org.alfresco.service.cmr.dictionary.InvalidAspectException) AccessDeniedException(org.alfresco.repo.security.permissions.AccessDeniedException) CmisConstraintException(org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException) CmisBaseException(org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException) IOException(java.io.IOException) BeansException(org.springframework.beans.BeansException) CmisInvalidArgumentException(org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException) CmisObjectNotFoundException(org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException) CmisStreamNotSupportedException(org.apache.chemistry.opencmis.commons.exceptions.CmisStreamNotSupportedException) AlfrescoRuntimeException(org.alfresco.error.AlfrescoRuntimeException) DatatypeConfigurationException(javax.xml.datatype.DatatypeConfigurationException) CmisRuntimeException(org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException) InvalidNodeRefException(org.alfresco.service.cmr.repository.InvalidNodeRefException) BigDecimal(java.math.BigDecimal) InvalidAspectException(org.alfresco.service.cmr.dictionary.InvalidAspectException) CmisExtensionElement(org.apache.chemistry.opencmis.commons.data.CmisExtensionElement) DatatypeConfigurationException(javax.xml.datatype.DatatypeConfigurationException) BigInteger(java.math.BigInteger) Map(java.util.Map) HashMap(java.util.HashMap)

Example 2 with InvalidAspectException

use of org.alfresco.service.cmr.dictionary.InvalidAspectException in project alfresco-repository by Alfresco.

the class DbNodeServiceImpl method addAspect.

@Override
@Extend(traitAPI = NodeServiceTrait.class, extensionAPI = NodeServiceExtension.class)
public void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map<QName, Serializable> aspectProperties) throws InvalidNodeRefException, InvalidAspectException {
    // check that the aspect is legal
    AspectDefinition aspectDef = dictionaryService.getAspect(aspectTypeQName);
    if (aspectDef == null) {
        throw new InvalidAspectException("The aspect is invalid: " + aspectTypeQName, aspectTypeQName);
    }
    // Don't allow spoofed aspect(s) to be added
    if (aspectTypeQName.equals(ContentModel.ASPECT_PENDING_DELETE)) {
        throw new IllegalArgumentException("The aspect is reserved for system use: " + aspectTypeQName);
    }
    // Check the properties
    if (aspectProperties == null) {
        // Make a map
        aspectProperties = Collections.emptyMap();
    }
    // Make the properties immutable to be sure that they are not used incorrectly
    aspectProperties = Collections.unmodifiableMap(aspectProperties);
    // Invoke policy behaviours
    invokeBeforeUpdateNode(nodeRef);
    // Add aspect and defaults
    Pair<Long, NodeRef> nodePair = getNodePairNotNull(nodeRef);
    // SetProperties common tasks
    setPropertiesCommonWork(nodePair, aspectProperties);
    boolean modified = addAspectsAndProperties(nodePair, aspectTypeQName, null, null, Collections.singleton(aspectTypeQName), aspectProperties, false);
    if (modified) {
        // Invoke policy behaviours
        invokeOnUpdateNode(nodeRef);
    }
}
Also used : InvalidAspectException(org.alfresco.service.cmr.dictionary.InvalidAspectException) NodeRef(org.alfresco.service.cmr.repository.NodeRef) AspectDefinition(org.alfresco.service.cmr.dictionary.AspectDefinition) Extend(org.alfresco.traitextender.Extend)

Aggregations

InvalidAspectException (org.alfresco.service.cmr.dictionary.InvalidAspectException)2 IOException (java.io.IOException)1 Serializable (java.io.Serializable)1 BigDecimal (java.math.BigDecimal)1 BigInteger (java.math.BigInteger)1 ArrayList (java.util.ArrayList)1 Collections.singletonList (java.util.Collections.singletonList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 DatatypeConfigurationException (javax.xml.datatype.DatatypeConfigurationException)1 DatatypeFactory (javax.xml.datatype.DatatypeFactory)1 AlfrescoRuntimeException (org.alfresco.error.AlfrescoRuntimeException)1 DocumentTypeDefinitionWrapper (org.alfresco.opencmis.dictionary.DocumentTypeDefinitionWrapper)1 ItemTypeDefinitionWrapper (org.alfresco.opencmis.dictionary.ItemTypeDefinitionWrapper)1 PropertyDefinitionWrapper (org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper)1 TypeDefinitionWrapper (org.alfresco.opencmis.dictionary.TypeDefinitionWrapper)1 AccessDeniedException (org.alfresco.repo.security.permissions.AccessDeniedException)1 AspectDefinition (org.alfresco.service.cmr.dictionary.AspectDefinition)1 FileExistsException (org.alfresco.service.cmr.model.FileExistsException)1