/*
* Copyright (c) 2010-2014 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.web.component.wizard.resource.dto;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.util.ExpressionUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IterationSpecificationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import javax.xml.bind.JAXBElement;
import java.io.Serializable;
/**
* @author shood
* */
public class IterationSpecificationTypeDto implements Serializable{
private static final Trace LOGGER = TraceManager.getTrace(IterationSpecificationTypeDto.class);
public static final String TOKEN_EXPRESSION_PREFIX = "token";
public static final String PRE_EXPRESSION_PREFIX = "pre";
public static final String POST_EXPRESSION_PREFIX = "post";
public static final String F_EXPRESSION_TYPE = "ExpressionType";
public static final String F_LANGUAGE = "Language";
public static final String F_POLICY_REF = "PolicyRef";
public static final String F_EXPRESSION = "Expression";
public static final String F_ITERATION = "iterationObject";
private ExpressionUtil.ExpressionEvaluatorType tokenExpressionType;
private ExpressionUtil.ExpressionEvaluatorType preExpressionType;
private ExpressionUtil.ExpressionEvaluatorType postExpressionType;
private ExpressionUtil.Language tokenLanguage;
private ExpressionUtil.Language preLanguage;
private ExpressionUtil.Language postLanguage;
private ObjectReferenceType tokenPolicyRef;
private ObjectReferenceType prePolicyRef;
private ObjectReferenceType postPolicyRef;
private String tokenExpression;
private String preExpression;
private String postExpression;
private IterationSpecificationType iterationObject;
public IterationSpecificationTypeDto(IterationSpecificationType iteration){
iterationObject = iteration;
}
public IterationSpecificationTypeDto(IterationSpecificationType iteration, PrismContext prismContext){
iterationObject = iteration;
if(!iterationObject.getTokenExpression().getExpressionEvaluator().isEmpty()){
loadExpression(tokenExpression, tokenExpressionType, tokenLanguage, tokenPolicyRef,
iterationObject.getTokenExpression(), prismContext);
}
if(!iterationObject.getPreIterationCondition().getExpressionEvaluator().isEmpty()){
loadExpression(preExpression, preExpressionType, preLanguage, prePolicyRef,
iterationObject.getPreIterationCondition(), prismContext);
}
if(!iterationObject.getPostIterationCondition().getExpressionEvaluator().isEmpty()){
loadExpression(postExpression, postExpressionType, postLanguage, postPolicyRef,
iterationObject.getPostIterationCondition(), prismContext);
}
}
private void loadExpression(String expression, ExpressionUtil.ExpressionEvaluatorType type, ExpressionUtil.Language language,
ObjectReferenceType ref, ExpressionType expressionType, PrismContext prismContext){
try{
if(expressionType.getExpressionEvaluator().size() == 1){
expression = prismContext.xmlSerializer().serialize(expressionType.getExpressionEvaluator().get(0));
} else {
StringBuilder sb = new StringBuilder();
for(JAXBElement<?> element: expressionType.getExpressionEvaluator()){
String subElement = prismContext.xmlSerializer().serialize(element);
sb.append(subElement).append("\n");
}
expression = sb.toString();
}
type = ExpressionUtil.getExpressionType(expression);
if(type != null && type.equals(ExpressionUtil.ExpressionEvaluatorType.SCRIPT)){
language = ExpressionUtil.getExpressionLanguage(expression);
}
} catch (SchemaException e){
//TODO - how can we show this error to user?
LoggingUtils.logUnexpectedException(LOGGER, "Could not load expressions from mapping.", e, e.getStackTrace());
expression = e.getMessage();
}
}
public void updateExpression(String prefix){
if(prefix.equals(TOKEN_EXPRESSION_PREFIX)){
tokenExpression = ExpressionUtil.getExpressionString(tokenExpressionType);
} else if(prefix.equals(PRE_EXPRESSION_PREFIX)){
preExpression = ExpressionUtil.getExpressionString(preExpressionType);
} else if(prefix.equals(POST_EXPRESSION_PREFIX)){
postExpression = ExpressionUtil.getExpressionString(postExpressionType);
}
}
public void updateExpressionLanguage(String prefix){
if(prefix.equals(TOKEN_EXPRESSION_PREFIX)){
tokenExpression = ExpressionUtil.getExpressionString(tokenExpressionType, tokenLanguage);
} else if(prefix.equals(PRE_EXPRESSION_PREFIX)){
preExpression = ExpressionUtil.getExpressionString(preExpressionType, preLanguage);
} else if(prefix.equals(POST_EXPRESSION_PREFIX)){
postExpression = ExpressionUtil.getExpressionString(postExpressionType, postLanguage);
}
}
public void updateExpressionPolicy(String prefix){
if(prefix.equals(TOKEN_EXPRESSION_PREFIX)){
tokenExpression = ExpressionUtil.getExpressionString(tokenExpressionType, tokenPolicyRef);
} else if(prefix.equals(PRE_EXPRESSION_PREFIX)){
preExpression = ExpressionUtil.getExpressionString(preExpressionType, prePolicyRef);
} else if(prefix.equals(POST_EXPRESSION_PREFIX)){
postExpression = ExpressionUtil.getExpressionString(postExpressionType, postPolicyRef);
}
}
public ExpressionUtil.Language getLanguage(String prefix){
if(prefix.equals(TOKEN_EXPRESSION_PREFIX)){
return tokenLanguage;
} else if(prefix.equals(PRE_EXPRESSION_PREFIX)){
return preLanguage;
} else if(prefix.equals(POST_EXPRESSION_PREFIX)){
return postLanguage;
}
return null;
}
public ExpressionUtil.ExpressionEvaluatorType getExpressionType(String prefix){
if(prefix.equals(TOKEN_EXPRESSION_PREFIX)){
return tokenExpressionType;
} else if(prefix.equals(PRE_EXPRESSION_PREFIX)){
return preExpressionType;
} else if(prefix.equals(POST_EXPRESSION_PREFIX)){
return postExpressionType;
}
return null;
}
public ExpressionUtil.ExpressionEvaluatorType getTokenExpressionType() {
return tokenExpressionType;
}
public void setTokenExpressionType(ExpressionUtil.ExpressionEvaluatorType tokenExpressionType) {
this.tokenExpressionType = tokenExpressionType;
}
public ExpressionUtil.ExpressionEvaluatorType getPreExpressionType() {
return preExpressionType;
}
public void setPreExpressionType(ExpressionUtil.ExpressionEvaluatorType preExpressionType) {
this.preExpressionType = preExpressionType;
}
public ExpressionUtil.ExpressionEvaluatorType getPostExpressionType() {
return postExpressionType;
}
public void setPostExpressionType(ExpressionUtil.ExpressionEvaluatorType postExpressionType) {
this.postExpressionType = postExpressionType;
}
public ExpressionUtil.Language getTokenLanguage() {
return tokenLanguage;
}
public void setTokenLanguage(ExpressionUtil.Language tokenLanguage) {
this.tokenLanguage = tokenLanguage;
}
public ExpressionUtil.Language getPreLanguage() {
return preLanguage;
}
public void setPreLanguage(ExpressionUtil.Language preLanguage) {
this.preLanguage = preLanguage;
}
public ExpressionUtil.Language getPostLanguage() {
return postLanguage;
}
public void setPostLanguage(ExpressionUtil.Language postLanguage) {
this.postLanguage = postLanguage;
}
public ObjectReferenceType getTokenPolicyRef() {
return tokenPolicyRef;
}
public void setTokenPolicyRef(ObjectReferenceType tokenPolicyRef) {
this.tokenPolicyRef = tokenPolicyRef;
}
public ObjectReferenceType getPrePolicyRef() {
return prePolicyRef;
}
public void setPrePolicyRef(ObjectReferenceType prePolicyRef) {
this.prePolicyRef = prePolicyRef;
}
public ObjectReferenceType getPostPolicyRef() {
return postPolicyRef;
}
public void setPostPolicyRef(ObjectReferenceType postPolicyRef) {
this.postPolicyRef = postPolicyRef;
}
public String getTokenExpression() {
return tokenExpression;
}
public void setTokenExpression(String tokenExpression) {
this.tokenExpression = tokenExpression;
}
public String getPreExpression() {
return preExpression;
}
public void setPreExpression(String preExpression) {
this.preExpression = preExpression;
}
public String getPostExpression() {
return postExpression;
}
public void setPostExpression(String postExpression) {
this.postExpression = postExpression;
}
public IterationSpecificationType getIterationObject() {
return iterationObject;
}
public void setIterationObject(IterationSpecificationType iterationObject) {
this.iterationObject = iterationObject;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IterationSpecificationTypeDto that = (IterationSpecificationTypeDto) o;
if (iterationObject != null ? !iterationObject.equals(that.iterationObject) : that.iterationObject != null)
return false;
if (postExpression != null ? !postExpression.equals(that.postExpression) : that.postExpression != null)
return false;
if (postExpressionType != that.postExpressionType) return false;
if (postLanguage != that.postLanguage) return false;
if (postPolicyRef != null ? !postPolicyRef.equals(that.postPolicyRef) : that.postPolicyRef != null)
return false;
if (preExpression != null ? !preExpression.equals(that.preExpression) : that.preExpression != null)
return false;
if (preExpressionType != that.preExpressionType) return false;
if (preLanguage != that.preLanguage) return false;
if (prePolicyRef != null ? !prePolicyRef.equals(that.prePolicyRef) : that.prePolicyRef != null) return false;
if (tokenExpression != null ? !tokenExpression.equals(that.tokenExpression) : that.tokenExpression != null)
return false;
if (tokenExpressionType != that.tokenExpressionType) return false;
if (tokenLanguage != that.tokenLanguage) return false;
if (tokenPolicyRef != null ? !tokenPolicyRef.equals(that.tokenPolicyRef) : that.tokenPolicyRef != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = tokenExpressionType != null ? tokenExpressionType.hashCode() : 0;
result = 31 * result + (preExpressionType != null ? preExpressionType.hashCode() : 0);
result = 31 * result + (postExpressionType != null ? postExpressionType.hashCode() : 0);
result = 31 * result + (tokenLanguage != null ? tokenLanguage.hashCode() : 0);
result = 31 * result + (preLanguage != null ? preLanguage.hashCode() : 0);
result = 31 * result + (postLanguage != null ? postLanguage.hashCode() : 0);
result = 31 * result + (tokenPolicyRef != null ? tokenPolicyRef.hashCode() : 0);
result = 31 * result + (prePolicyRef != null ? prePolicyRef.hashCode() : 0);
result = 31 * result + (postPolicyRef != null ? postPolicyRef.hashCode() : 0);
result = 31 * result + (tokenExpression != null ? tokenExpression.hashCode() : 0);
result = 31 * result + (preExpression != null ? preExpression.hashCode() : 0);
result = 31 * result + (postExpression != null ? postExpression.hashCode() : 0);
result = 31 * result + (iterationObject != null ? iterationObject.hashCode() : 0);
return result;
}
}