Skip to content

Commit

Permalink
COMPAT mode applies to invalid values in repo.
Browse files Browse the repository at this point in the history
GUI adapted to new time interval campaign parameters.
  • Loading branch information
mederly committed Feb 8, 2016
1 parent 99b1438 commit ce8cae4
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 96 deletions.
Expand Up @@ -16,7 +16,6 @@
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

import javax.xml.namespace.QName;
Expand Down Expand Up @@ -59,7 +58,7 @@ protected void initLayout() {
TextArea descriptionField = new TextArea(ID_DESCRIPTION, new PropertyModel<>(getModel(), StageDefinitionDto.F_DESCRIPTION));
add(descriptionField);

TextField durationField = new TextField(ID_DURATION, new PropertyModel<>(getModel(), StageDefinitionDto.F_DAYS));
TextField durationField = new TextField(ID_DURATION, new PropertyModel<>(getModel(), StageDefinitionDto.F_DURATION));
add(durationField);

TextField notifyBeforeDeadlineField = new TextField(ID_NOTIFY_BEFORE_DEADLINE,
Expand Down
Expand Up @@ -30,7 +30,9 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import org.apache.commons.lang3.StringUtils;

import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.io.Serializable;
Expand Down Expand Up @@ -243,8 +245,10 @@ private StageDefinitionDto createStageDefinitionDto(AccessCertificationStageDefi
dto.setNumber(stageDefObj.getNumber());
dto.setName(stageDefObj.getName());
dto.setDescription(stageDefObj.getDescription());
dto.setDays(stageDefObj.getDays());
dto.setNotifyBeforeDeadline(convertListIntegerToString(stageDefObj.getNotifyBeforeDeadline()));
if (stageDefObj.getDuration() != null) {
dto.setDuration(stageDefObj.getDuration().toString());
}
dto.setNotifyBeforeDeadline(convertDurationListToString(stageDefObj.getNotifyBeforeDeadline()));
dto.setNotifyOnlyWhenNoDecision(Boolean.TRUE.equals(stageDefObj.isNotifyOnlyWhenNoDecision()));
dto.setReviewerDto(createAccessCertificationReviewerDto(stageDefObj.getReviewerSpecification()));
dto.setOutcomeStrategy(stageDefObj.getOutcomeStrategy());
Expand Down Expand Up @@ -347,9 +351,11 @@ private AccessCertificationStageDefinitionType createStageDefinitionType(StageDe
stageDefType.setNumber(stageDefDto.getNumber());
stageDefType.setName(stageDefDto.getName());
stageDefType.setDescription(stageDefDto.getDescription());
stageDefType.setDays(stageDefDto.getDays());
if (StringUtils.isNotBlank(stageDefDto.getDuration())) {
stageDefType.setDuration(XmlTypeConverter.createDuration(stageDefDto.getDuration()));
}
stageDefType.getNotifyBeforeDeadline().clear();
stageDefType.getNotifyBeforeDeadline().addAll(convertStringToListInteger(stageDefDto.getNotifyBeforeDeadline()));
stageDefType.getNotifyBeforeDeadline().addAll(convertStringToDurationList(stageDefDto.getNotifyBeforeDeadline()));
stageDefType.setNotifyOnlyWhenNoDecision(Boolean.TRUE.equals(stageDefDto.isNotifyOnlyWhenNoDecision()));
stageDefType.setReviewerSpecification(createAccessCertificationReviewerType(stageDefDto.getReviewerDto()));
stageDefType.setOutcomeStrategy(stageDefDto.getOutcomeStrategy());
Expand Down Expand Up @@ -396,24 +402,19 @@ private ManagerSearchDto createManagerSearchDto(ManagerSearchType managerSearchT
return managerSearchDto;
}

private String convertListIntegerToString(List<Integer> list){
String result = "";
for (Integer listItem : list){
result += Integer.toString(listItem);
if(list.indexOf(listItem) < list.size() - 1){
result += ", ";
}
}
private String convertDurationListToString(List<Duration> list){
String result = StringUtils.join(list, ", ");
return result;
}

private List<Integer> convertStringToListInteger(String object){
List<Integer> list = new ArrayList<>();
private List<Duration> convertStringToDurationList(String object){
List<Duration> list = new ArrayList<>();
if (object != null) {
String[] values = object.split(",");
for (String value : values) {
if (!value.trim().equals("")) {
list.add(Integer.parseInt(value.trim()));
value = value.trim();
if (!value.equals("")) {
list.add(XmlTypeConverter.createDuration(value));
}
}
}
Expand Down
Expand Up @@ -3,6 +3,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseOutcomeStrategyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType;

import javax.xml.datatype.Duration;
import java.io.Serializable;
import java.util.List;

Expand All @@ -13,7 +14,7 @@ public class StageDefinitionDto implements Serializable {
public final static String F_NUMBER = "number";
public final static String F_NAME = "name";
public final static String F_DESCRIPTION = "description";
public final static String F_DAYS = "days";
public final static String F_DURATION = "duration";
public final static String F_NOTIFY_BEFORE_DEADLINE = "notifyBeforeDeadline";
public final static String F_NOTIFY_ONLY_WHEN_NO_DECISION = "notifyOnlyWhenNoDecision";
public final static String F_REVIEWER_SPECIFICATION = "reviewerSpecification";
Expand All @@ -24,7 +25,7 @@ public class StageDefinitionDto implements Serializable {
private int number;
private String name;
private String description;
private Integer days;
private String duration;
private String notifyBeforeDeadline;
private boolean notifyOnlyWhenNoDecision;
private AccessCertificationReviewerDto reviewerDto;
Expand Down Expand Up @@ -55,12 +56,12 @@ public void setDescription(String description) {
this.description = description;
}

public Integer getDays() {
return days;
public String getDuration() {
return duration;
}

public void setDays(Integer days) {
this.days = days;
public void setDuration(String duration) {
this.duration = duration;
}

public String getNotifyBeforeDeadline() {
Expand Down
Expand Up @@ -29,18 +29,15 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
Expand All @@ -53,11 +50,12 @@
import com.evolveum.midpoint.prism.xnode.XNode;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.SchemaException;

public class DomParser implements Parser {


public static final Trace LOGGER = TraceManager.getTrace(DomParser.class);

private static final QName SCHEMA_ELEMENT_QNAME = DOMUtil.XSD_SCHEMA_ELEMENT;

private SchemaRegistry schemaRegistry;
Expand Down Expand Up @@ -270,8 +268,8 @@ private PrimitiveValueParser(Element element) {
}

@Override
public T parse(QName typeName) throws SchemaException {
return parsePrimitiveElementValue(element, typeName);
public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
return parsePrimitiveElementValue(element, typeName, mode);
}
@Override
public boolean isEmpty() {
Expand Down Expand Up @@ -299,8 +297,8 @@ public PrimitiveAttributeParser(Attr attr) {
this.attr = attr;
}
@Override
public T parse(QName typeName) throws SchemaException {
return parsePrimitiveAttrValue(attr, typeName);
public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
return parsePrimitiveAttrValue(attr, typeName, mode);
}

@Override
Expand Down Expand Up @@ -332,34 +330,54 @@ private <T> PrimitiveXNode<T> parsePrimitiveElement(final Element element) throw
return xnode;
}

private static <T> T parsePrimitiveElementValue(Element element, QName typeName) throws SchemaException {
if (ItemPath.XSD_TYPE.equals(typeName)) {
return (T) parsePath(element);
} else if (DOMUtil.XSD_QNAME.equals(typeName)) {
return (T) DOMUtil.getQNameValue(element);
} else if (XmlTypeConverter.canConvert(typeName)) {
return (T) XmlTypeConverter.toJavaValue(element, typeName);
} else if (DOMUtil.XSD_ANYTYPE.equals(typeName)) {
return (T) element.getTextContent(); // if parsing primitive as xsd:anyType, we can safely parse it as string
} else {
throw new SchemaException("Cannot convert element '"+element+"' to "+typeName);
private static <T> T parsePrimitiveElementValue(Element element, QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
try {
if (ItemPath.XSD_TYPE.equals(typeName)) {
return (T) parsePath(element);
} else if (DOMUtil.XSD_QNAME.equals(typeName)) {
return (T) DOMUtil.getQNameValue(element);
} else if (XmlTypeConverter.canConvert(typeName)) {
return (T) XmlTypeConverter.toJavaValue(element, typeName);
} else if (DOMUtil.XSD_ANYTYPE.equals(typeName)) {
return (T) element.getTextContent(); // if parsing primitive as xsd:anyType, we can safely parse it as string
} else {
throw new SchemaException("Cannot convert element '" + element + "' to " + typeName);
}
} catch (IllegalArgumentException e) {
return processIllegalArgumentException(element.getTextContent(), typeName, e, mode); // primitive way of ensuring compatibility mode
}
}

private static <T> T processIllegalArgumentException(String value, QName typeName, IllegalArgumentException e, XNodeProcessorEvaluationMode mode) {
if (mode != XNodeProcessorEvaluationMode.COMPAT) {
throw e;
}
LOGGER.warn("Value of '{}' couldn't be parsed as '{}' -- interpreting as null because of COMPAT mode set", value, typeName, e);
return null;
}

private <T> PrimitiveXNode<T> parseAttributeValue(final Attr attr) {
PrimitiveXNode<T> xnode = new PrimitiveXNode<T>();
xnode.setValueParser(new PrimitiveAttributeParser<T>(attr));
xnode.setAttribute(true);
return xnode;
}

private static <T> T parsePrimitiveAttrValue(Attr attr, QName typeName) throws SchemaException {
private static <T> T parsePrimitiveAttrValue(Attr attr, QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
if (DOMUtil.XSD_QNAME.equals(typeName)) {
return (T) DOMUtil.getQNameValue(attr);
try {
return (T) DOMUtil.getQNameValue(attr);
} catch (IllegalArgumentException e) {
return processIllegalArgumentException(attr.getTextContent(), typeName, e, mode); // primitive way of ensuring compatibility mode
}
}
if (XmlTypeConverter.canConvert(typeName)) {
String stringValue = attr.getTextContent();
return XmlTypeConverter.toJavaValue(stringValue, typeName);
try {
return XmlTypeConverter.toJavaValue(stringValue, typeName);
} catch (IllegalArgumentException e) {
return processIllegalArgumentException(attr.getTextContent(), typeName, e, mode); // primitive way of ensuring compatibility mode
}
} else {
throw new SchemaException("Cannot convert attribute '"+attr+"' to "+typeName);
}
Expand Down
Expand Up @@ -517,7 +517,7 @@ private <T> T parseAtomicValueFromPrimitive(PrimitiveXNode<T> xprim, PrismProper

} else {
try {
realValue = xprim.getParsedValue(typeName);
realValue = xprim.getParsedValue(typeName, mode);
} catch (SchemaException e) {
if (isStrict()) {
throw e;
Expand Down
Expand Up @@ -5,18 +5,14 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode;
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.prism.xnode.ValueParser;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.util.TokenBuffer;
import org.apache.commons.lang.StringUtils;

public class JsonValueParser<T> implements ValueParser<T> {
Expand All @@ -37,7 +33,7 @@ public JsonParser getParser() {
return parser;
}
@Override
public T parse(QName typeName) throws SchemaException {
public T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
ObjectMapper mapper = (ObjectMapper) parser.getCodec();
Class clazz = XsdTypeMapper.toJavaType(typeName);

Expand All @@ -50,6 +46,7 @@ public T parse(QName typeName) throws SchemaException {
// }
// }
return r.readValue(node);
// TODO implement COMPAT mode
} catch (IOException e) {
// TODO Auto-generated catch block
throw new SchemaException("Cannot parse value: " + e.getMessage(), e);
Expand Down
Expand Up @@ -21,6 +21,7 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode;
import com.evolveum.midpoint.prism.util.CloneUtil;
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.util.logging.Trace;
Expand Down Expand Up @@ -67,10 +68,10 @@ public PrimitiveXNode(T value) {
this.value = value;
}

public void parseValue(QName typeName) throws SchemaException {
public void parseValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
Validate.notNull(typeName, "Cannot parse primitive XNode without knowing its type");
if (valueParser != null) {
value = valueParser.parse(typeName);
value = valueParser.parse(typeName, mode);
// Necessary. It marks that the value is parsed. It also frees some memory.
valueParser = null;
}
Expand All @@ -81,8 +82,12 @@ public T getValue() {
}

public T getParsedValue(QName typeName) throws SchemaException {
return getParsedValue(typeName, XNodeProcessorEvaluationMode.STRICT);
}

public T getParsedValue(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException {
if (!isParsed()) {
parseValue(typeName);
parseValue(typeName, mode);
}
return value;
}
Expand Down Expand Up @@ -149,7 +154,7 @@ public T getParsedValueWithoutRecording(QName typeName) throws SchemaException {
if (isParsed()) {
return value;
} else {
return valueParser.parse(typeName);
return valueParser.parse(typeName, XNodeProcessorEvaluationMode.STRICT);
}
}

Expand Down Expand Up @@ -184,7 +189,7 @@ public String getGuessedFormattedValue() throws SchemaException {
if (getTypeQName() == null) {
throw new IllegalStateException("Cannot fetch formatted value if type definition is not set");
}
T value = valueParser.parse(getTypeQName());
T value = valueParser.parse(getTypeQName(), XNodeProcessorEvaluationMode.STRICT);
return formatValue(value);
}

Expand Down
Expand Up @@ -15,9 +15,9 @@
*/
package com.evolveum.midpoint.prism.xnode;

import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.parser.XNodeProcessorEvaluationMode;
import com.evolveum.midpoint.util.exception.SchemaException;

import java.util.Map;
Expand All @@ -30,7 +30,7 @@

public interface ValueParser<T> {

T parse(QName typeName) throws SchemaException;
T parse(QName typeName, XNodeProcessorEvaluationMode mode) throws SchemaException;

// This has to work even without the type
boolean isEmpty();
Expand Down

0 comments on commit ce8cae4

Please sign in to comment.