/*
* Copyright (c) 2010-2016 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 com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceSchema;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import javax.xml.namespace.QName;
import java.util.Collection;
import java.util.List;
/**
* @author semancik
*
* This class enhances RefinedResourceSchema with a layer-specific view.
*
* TODO: However, there are a few unresolved issues that should be dealt with:
*
* 1) Although it might seem to contain LayerRefinedObjectClassDefinitions (LROCDs), it is not the case:
* it generates them on the fly by calling LROCD.wrap method every time.
*
* 2) When accessing attributes via findItemDefinition of this object, a non-layered version
* of attribute container is returned.
*
*/
public class LayerRefinedResourceSchemaImpl implements LayerRefinedResourceSchema {
private final RefinedResourceSchema refinedResourceSchema;
private final LayerType layer;
LayerRefinedResourceSchemaImpl(RefinedResourceSchema refinedResourceSchema, LayerType layer) {
this.refinedResourceSchema = refinedResourceSchema;
this.layer = layer;
}
@Override
public LayerType getLayer() {
return layer;
}
public List<? extends RefinedObjectClassDefinition> getRefinedDefinitions(ShadowKindType kind) {
return LayerRefinedObjectClassDefinitionImpl
.wrapCollection(refinedResourceSchema.getRefinedDefinitions(kind), layer);
}
@Override
public ResourceSchema getOriginalResourceSchema() {
return refinedResourceSchema.getOriginalResourceSchema();
}
@Override
public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, ShadowType shadow) {
return LayerRefinedObjectClassDefinitionImpl
.wrap(refinedResourceSchema.getRefinedDefinition(kind, shadow), layer);
}
@Override
public String getNamespace() {
return refinedResourceSchema.getNamespace();
}
@Override
public LayerRefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, String intent) {
return LayerRefinedObjectClassDefinitionImpl
.wrap(refinedResourceSchema.getRefinedDefinition(kind, intent), layer);
}
@Override
@NotNull
public Collection<Definition> getDefinitions() {
return refinedResourceSchema.getDefinitions();
}
@Override
public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(
ResourceShadowDiscriminator discriminator) {
return refinedResourceSchema.determineCompositeObjectClassDefinition(discriminator);
}
@Override
public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(
PrismObject<ShadowType> shadow) throws SchemaException {
return refinedResourceSchema.determineCompositeObjectClassDefinition(shadow);
}
@Override
@NotNull
public <T extends Definition> List<T> getDefinitions(@NotNull Class<T> type) {
return refinedResourceSchema.getDefinitions(type);
}
@Override
public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(
PrismObject<ShadowType> shadow, Collection<QName> additionalAuxiliaryObjectClassQNames) throws SchemaException {
return refinedResourceSchema.determineCompositeObjectClassDefinition(shadow, additionalAuxiliaryObjectClassQNames);
}
@Override
public CompositeRefinedObjectClassDefinition determineCompositeObjectClassDefinition(
QName structuralObjectClassQName, ShadowKindType kind, String intent) {
return refinedResourceSchema.determineCompositeObjectClassDefinition(structuralObjectClassQName, kind, intent);
}
@Override
public PrismContext getPrismContext() {
return refinedResourceSchema.getPrismContext();
}
@Override
@NotNull
public Document serializeToXsd() throws SchemaException {
return refinedResourceSchema.serializeToXsd();
}
@Override
public boolean isEmpty() {
return refinedResourceSchema.isEmpty();
}
@Override
public RefinedObjectClassDefinition getRefinedDefinition(ShadowKindType kind, Collection<String> intents)
throws SchemaException {
return refinedResourceSchema.getRefinedDefinition(kind, intents);
}
@Override
public LayerRefinedObjectClassDefinition getRefinedDefinition(QName typeName) {
return LayerRefinedObjectClassDefinitionImpl
.wrap(refinedResourceSchema.getRefinedDefinition(typeName), layer);
}
@Override
public LayerRefinedObjectClassDefinition getDefaultRefinedDefinition(ShadowKindType kind) {
return LayerRefinedObjectClassDefinitionImpl
.wrap(refinedResourceSchema.getDefaultRefinedDefinition(kind), layer);
}
public LayerRefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(ShadowKindType kind, QName objectClass) {
return LayerRefinedObjectClassDefinitionImpl
.wrap(refinedResourceSchema.findRefinedDefinitionByObjectClassQName(kind, objectClass), layer);
}
@Override
public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) {
return refinedResourceSchema.findObjectClassDefinition(objectClassQName);
}
@Override
public LayerRefinedResourceSchema forLayer(LayerType layer) {
return refinedResourceSchema.forLayer(layer);
}
@NotNull
@Override
public <ID extends ItemDefinition> List<ID> findItemDefinitionsByCompileTimeClass(
@NotNull Class<?> compileTimeClass, @NotNull Class<ID> definitionClass) {
return refinedResourceSchema.findItemDefinitionsByCompileTimeClass(compileTimeClass, definitionClass);
}
@Override
@Nullable
public <ID extends ItemDefinition> ID findItemDefinitionByType(@NotNull QName typeName,
@NotNull Class<ID> definitionClass) {
return refinedResourceSchema.findItemDefinitionByType(typeName, definitionClass);
}
@Override
@NotNull
public <ID extends ItemDefinition> List<ID> findItemDefinitionsByElementName(@NotNull QName elementName,
@NotNull Class<ID> definitionClass) {
return refinedResourceSchema.findItemDefinitionsByElementName(elementName, definitionClass);
}
@Override
@Nullable
public <TD extends TypeDefinition> TD findTypeDefinitionByCompileTimeClass(@NotNull Class<?> compileTimeClass, @NotNull Class<TD> definitionClass) {
return refinedResourceSchema.findTypeDefinitionByCompileTimeClass(compileTimeClass, definitionClass);
}
@Override
@Nullable
public <TD extends TypeDefinition> TD findTypeDefinitionByType(@NotNull QName typeName, @NotNull Class<TD> definitionClass) {
return refinedResourceSchema.findTypeDefinitionByType(typeName, definitionClass);
}
@NotNull
@Override
public <TD extends TypeDefinition> Collection<? extends TD> findTypeDefinitionsByType(@NotNull QName typeName,
@NotNull Class<TD> definitionClass) {
return refinedResourceSchema.findTypeDefinitionsByType(typeName, definitionClass);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((layer == null) ? 0 : layer.hashCode());
result = prime * result + ((refinedResourceSchema == null) ? 0 : refinedResourceSchema.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LayerRefinedResourceSchemaImpl other = (LayerRefinedResourceSchemaImpl) obj;
if (layer != other.layer)
return false;
if (refinedResourceSchema == null) {
if (other.refinedResourceSchema != null)
return false;
} else if (!refinedResourceSchema.equals(other.refinedResourceSchema))
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("LRSchema(layer=").append(layer).append(",\n");
sb.append(refinedResourceSchema.debugDump(indent + 1));
return sb.toString();
}
@Override
public ObjectClassComplexTypeDefinition findObjectClassDefinition(
ShadowKindType kind, String intent) {
return refinedResourceSchema.findObjectClassDefinition(kind, intent);
}
@Override
public List<? extends RefinedObjectClassDefinition> getRefinedDefinitions() {
return refinedResourceSchema.getRefinedDefinitions();
}
@Override
public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(
ShadowKindType kind) {
return refinedResourceSchema.findDefaultObjectClassDefinition(kind);
}
}