diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index b5c4e10bea6..c90094e0b5a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -487,7 +487,7 @@ private boolean isEnum(PrismProperty property){ // // return ((clazz != null && clazz.isEnum()) || ActivationType.F_ADMINISTRATIVE_STATUS.equals(definition.getName()) // || ActivationType.F_LOCKOUT_STATUS.equals(definition.getName()) || ); - return (definition.getAllowedValues() != null && definition.getAllowedValues().length > 0); + return (definition.getAllowedValues() != null && definition.getAllowedValues().size() > 0); } //TODO - try to get rid of
attributes when creating new lines in association attributes pop-up private String createAssociationTooltipText(PrismProperty property){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java index 28e863d1b88..72158a1b1d4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java @@ -223,7 +223,7 @@ public static DropDownChoicePanel createEnumPanel(final PrismPropertyDefinition public List getObject() { List values = null; if (def.getAllowedValues() != null){ - values = new ArrayList<>(def.getAllowedValues().length); + values = new ArrayList<>(def.getAllowedValues().size()); for (Object v : def.getAllowedValues()){ if (v instanceof DisplayableValue){ values.add(((DisplayableValue) v)); diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java index b894339176c..c747574b0f1 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/LayerRefinedAttributeDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import com.evolveum.midpoint.schema.processor.ResourceAttributeContainerDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType; @@ -39,25 +40,25 @@ * @author semancik * */ -public class LayerRefinedAttributeDefinition extends RefinedAttributeDefinition { +public class LayerRefinedAttributeDefinition extends RefinedAttributeDefinition { - private RefinedAttributeDefinition refinedAttributeDefinition; + private RefinedAttributeDefinition refinedAttributeDefinition; private LayerType layer; private Boolean overrideCanRead = null; private Boolean overrideCanAdd = null; private Boolean overrideCanModify = null; - private LayerRefinedAttributeDefinition(RefinedAttributeDefinition refinedAttributeDefinition, LayerType layer) { + private LayerRefinedAttributeDefinition(RefinedAttributeDefinition refinedAttributeDefinition, LayerType layer) { super(refinedAttributeDefinition, refinedAttributeDefinition.getPrismContext()); this.refinedAttributeDefinition = refinedAttributeDefinition; this.layer = layer; } - static LayerRefinedAttributeDefinition wrap(RefinedAttributeDefinition rAttrDef, LayerType layer) { + static LayerRefinedAttributeDefinition wrap(RefinedAttributeDefinition rAttrDef, LayerType layer) { if (rAttrDef == null) { return null; } - return new LayerRefinedAttributeDefinition(rAttrDef, layer); + return new LayerRefinedAttributeDefinition(rAttrDef, layer); } static List wrapCollection( @@ -253,7 +254,7 @@ public void setCanAdd(boolean create) { } @Override - public PropertyDelta createEmptyDelta(ItemPath path) { + public PropertyDelta createEmptyDelta(ItemPath path) { return refinedAttributeDefinition.createEmptyDelta(path); } @@ -328,17 +329,17 @@ public void setDescription(String description) { } @Override - public Class getTypeClass() { + public Class getTypeClass() { return refinedAttributeDefinition.getTypeClass(); } @Override - public ResourceAttributeDefinition getAttributeDefinition() { + public ResourceAttributeDefinition getAttributeDefinition() { return refinedAttributeDefinition.getAttributeDefinition(); } @Override - public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { + public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { refinedAttributeDefinition.setAttributeDefinition(attributeDefinition); } @@ -450,7 +451,7 @@ public String getNativeAttributeName() { } @Override - public Object[] getAllowedValues() { + public Collection> getAllowedValues() { return refinedAttributeDefinition.getAllowedValues(); } diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java index edd5d0d1bf8..39e2bb8ff69 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedAttributeDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.common.refinery; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,6 +31,7 @@ import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AttributeFetchStrategyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; @@ -41,7 +43,7 @@ /** * @author semancik */ -public class RefinedAttributeDefinition extends ResourceAttributeDefinition implements DebugDumpable { +public class RefinedAttributeDefinition extends ResourceAttributeDefinition implements DebugDumpable { private static LayerType DEFAULT_LAYER = LayerType.MODEL; @@ -52,7 +54,7 @@ public class RefinedAttributeDefinition extends ResourceAttributeDefinition impl protected boolean secondaryIdentifier = false; private List intolerantValuePattern; private List tolerantValuePattern; - private ResourceAttributeDefinition attributeDefinition; + private ResourceAttributeDefinition attributeDefinition; private AttributeFetchStrategyType fetchStrategy; private MappingType outboundMappingType; private List inboundMappingTypes; @@ -61,7 +63,7 @@ public class RefinedAttributeDefinition extends ResourceAttributeDefinition impl private Integer modificationPriority; private Boolean readReplaceMode; - protected RefinedAttributeDefinition(ResourceAttributeDefinition attrDef, PrismContext prismContext) { + protected RefinedAttributeDefinition(ResourceAttributeDefinition attrDef, PrismContext prismContext) { super(attrDef.getName(), attrDef.getTypeName(), prismContext); this.attributeDefinition = attrDef; } @@ -184,11 +186,11 @@ public void setDescription(String description) { this.description = description; } - public ResourceAttributeDefinition getAttributeDefinition() { + public ResourceAttributeDefinition getAttributeDefinition() { return attributeDefinition; } - public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { + public void setAttributeDefinition(ResourceAttributeDefinition attributeDefinition) { this.attributeDefinition = attributeDefinition; } @@ -224,7 +226,7 @@ public String getNativeAttributeName() { return attributeDefinition.getNativeAttributeName(); } - public Object[] getAllowedValues() { + public Collection> getAllowedValues() { return attributeDefinition.getAllowedValues(); } @@ -314,11 +316,11 @@ public List getIntolerantValuePattern(){ } // schemaHandlingAttrDefType may be null if we are parsing from schema only - static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDef, ResourceAttributeDefinitionType schemaHandlingAttrDefType, + static RefinedAttributeDefinition parse(ResourceAttributeDefinition schemaAttrDef, ResourceAttributeDefinitionType schemaHandlingAttrDefType, ObjectClassComplexTypeDefinition objectClassDef, PrismContext prismContext, String contextDescription) throws SchemaException { - RefinedAttributeDefinition rAttrDef = new RefinedAttributeDefinition(schemaAttrDef, prismContext); + RefinedAttributeDefinition rAttrDef = new RefinedAttributeDefinition(schemaAttrDef, prismContext); if (schemaHandlingAttrDefType != null && schemaHandlingAttrDefType.getDisplayName() != null) { rAttrDef.setDisplayName(schemaHandlingAttrDefType.getDisplayName()); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java index e5181164f98..965c13d0c9f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismConstants.java @@ -72,6 +72,7 @@ public class PrismConstants { public static final QName A_OBJECT_REFERENCE_TARGET_TYPE = new QName(NS_ANNOTATION, "objectReferenceTargetType"); public static final QName A_COMPOSITE = new QName(NS_ANNOTATION, "composite"); public static final QName A_DEPRECATED = new QName(NS_ANNOTATION, "deprecated"); + public static final QName A_LABEL = new QName(NS_ANNOTATION, "label"); public static final QName SCHEMA_DOCUMENTATION = new QName(W3C_XML_SCHEMA_NS_URI, "documentation"); public static final QName SCHEMA_APP_INFO = new QName(W3C_XML_SCHEMA_NS_URI, "appinfo"); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java index 538297a3f52..4246498d69f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +16,13 @@ package com.evolveum.midpoint.prism; -import java.util.Arrays; +import java.util.Collection; import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.DisplayableValue; /** * Property Definition. @@ -56,7 +57,7 @@ public class PrismPropertyDefinition extends ItemDefinition { private static final long serialVersionUID = 7259761997904371009L; private QName valueType; - private T[] allowedValues; + private Collection> allowedValues; private Boolean indexed = null; private T defaultValue; @@ -64,9 +65,9 @@ public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext p super(elementName, typeName, prismContext); } - public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext prismContext, T[] allowevValues, T defaultValue) { + public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext prismContext, Collection> allowedValues, T defaultValue) { super(elementName, typeName, prismContext); - this.allowedValues = allowevValues; + this.allowedValues = allowedValues; this.defaultValue = defaultValue; } @@ -75,7 +76,7 @@ public PrismPropertyDefinition(QName elementName, QName typeName, PrismContext p * * @return Object array. May be null. */ - public T[] getAllowedValues() { + public Collection> getAllowedValues() { return allowedValues; } @@ -158,36 +159,51 @@ protected void extendToString(StringBuilder sb) { sb.append(",I"); } } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((allowedValues == null) ? 0 : allowedValues.hashCode()); + result = prime * result + ((defaultValue == null) ? 0 : defaultValue.hashCode()); + result = prime * result + ((indexed == null) ? 0 : indexed.hashCode()); + result = prime * result + ((valueType == null) ? 0 : valueType.hashCode()); + return result; + } @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + Arrays.hashCode(allowedValues); - result = prime * result + ((valueType == null) ? 0 : valueType.hashCode()); - return result; - } + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + PrismPropertyDefinition other = (PrismPropertyDefinition) obj; + if (allowedValues == null) { + if (other.allowedValues != null) + return false; + } else if (!allowedValues.equals(other.allowedValues)) + return false; + if (defaultValue == null) { + if (other.defaultValue != null) + return false; + } else if (!defaultValue.equals(other.defaultValue)) + return false; + if (indexed == null) { + if (other.indexed != null) + return false; + } else if (!indexed.equals(other.indexed)) + return false; + if (valueType == null) { + if (other.valueType != null) + return false; + } else if (!valueType.equals(other.valueType)) + return false; + return true; + } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - PrismPropertyDefinition other = (PrismPropertyDefinition) obj; - if (!Arrays.equals(allowedValues, other.allowedValues)) - return false; - if (valueType == null) { - if (other.valueType != null) - return false; - } else if (!valueType.equals(other.valueType)) - return false; - return true; - } - - /** + /** * Return a human readable name of this class suitable for logs. */ @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java index 8007d8ed720..78bb8d359a6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java @@ -449,7 +449,7 @@ private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, PrismProper if (prismContext.getBeanConverter().canProcess(typeName) && !typeName.equals(PolyStringType.COMPLEX_TYPE) && !typeName.equals(ItemPathType.COMPLEX_TYPE)) { // Primitive elements may also have complex Java representations (e.g. enums) return prismContext.getBeanConverter().unmarshallPrimitive(xprim, typeName); - } else if (def != null && def.isRuntimeSchema() && def.getAllowedValues() != null && def.getAllowedValues().length > 0){ + } else if (def != null && def.isRuntimeSchema() && def.getAllowedValues() != null && def.getAllowedValues().size() > 0){ //TODO: ugly hack to support enum in extension schemas --- need to be fixed realValue = xprim.getParsedValue(DOMUtil.XSD_STRING); @@ -479,9 +479,9 @@ private T parseAtomicValueFromPrimitive(PrimitiveXNode xprim, PrismProper return realValue; } - private boolean isAllowed(T realValue, Object[] allowedValues){ - for (Object o : allowedValues){ - if (realValue.equals(((DisplayableValue)o).getValue())){ + private boolean isAllowed(T realValue, Collection> collection){ + for (DisplayableValue o : collection){ + if (realValue.equals(o.getValue())){ return true; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java index d0cfa154957..410c9ef3c93 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/DomToSchemaProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -69,6 +70,7 @@ import com.evolveum.midpoint.prism.Definition; import com.evolveum.midpoint.prism.DisplayableValueImpl; import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -76,6 +78,7 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -815,13 +818,13 @@ private PrismContainerDefinition createPropertyContainerDefinition(XSType xsT * It creates either PropertyDefinition itself or one of its subclasses (ResourceObjectAttributeDefinition). The behavior * depends of the "mode" of the schema. This method is also processing annotations and other fancy property-relates stuff. */ - private PrismPropertyDefinition createPropertyDefinition(XSType xsType, QName elementName, QName typeName, + private PrismPropertyDefinition createPropertyDefinition(XSType xsType, QName elementName, QName typeName, ComplexTypeDefinition ctd, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - PrismPropertyDefinition propDef; + PrismPropertyDefinition propDef; SchemaDefinitionFactory definitionFactory = getDefinitionFactory(); - Object[] allowedValues= parseEnumAllowedValues(xsType); + Collection> allowedValues= parseEnumAllowedValues(xsType); Object defaultValue = parseDefaultValue(elementParticle, typeName); @@ -888,38 +891,38 @@ private Object parseDefaultValue(XSParticle elementParticle, QName typeName) { return null; } - private Object[] parseEnumAllowedValues(XSType xsType){ + private Collection> parseEnumAllowedValues(XSType xsType){ if (xsType.isSimpleType()){ if (xsType.asSimpleType().isRestriction()){ XSRestrictionSimpleType restriction = xsType.asSimpleType().asRestriction(); List enumerations = restriction.getDeclaredFacets(XSFacet.FACET_ENUMERATION); - List enumValues = new ArrayList(enumerations.size()); + List> enumValues = new ArrayList>(enumerations.size()); for (XSFacet facet : enumerations){ - String label = facet.getValue().value; - XSSchema facetSchema = facet.getSourceDocument().getSchema(); - + String value = facet.getValue().value; Element descriptionE = SchemaProcessorUtil.getAnnotationElement(facet.getAnnotation(), SCHEMA_DOCUMENTATION); Element appInfo = SchemaProcessorUtil.getAnnotationElement(facet.getAnnotation(), SCHEMA_APP_INFO); Element valueE = null; if (appInfo != null){ - NodeList list = appInfo.getElementsByTagNameNS("http://java.sun.com/xml/ns/jaxb", "typesafeEnumMember"); + NodeList list = appInfo.getElementsByTagNameNS(PrismConstants.A_LABEL.getNamespaceURI(), + PrismConstants.A_LABEL.getLocalPart()); if (list.getLength() != 0){ valueE = (Element) list.item(0); } } - String value = null; + String label = null; if (valueE != null){ - value = valueE.getAttribute("name"); - + label = valueE.getTextContent(); + } else { + label = value; } - DisplayableValueImpl edv = new DisplayableValueImpl(value, label, descriptionE != null ? descriptionE.getTextContent() : null); + DisplayableValueImpl edv = new DisplayableValueImpl(value, label, descriptionE != null ? descriptionE.getTextContent() : null); enumValues.add(edv); } if (enumValues != null && !enumValues.isEmpty()){ - return enumValues.toArray(); + return enumValues; } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java index 20f757d043e..5f9e0cfdb09 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/schema/SchemaDefinitionFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,21 @@ */ package com.evolveum.midpoint.prism.schema; +import java.util.Collection; + import javax.xml.namespace.QName; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; import com.sun.xml.xsom.XSAnnotation; import com.sun.xml.xsom.XSComplexType; @@ -44,14 +48,14 @@ public ComplexTypeDefinition createComplexTypeDefinition(XSComplexType complexTy return new ComplexTypeDefinition(typeName, prismContext); } - public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, + public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismPropertyDefinition(elementName, typeName, prismContext); + return new PrismPropertyDefinition(elementName, typeName, prismContext); } - public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, - PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle, T[] allowedValues, T defaultValue) throws SchemaException { - return new PrismPropertyDefinition(elementName, typeName, prismContext, allowedValues, defaultValue); + public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, + PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle, Collection> allowedValues, T defaultValue) throws SchemaException { + return new PrismPropertyDefinition(elementName, typeName, prismContext, allowedValues, defaultValue); } public PrismReferenceDefinition createReferenceDefinition(QName primaryElementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, @@ -59,9 +63,9 @@ public PrismReferenceDefinition createReferenceDefinition(QName primaryElementNa return new PrismReferenceDefinition(primaryElementName, typeName, prismContext); } - public PrismContainerDefinition createContainerDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, + public PrismContainerDefinition createContainerDefinition(QName elementName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { - return new PrismContainerDefinition(elementName, complexTypeDefinition, prismContext); + return new PrismContainerDefinition(elementName, complexTypeDefinition, prismContext); } public PrismObjectDefinition createObjectDefinition(QName elementName, @@ -74,7 +78,7 @@ public PrismObjectDefinition createObjectDefinition(QN * Create optional extra definition form a top-level complex type definition. * This is used e.g. to create object class definitions in midPoint */ - public PrismContainerDefinition createExtraDefinitionFromComplexType(XSComplexType complexType, + public PrismContainerDefinition createExtraDefinitionFromComplexType(XSComplexType complexType, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation) throws SchemaException { // Create nothing by default diff --git a/infra/prism/src/main/resources/xml/ns/public/annotation-3.xsd b/infra/prism/src/main/resources/xml/ns/public/annotation-3.xsd index 35ce6395743..372c860903b 100644 --- a/infra/prism/src/main/resources/xml/ns/public/annotation-3.xsd +++ b/infra/prism/src/main/resources/xml/ns/public/annotation-3.xsd @@ -250,6 +250,14 @@ + + + + + Displayable label of enumeration item. + + + diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java index bcb3b0e21c3..2465c838632 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/MidPointSchemaDefinitionFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import org.w3c.dom.Element; import com.evolveum.midpoint.prism.ComplexTypeDefinition; +import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.Objectable; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContext; @@ -31,6 +32,7 @@ import com.evolveum.midpoint.prism.schema.SchemaToDomProcessor; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.sun.xml.xsom.XSAnnotation; @@ -210,7 +212,7 @@ private void addExtraObjectClassAnnotations(ObjectClassComplexTypeDefinition def } @Override - public PrismContainerDefinition createExtraDefinitionFromComplexType(XSComplexType complexType, + public PrismContainerDefinition createExtraDefinitionFromComplexType(XSComplexType complexType, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation) throws SchemaException { // if (complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { // return createResourceAttributeContainerDefinition(complexType, (ObjectClassComplexTypeDefinition)complexTypeDefinition, @@ -230,7 +232,7 @@ private PrismContainerDefinition createResourceAttributeContainerDefinition(XSCo } @Override - public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, + public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, XSParticle elementParticle) throws SchemaException { if (complexTypeDefinition != null && complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { @@ -241,9 +243,9 @@ public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName } @Override - public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, + public PrismPropertyDefinition createPropertyDefinition(QName elementName, QName typeName, ComplexTypeDefinition complexTypeDefinition, PrismContext prismContext, XSAnnotation annotation, - XSParticle elementParticle, T[] allowedValues, T defaultValue) throws SchemaException { + XSParticle elementParticle, Collection> allowedValues, T defaultValue) throws SchemaException { if (complexTypeDefinition != null && complexTypeDefinition instanceof ObjectClassComplexTypeDefinition) { return createResourceAttributeDefinition(elementName, typeName, prismContext, annotation); } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java index ebe6d6e4c48..b409213d0f1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ * @author Radovan Semancik * */ -public class ResourceAttributeDefinition extends PrismPropertyDefinition { +public class ResourceAttributeDefinition extends PrismPropertyDefinition { private static final long serialVersionUID = 7092192397127114804L; private String nativeAttributeName; @@ -51,13 +51,13 @@ public ResourceAttributeDefinition(QName elementName, QName typeName, PrismConte super(elementName, typeName, prismContext); } - public ResourceAttribute instantiate() { + public ResourceAttribute instantiate() { return instantiate(getName()); } - public ResourceAttribute instantiate(QName name) { + public ResourceAttribute instantiate(QName name) { name = addNamespaceIfApplicable(name); - return new ResourceAttribute(name, this, prismContext); + return new ResourceAttribute(name, this, prismContext); } public Boolean getReturnedByDefault() { @@ -88,7 +88,7 @@ public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinitio } public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition identifier : objectDefinition.getIdentifiers()) { + for (ResourceAttributeDefinition identifier : objectDefinition.getIdentifiers()) { if (this == identifier) { return true; } @@ -97,7 +97,7 @@ public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { } public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) { - for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { + for (ResourceAttributeDefinition secondaryIdentifier : objectDefinition.getSecondaryIdentifiers()) { if (this == secondaryIdentifier) { return true; } @@ -135,13 +135,13 @@ public void setNativeAttributeName(String nativeAttributeName) { @Override - public ResourceAttributeDefinition clone() { - ResourceAttributeDefinition clone = new ResourceAttributeDefinition(getName(), getTypeName(), getPrismContext()); + public ResourceAttributeDefinition clone() { + ResourceAttributeDefinition clone = new ResourceAttributeDefinition(getName(), getTypeName(), getPrismContext()); copyDefinitionData(clone); return clone; } - protected void copyDefinitionData(ResourceAttributeDefinition clone) { + protected void copyDefinitionData(ResourceAttributeDefinition clone) { super.copyDefinitionData(clone); clone.nativeAttributeName = this.nativeAttributeName; clone.returnedByDefault = this.returnedByDefault; diff --git a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java index 3e63c6b85c9..86285f905d5 100644 --- a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java +++ b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestUtil.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.util.JAXBUtil; +import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; @@ -104,6 +105,11 @@ public static void assertSetEquals(String message, Collection actual, T.. } } + public static void assertSetEquals(String message, T[] actual, T[] expected) { + assertTrue(message+"expected "+Arrays.toString(expected)+", was "+Arrays.toString(actual), + MiscUtil.unorderedArrayEquals(actual, expected)); + } + public static String getNodeOid(Node node) { Node oidNode = null; if ((null == node.getAttributes()) diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java index 74273b7362f..d95b6e2a8ef 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.nio.channels.FileChannel; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Comparator; @@ -120,6 +121,9 @@ public static boolean unorderedCollectionEquals(Collection a, Collection b, Comp if (a == null || b == null) { return false; } + if (a.size() != b.size()) { + return false; + } Collection outstanding = new ArrayList(b.size()); outstanding.addAll(b); for (Object ao: a) { @@ -142,6 +146,50 @@ public static boolean unorderedCollectionEquals(Collection a, Collection b, Comp return true; } + public static boolean unorderedArrayEquals(T[] a, T[] b) { + Comparator comparator = new Comparator() { + @Override + public int compare(T o1, T o2) { + return o1.equals(o2) ? 0 : 1; + } + }; + return unorderedArrayEquals(a, b, comparator); + } + + /** + * Only zero vs non-zero value of comparator is important. + */ + public static boolean unorderedArrayEquals(T[] a, T[] b, Comparator comparator) { + if (a == null && b == null) { + return true; + } + if (a == null || b == null) { + return false; + } + if (a.length != b.length) { + return false; + } + List outstanding = Arrays.asList(b); + for (T ao: a) { + boolean found = false; + Iterator iterator = outstanding.iterator(); + while(iterator.hasNext()) { + T oo = iterator.next(); + if (comparator.compare(ao, oo) == 0) { + iterator.remove(); + found = true; + } + } + if (!found) { + return false; + } + } + if (!outstanding.isEmpty()) { + return false; + } + return true; + } + public static int unorderedCollectionHashcode(Collection collection) { // Stupid implmentation, just add all the hashcodes int hashcode = 0; @@ -410,4 +458,15 @@ public static String stripHtmlMarkup(String htmlString) { } return htmlString.replaceAll("<[^>]*>", ""); } + + public static Collection getValuesFromDisplayableValues(Collection> disps) { + if (disps == null) { + return null; + } + List out = new ArrayList(disps.size()); + for (DisplayableValue disp: disps) { + out.add(disp.getValue()); + } + return out; + } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java index a78dceca187..b99114df567 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java @@ -349,6 +349,7 @@ public class AbstractConfiguredModelIntegrationTest extends AbstractModelIntegra protected static final QName PIRACY_FUNERAL_TIMESTAMP = new QName(NS_PIRACY, "funeralTimestamp"); protected static final QName PIRACY_SEA_QNAME = new QName(NS_PIRACY, "sea"); protected static final QName PIRACY_COLORS = new QName(NS_PIRACY, "colors"); + protected static final QName PIRACY_MARK = new QName(NS_PIRACY, "mark"); protected static final ItemPath ROLE_EXTENSION_COST_CENTER_PATH = new ItemPath(RoleType.F_EXTENSION, new QName(NS_PIRACY, "costCenter")); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java index f4ac43c263d..0d868b237ca 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestStrangeCases.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.FileInputStream; import java.util.Collection; +import java.util.Iterator; import java.util.List; import javax.xml.bind.JAXBException; @@ -42,11 +43,13 @@ import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -69,6 +72,7 @@ import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -702,6 +706,89 @@ public void test410DeleteJack() throws Exception { } + @Test + public void test500EnumerationExtension() throws Exception { + final String TEST_NAME = "test500EnumerationExtension"; + TestUtil.displayTestTile(this, TEST_NAME); + + PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); + PrismPropertyDefinition markDef = userDef.findPropertyDefinition(new ItemPath(UserType.F_EXTENSION, PIRACY_MARK)); + + // WHEN + TestUtil.assertSetEquals("Wrong allowedValues in mark", MiscUtil.getValuesFromDisplayableValues(markDef.getAllowedValues()), + "pegLeg","noEye","hook","tatoo","scar","bravery"); + + for (DisplayableValue disp: markDef.getAllowedValues()) { + if (disp.getValue().equals("pegLeg")) { + assertEquals("Wrong pegLeg label", "Peg Leg", disp.getLabel()); + } + } + } + + @Test + public void test502EnumerationStoreGood() throws Exception { + final String TEST_NAME = "test502EnumerationStoreGood"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + + PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); + PrismPropertyDefinition markDef = userDef.findPropertyDefinition(new ItemPath(UserType.F_EXTENSION, PIRACY_MARK)); + + Task task = taskManager.createTaskInstance(TestModelServiceContract.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + dummyAuditService.clear(); + + // WHEN + modifyObjectReplaceProperty(UserType.class, USER_GUYBRUSH_OID, new ItemPath(UserType.F_EXTENSION, PIRACY_MARK), + task, result, "bravery"); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + assertSuccess(result); + + PrismObject user = getUser(USER_GUYBRUSH_OID); + PrismProperty markProp = user.findProperty(new ItemPath(UserType.F_EXTENSION, PIRACY_MARK)); + assertEquals("Bad mark", "bravery", markProp.getRealValue()); + } + + /** + * Guybrush has stored mark "bravery". Change schema so this value becomes illegal. + * They try to read it. + */ + @Test(enabled=false) // MID-2260 + public void test510EnumerationGetBad() throws Exception { + final String TEST_NAME = "test510EnumerationGetBad"; + TestUtil.displayTestTile(this, TEST_NAME); + + PrismObjectDefinition userDef = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); + PrismPropertyDefinition markDef = userDef.findPropertyDefinition(new ItemPath(UserType.F_EXTENSION, PIRACY_MARK)); + Iterator> iterator = markDef.getAllowedValues().iterator(); + while (iterator.hasNext()) { + DisplayableValue disp = iterator.next(); + if (disp.getValue().equals("bravery")) { + iterator.remove(); + } + } + + // GIVEN + Task task = taskManager.createTaskInstance(TestModelServiceContract.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + dummyAuditService.clear(); + + // WHEN + PrismObject user = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + assertSuccess(result); + + PrismProperty markProp = user.findProperty(new ItemPath(UserType.F_EXTENSION, PIRACY_MARK)); + assertEquals("Bad mark", "bravery", markProp.getRealValue()); + } + private void assertExtension(PrismObject object, QName propName, T... expectedValues) { PrismContainer extensionContainer = object.findContainer(ObjectType.F_EXTENSION); assertNotNull("No extension container in "+object, extensionContainer); diff --git a/model/model-intest/src/test/resources/schema/piracy.xsd b/model/model-intest/src/test/resources/schema/piracy.xsd index 31bbd49763e..aadb365cfa4 100644 --- a/model/model-intest/src/test/resources/schema/piracy.xsd +++ b/model/model-intest/src/test/resources/schema/piracy.xsd @@ -17,6 +17,7 @@ --> @@ -75,9 +76,34 @@ + + + + + + + + Peg Leg + + + + + + + No Eye + + + + + + + + + +