/*
* Copyright (c) 2010-2017 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.common.refinery;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceAttribute;
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;
import org.jetbrains.annotations.NotNull;
/**
* @author semancik
*
*/
public class LayerRefinedAttributeDefinitionImpl<T> implements LayerRefinedAttributeDefinition<T> {
private RefinedAttributeDefinition<T> refinedAttributeDefinition;
private LayerType layer;
private Boolean overrideCanRead = null;
private Boolean overrideCanAdd = null;
private Boolean overrideCanModify = null;
private LayerRefinedAttributeDefinitionImpl(RefinedAttributeDefinition<T> refinedAttributeDefinition, LayerType layer) {
this.refinedAttributeDefinition = refinedAttributeDefinition;
this.layer = layer;
}
static <T> LayerRefinedAttributeDefinition<T> wrap(RefinedAttributeDefinition<T> rAttrDef, LayerType layer) {
if (rAttrDef == null) {
return null;
}
return new LayerRefinedAttributeDefinitionImpl<T>(rAttrDef, layer);
}
static List<LayerRefinedAttributeDefinition<?>> wrapCollection(
Collection<? extends ItemDefinition> defs, LayerType layer) {
List outs = new ArrayList<LayerRefinedAttributeDefinition<?>>(defs.size());
for (ItemDefinition itemDef: defs) {
if (itemDef instanceof LayerRefinedAttributeDefinition) {
outs.add(itemDef);
} else if (itemDef instanceof RefinedAttributeDefinition) {
outs.add(wrap((RefinedAttributeDefinition)itemDef, layer));
} else {
throw new IllegalStateException("Unexpected type of attribute definition: " + itemDef);
}
}
return outs;
}
@Override
public LayerType getLayer() {
return layer;
}
@Override
public Boolean getOverrideCanRead() {
return overrideCanRead;
}
public void setOverrideCanRead(Boolean overrideCanRead) {
this.overrideCanRead = overrideCanRead;
}
@Override
public Boolean getOverrideCanAdd() {
return overrideCanAdd;
}
public void setOverrideCanAdd(Boolean overrideCanAdd) {
this.overrideCanAdd = overrideCanAdd;
}
@Override
public Boolean getOverrideCanModify() {
return overrideCanModify;
}
public void setOverrideCanModify(Boolean overrideCanModify) {
this.overrideCanModify = overrideCanModify;
}
@Override
public boolean canAdd() {
if (overrideCanAdd != null) {
return overrideCanAdd;
}
return refinedAttributeDefinition.canAdd(layer);
}
@Override
public PropertyLimitations getLimitations() {
return refinedAttributeDefinition.getLimitations(layer);
}
@NotNull
@Override
public RefinedAttributeDefinition<T> clone() {
return refinedAttributeDefinition.clone();
}
// TODO ????????
@Override
public String debugDump(int indent, LayerType layer) {
return refinedAttributeDefinition.debugDump(indent, layer);
}
@Override
public boolean canRead() {
if (overrideCanRead != null) {
return overrideCanRead;
}
return refinedAttributeDefinition.canRead(layer);
}
@Override
public boolean isIgnored(LayerType layer) {
return refinedAttributeDefinition.isIgnored(layer);
}
@Override
public boolean canModify() {
if (overrideCanModify != null) {
return overrideCanModify;
}
return refinedAttributeDefinition.canModify(layer);
}
// @Override
// public boolean isValidFor(QName elementQName, Class clazz) {
// return isValidFor(elementQName, clazz, false);
// }
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((layer == null) ? 0 : layer.hashCode());
result = prime * result + ((refinedAttributeDefinition == null) ? 0 : refinedAttributeDefinition.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
// if (!super.equals(obj))
// return false;
if (getClass() != obj.getClass())
return false;
LayerRefinedAttributeDefinitionImpl other = (LayerRefinedAttributeDefinitionImpl) obj;
if (layer != other.layer)
return false;
if (refinedAttributeDefinition == null) {
if (other.refinedAttributeDefinition != null)
return false;
} else if (!refinedAttributeDefinition.equals(other.refinedAttributeDefinition))
return false;
return true;
}
@Override
public String debugDump() {
return debugDump(0);
}
@Override
public String debugDump(int indent) {
StringBuilder sb = new StringBuilder();
DebugUtil.indentDebugDump(sb, indent);
sb.append(getDebugDumpClassName()).append("(layer=").append(layer).append(",\n");
sb.append(refinedAttributeDefinition.debugDump(indent+1, layer));
return sb.toString();
}
/**
* Return a human readable name of this class suitable for logs.
*/
protected String getDebugDumpClassName() {
return "LRRAD";
}
//region Delegation (automatically generated)
@Override
public String getFrameworkAttributeName() {
return refinedAttributeDefinition.getFrameworkAttributeName();
}
@Override
public boolean isInherited() {
return refinedAttributeDefinition.isInherited();
}
@Override
public Integer getModificationPriority() {
return refinedAttributeDefinition.getModificationPriority();
}
@Override
public Boolean getReadReplaceMode() {
return refinedAttributeDefinition.getReadReplaceMode();
}
@Override
public <T extends ItemDefinition> T findItemDefinition(@NotNull ItemPath path, @NotNull Class<T> clazz) {
return refinedAttributeDefinition.findItemDefinition(path, clazz);
}
@Override
public boolean isDisplayNameAttribute() {
return refinedAttributeDefinition.isDisplayNameAttribute();
}
@Override
public ItemDefinition<PrismProperty<T>> deepClone(boolean ultraDeep) {
return refinedAttributeDefinition.deepClone(ultraDeep);
}
@Override
public void revive(PrismContext prismContext) {
refinedAttributeDefinition.revive(prismContext);
}
@Override
public Integer getDisplayOrder() {
return refinedAttributeDefinition.getDisplayOrder();
}
@Override
public String getHelp() {
return refinedAttributeDefinition.getHelp();
}
@Override
public String getDocumentation() {
return refinedAttributeDefinition.getDocumentation();
}
@Override
public String getDocumentationPreview() {
return refinedAttributeDefinition.getDocumentationPreview();
}
@Override
public boolean isRuntimeSchema() {
return refinedAttributeDefinition.isRuntimeSchema();
}
@Override
public PrismContext getPrismContext() {
return refinedAttributeDefinition.getPrismContext();
}
@Override
public Class getTypeClassIfKnown() {
return refinedAttributeDefinition.getTypeClassIfKnown();
}
@Override
public Class getTypeClass() {
return refinedAttributeDefinition.getTypeClass();
}
@Override
public String getDescription() {
return refinedAttributeDefinition.getDescription();
}
@Override
public PrismReferenceValue getValueEnumerationRef() {
return refinedAttributeDefinition.getValueEnumerationRef();
}
@Override
public ResourceAttributeDefinition<T> getAttributeDefinition() {
return refinedAttributeDefinition.getAttributeDefinition();
}
@Override
public boolean isValidFor(QName elementQName, Class<? extends ItemDefinition> clazz) {
return refinedAttributeDefinition.isValidFor(elementQName, clazz);
}
@Override
public MappingType getOutboundMappingType() {
return refinedAttributeDefinition.getOutboundMappingType();
}
@Override
public boolean hasOutboundMapping() {
return refinedAttributeDefinition.hasOutboundMapping();
}
@Override
public boolean isValidFor(@NotNull QName elementQName,
@NotNull Class<? extends ItemDefinition> clazz, boolean caseInsensitive) {
return refinedAttributeDefinition.isValidFor(elementQName, clazz, caseInsensitive);
}
@Override
public List<MappingType> getInboundMappingTypes() {
return refinedAttributeDefinition.getInboundMappingTypes();
}
@Override
public int getMaxOccurs(LayerType layer) {
return refinedAttributeDefinition.getMaxOccurs(layer);
}
@Override
public int getMinOccurs(LayerType layer) {
return refinedAttributeDefinition.getMinOccurs(layer);
}
@Override
public void adoptElementDefinitionFrom(ItemDefinition otherDef) {
refinedAttributeDefinition.adoptElementDefinitionFrom(otherDef);
}
@Override
public boolean isOptional(LayerType layer) {
return refinedAttributeDefinition.isOptional(layer);
}
@Override
public boolean isEmphasized() {
return refinedAttributeDefinition.isEmphasized();
}
@Override
public boolean isMandatory(LayerType layer) {
return refinedAttributeDefinition.isMandatory(layer);
}
@Override
public boolean isMultiValue(LayerType layer) {
return refinedAttributeDefinition.isMultiValue(layer);
}
@Override
public boolean isSingleValue(LayerType layer) {
return refinedAttributeDefinition.isSingleValue(layer);
}
@Override
public boolean isExlusiveStrong() {
return refinedAttributeDefinition.isExlusiveStrong();
}
@Override
public PropertyLimitations getLimitations(LayerType layer) {
return refinedAttributeDefinition.getLimitations(layer);
}
@Override
public AttributeFetchStrategyType getFetchStrategy() {
return refinedAttributeDefinition.getFetchStrategy();
}
@Override
public List<String> getTolerantValuePattern() {
return refinedAttributeDefinition.getTolerantValuePattern();
}
@Override
public List<String> getIntolerantValuePattern() {
return refinedAttributeDefinition.getIntolerantValuePattern();
}
@Override
public boolean isVolatilityTrigger() {
return refinedAttributeDefinition.isVolatilityTrigger();
}
@Override
public String getDisplayName() {
return refinedAttributeDefinition.getDisplayName();
}
@NotNull
@Override
public ResourceAttribute<T> instantiate() {
return refinedAttributeDefinition.instantiate();
}
@NotNull
@Override
public ResourceAttribute<T> instantiate(QName name) {
return refinedAttributeDefinition.instantiate(name);
}
@Override
public Boolean getReturnedByDefault() {
return refinedAttributeDefinition.getReturnedByDefault();
}
@Override
public boolean isReturnedByDefault() {
return refinedAttributeDefinition.isReturnedByDefault();
}
@Override
public boolean isIdentifier(ResourceAttributeContainerDefinition objectDefinition) {
return refinedAttributeDefinition.isIdentifier(objectDefinition);
}
@Override
@NotNull
public QName getName() {
return refinedAttributeDefinition.getName();
}
@Override
public String getNamespace() {
return refinedAttributeDefinition.getNamespace();
}
@Override
public int getMinOccurs() {
return refinedAttributeDefinition.getMinOccurs(layer);
}
@Override
public Collection<? extends DisplayableValue<T>> getAllowedValues() {
return refinedAttributeDefinition.getAllowedValues();
}
@Override
public int getMaxOccurs() {
return refinedAttributeDefinition.getMaxOccurs(layer);
}
@Override
public boolean isIdentifier(ObjectClassComplexTypeDefinition objectDefinition) {
return refinedAttributeDefinition.isIdentifier(objectDefinition);
}
@Override
public T defaultValue() {
return refinedAttributeDefinition.defaultValue();
}
@Override
public boolean isTolerant() {
return refinedAttributeDefinition.isTolerant();
}
@Override
public boolean isSingleValue() {
return refinedAttributeDefinition.isSingleValue(layer);
}
@Override
public QName getValueType() {
return refinedAttributeDefinition.getValueType();
}
@Override
public boolean isSecondaryIdentifier() {
return refinedAttributeDefinition.isSecondaryIdentifier();
}
@Override
public boolean isMultiValue() {
return refinedAttributeDefinition.isMultiValue(layer);
}
@Override
@NotNull
public QName getTypeName() {
return refinedAttributeDefinition.getTypeName();
}
@Override
public Boolean isIndexed() {
return refinedAttributeDefinition.isIndexed();
}
@Override
public boolean canAdd(LayerType layer) {
return refinedAttributeDefinition.canAdd(layer);
}
@Override
public boolean isMandatory() {
return refinedAttributeDefinition.isMandatory(layer);
}
@Override
public boolean isIgnored() {
return refinedAttributeDefinition.isIgnored(layer);
}
@Override
public boolean isSecondaryIdentifier(ObjectClassComplexTypeDefinition objectDefinition) {
return refinedAttributeDefinition.isSecondaryIdentifier(objectDefinition);
}
@Override
public QName getMatchingRuleQName() {
return refinedAttributeDefinition.getMatchingRuleQName();
}
@Override
public boolean isAbstract() {
return refinedAttributeDefinition.isAbstract();
}
@Override
public boolean isOptional() {
return refinedAttributeDefinition.isOptional(layer);
}
@Override
public boolean canRead(LayerType layer) {
return refinedAttributeDefinition.canRead(layer);
}
@Override
public boolean isDeprecated() {
return refinedAttributeDefinition.isDeprecated();
}
@Override
public boolean isOperational() {
return refinedAttributeDefinition.isOperational();
}
@Override
public PropertyDelta<T> createEmptyDelta(ItemPath path) {
return refinedAttributeDefinition.createEmptyDelta(path);
}
@Override
public boolean canModify(LayerType layer) {
return refinedAttributeDefinition.canModify(layer);
}
@Override
public boolean isDynamic() {
return refinedAttributeDefinition.isDynamic();
}
@Override
public String getNativeAttributeName() {
return refinedAttributeDefinition.getNativeAttributeName();
}
@Override
public RefinedAttributeDefinition<T> deepClone(Map<QName, ComplexTypeDefinition> ctdMap) {
return new LayerRefinedAttributeDefinitionImpl<T>(refinedAttributeDefinition.deepClone(ctdMap), layer);
}
@Override
public QName getSubstitutionHead() {
return refinedAttributeDefinition.getSubstitutionHead();
}
@Override
public boolean isHeterogeneousListItem() {
return refinedAttributeDefinition.isHeterogeneousListItem();
}
@Override
public void debugDumpShortToString(StringBuilder sb) {
refinedAttributeDefinition.debugDumpShortToString(sb);
}
//endregion
}