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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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 extends DisplayableValue> 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
+
+
+
+
+
+
+
+
+
+