/*
* Copyright (c) 2010-2013 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.schema.util;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.xnode.PrimitiveXNode;
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ApprovalSchemaType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LoginEventType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
import com.evolveum.prism.xml.ns._public.types_3.RawType;
import javax.xml.bind.JAXBElement;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.util.Date;
/**
* @author mederly
*/
public class ValueDisplayUtil {
public static String toStringValue(PrismPropertyValue propertyValue) {
Object value = propertyValue.getValue();
if (value == null) {
return null;
} else if (value instanceof String) {
return (String) value;
} else if (value instanceof PolyString) {
return ((PolyString) value).getOrig();
} else if (value instanceof ProtectedStringType) {
return "(protected string)"; // todo i18n
} else if (value instanceof Boolean || value instanceof Integer || value instanceof Long) {
return value.toString();
} else if (value instanceof XMLGregorianCalendar) {
return ((XMLGregorianCalendar) value).toGregorianCalendar().getTime().toLocaleString(); // todo fix
} else if (value instanceof Date) {
return ((Date) value).toLocaleString(); // todo fix
} else if (value instanceof LoginEventType) {
LoginEventType loginEventType = (LoginEventType) value;
if (loginEventType.getTimestamp() != null) {
return loginEventType.getTimestamp().toGregorianCalendar().getTime().toLocaleString(); // todo fix
} else {
return "";
}
} else if (value instanceof ApprovalSchemaType) {
ApprovalSchemaType approvalSchemaType = (ApprovalSchemaType) value;
return approvalSchemaType.getName() + (approvalSchemaType.getDescription() != null ? (": " + approvalSchemaType.getDescription()) : "") + " (...)";
} else if (value instanceof ConstructionType) {
ConstructionType ct = (ConstructionType) value;
Object resource = (ct.getResource() != null ? ct.getResource().getName() : (ct.getResourceRef() != null ? ct.getResourceRef().getOid() : null));
return "resource object" + (resource != null ? " on " + resource : "") + (ct.getDescription() != null ? ": " + ct.getDescription() : "");
} else if (value instanceof Enum) {
return value.toString();
} else if (value instanceof ResourceAttributeDefinitionType) {
ResourceAttributeDefinitionType radt = (ResourceAttributeDefinitionType) value;
ItemPathType ref = radt.getRef();
String path;
if (ref != null) {
path = ref.getItemPath().toString();
} else {
path = "(null)";
}
StringBuilder sb = new StringBuilder();
MappingType mappingType = radt.getOutbound();
if (mappingType != null) {
if (mappingType.getExpression() == null) {
sb.append("Empty mapping for ").append(path);
} else {
sb.append(path).append(" = ");
boolean first = true;
for (JAXBElement<?> evaluator : mappingType.getExpression().getExpressionEvaluator()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
if (QNameUtil.match(SchemaConstants.C_VALUE, evaluator.getName()) && evaluator.getValue() instanceof RawType) {
RawType raw = (RawType) evaluator.getValue();
try {
XNode xnode = raw.serializeToXNode();
if (xnode instanceof PrimitiveXNode) {
sb.append(((PrimitiveXNode) xnode).getStringValue());
} else {
sb.append("(a complex value)");
}
} catch (SchemaException e) {
sb.append("(an invalid value)");
}
} else {
sb.append("(a complex expression)");
}
}
}
if (mappingType.getStrength() != null) {
sb.append(" (").append(mappingType.getStrength().value()).append(")");
}
} else {
sb.append("Empty mapping for ").append(path);
}
return sb.toString();
} else if (value instanceof QName) {
QName qname = (QName) value;
return qname.getLocalPart();
// if (StringUtils.isNotEmpty(qname.getNamespaceURI())) {
// return qname.getLocalPart() + " (in " + qname.getNamespaceURI() + ")";
// } else {
// return qname.getLocalPart();
// }
} else if (value instanceof Number) {
return String.valueOf(value);
} else if (value instanceof byte[]) {
return "(binary data)";
} else {
return "(a value of type " + value.getClass().getName() + ")"; // todo i18n
}
}
public static String toStringValue(PrismReferenceValue ref) {
String rv = getReferredObjectInformation(ref);
if (ref.getRelation() != null) {
rv += " [" + ref.getRelation().getLocalPart() + "]";
}
return rv;
}
private static String getReferredObjectInformation(PrismReferenceValue ref) {
if (ref.getObject() != null) {
return ref.getObject().toString();
} else {
return (ref.getTargetType() != null ? ref.getTargetType().getLocalPart()+":" : "")
+ (ref.getTargetName() != null ? ref.getTargetName() : ref.getOid());
}
}
}