Skip to content

Commit

Permalink
Fixed refined definition clonning which fixes security tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Apr 9, 2015
1 parent a913277 commit d7216ed
Show file tree
Hide file tree
Showing 9 changed files with 284 additions and 66 deletions.
Expand Up @@ -62,9 +62,9 @@ static <T> LayerRefinedAttributeDefinition<T> wrap(RefinedAttributeDefinition<T>
return new LayerRefinedAttributeDefinition<T>(rAttrDef, layer);
}

static List<LayerRefinedAttributeDefinition> wrapCollection(
static List<LayerRefinedAttributeDefinition<?>> wrapCollection(
Collection<? extends ItemDefinition> defs, LayerType layer) {
List outs = new ArrayList<LayerRefinedAttributeDefinition>(defs.size());
List outs = new ArrayList<LayerRefinedAttributeDefinition<?>>(defs.size());
for (ItemDefinition itemDef: defs) {
if (itemDef instanceof LayerRefinedAttributeDefinition) {
outs.add(itemDef);
Expand All @@ -82,12 +82,12 @@ public LayerType getLayer() {
}

@Override
public ResourceAttribute instantiate() {
public ResourceAttribute<T> instantiate() {
return refinedAttributeDefinition.instantiate();
}

@Override
public ResourceAttribute instantiate(QName name) {
public ResourceAttribute<T> instantiate(QName name) {
return refinedAttributeDefinition.instantiate(name);
}

Expand Down
Expand Up @@ -60,7 +60,7 @@ public class LayerRefinedObjectClassDefinition extends RefinedObjectClassDefinit
* Keeps layer-specific information on resource object attributes.
* This list is lazily evaluated.
*/
private List<LayerRefinedAttributeDefinition> layerRefinedAttributeDefinitions;
private List<LayerRefinedAttributeDefinition<?>> layerRefinedAttributeDefinitions;

private LayerRefinedObjectClassDefinition(RefinedObjectClassDefinition refinedAccountDefinition, LayerType layer) {
super(new QName("fake"), refinedAccountDefinition.getPrismContext());
Expand Down Expand Up @@ -108,30 +108,30 @@ public void setIgnored(boolean ignored) {
}

@Override
public ResourceAttributeDefinition getDescriptionAttribute() {
public ResourceAttributeDefinition<?> getDescriptionAttribute() {
return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDescriptionAttribute());
}

@Override
public void setDescriptionAttribute(ResourceAttributeDefinition descriptionAttribute) {
public void setDescriptionAttribute(ResourceAttributeDefinition<?> descriptionAttribute) {
refinedObjectClassDefinition.setDescriptionAttribute(descriptionAttribute);
}

private LayerRefinedAttributeDefinition substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition attributeDef) {
LayerRefinedAttributeDefinition rAttrDef = findAttributeDefinition(attributeDef.getName());
private LayerRefinedAttributeDefinition<?> substituteLayerRefinedAttributeDefinition(ResourceAttributeDefinition<?> attributeDef) {
LayerRefinedAttributeDefinition<?> rAttrDef = findAttributeDefinition(attributeDef.getName());
return rAttrDef;
}

private Collection<LayerRefinedAttributeDefinition> substituteLayerRefinedAttributeDefinitionCollection(Collection<? extends RefinedAttributeDefinition> attributes) {
Collection<LayerRefinedAttributeDefinition> retval = new ArrayList<>();
for (RefinedAttributeDefinition rad : attributes) {
private Collection<LayerRefinedAttributeDefinition<?>> substituteLayerRefinedAttributeDefinitionCollection(Collection<? extends RefinedAttributeDefinition<?>> attributes) {
Collection<LayerRefinedAttributeDefinition<?>> retval = new ArrayList<>();
for (RefinedAttributeDefinition<?> rad : attributes) {
retval.add(substituteLayerRefinedAttributeDefinition(rad));
}
return retval;
}

@Override
public LayerRefinedAttributeDefinition getNamingAttribute() {
public LayerRefinedAttributeDefinition<?> getNamingAttribute() {
return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getNamingAttribute());
}

Expand Down Expand Up @@ -186,7 +186,7 @@ public void setDisplayOrder(Integer displayOrder) {
}

@Override
public LayerRefinedAttributeDefinition getDisplayNameAttribute() {
public LayerRefinedAttributeDefinition<?> getDisplayNameAttribute() {
return substituteLayerRefinedAttributeDefinition(refinedObjectClassDefinition.getDisplayNameAttribute());
}

Expand All @@ -201,7 +201,7 @@ public void setDisplayNameAttribute(QName displayName) {
}

@Override
public Collection<? extends LayerRefinedAttributeDefinition> getIdentifiers() {
public Collection<? extends LayerRefinedAttributeDefinition<?>> getIdentifiers() {
return substituteLayerRefinedAttributeDefinitionCollection(refinedObjectClassDefinition.getIdentifiers());
}

Expand All @@ -217,7 +217,7 @@ public void setHelp(String help) {
}

@Override
public Collection<? extends LayerRefinedAttributeDefinition> getSecondaryIdentifiers() {
public Collection<? extends LayerRefinedAttributeDefinition<?>> getSecondaryIdentifiers() {
return LayerRefinedAttributeDefinition.wrapCollection(refinedObjectClassDefinition.getSecondaryIdentifiers(), layer);
}

Expand All @@ -237,7 +237,7 @@ public PrismContext getPrismContext() {
}

@Override
public void setNamingAttribute(ResourceAttributeDefinition namingAttribute) {
public void setNamingAttribute(ResourceAttributeDefinition<?> namingAttribute) {
refinedObjectClassDefinition.setNamingAttribute(namingAttribute);
}

Expand All @@ -263,7 +263,7 @@ public PrismPropertyDefinition findPropertyDefinition(QName name) {
}

@Override
public LayerRefinedAttributeDefinition findAttributeDefinition(QName elementQName) {
public <X> LayerRefinedAttributeDefinition<X> findAttributeDefinition(QName elementQName) {
for (LayerRefinedAttributeDefinition definition : getAttributeDefinitions()) {
if (QNameUtil.match(definition.getName(), elementQName)) {
return definition;
Expand All @@ -278,7 +278,7 @@ public void setNativeObjectClass(String nativeObjectClass) {
}

@Override
public LayerRefinedAttributeDefinition findAttributeDefinition(String elementLocalname) {
public <X> LayerRefinedAttributeDefinition<X> findAttributeDefinition(String elementLocalname) {
return findAttributeDefinition(new QName(getResourceNamespace(), elementLocalname)); // todo or should we use ns-less matching?
}

Expand Down Expand Up @@ -328,7 +328,7 @@ public void setObjectClassDefinition(ObjectClassComplexTypeDefinition objectClas
}

@Override
public List<? extends LayerRefinedAttributeDefinition> getAttributeDefinitions() {
public List<? extends LayerRefinedAttributeDefinition<?>> getAttributeDefinitions() {
if (layerRefinedAttributeDefinitions == null) {
layerRefinedAttributeDefinitions = LayerRefinedAttributeDefinition.wrapCollection(refinedObjectClassDefinition.getAttributeDefinitions(), layer);
}
Expand All @@ -346,12 +346,12 @@ public PrismObjectDefinition<ShadowType> getObjectDefinition() {
}

@Override
public void setDisplayNameAttribute(ResourceAttributeDefinition displayName) {
public void setDisplayNameAttribute(ResourceAttributeDefinition<?> displayName) {
refinedObjectClassDefinition.setDisplayNameAttribute(displayName);
}

@Override
public LayerRefinedAttributeDefinition getAttributeDefinition(QName attributeName) {
public LayerRefinedAttributeDefinition<?> getAttributeDefinition(QName attributeName) {
// todo should there be any difference between findAttributeDefinition and getAttributeDefinition? [mederly]
return findAttributeDefinition(attributeName);
}
Expand Down
Expand Up @@ -62,6 +62,7 @@ public class RefinedAttributeDefinition<T> extends ResourceAttributeDefinition<T
private QName matchingRuleQName = null;
private Integer modificationPriority;
private Boolean readReplaceMode;
private PropertyAccessType accessOverride = new PropertyAccessType();

protected RefinedAttributeDefinition(ResourceAttributeDefinition<T> attrDef, PrismContext prismContext) {
super(attrDef.getName(), attrDef.getTypeName(), prismContext);
Expand Down Expand Up @@ -95,6 +96,9 @@ public boolean canAdd() {
}

public boolean canAdd(LayerType layer) {
if (accessOverride.isAdd() != null) {
return accessOverride.isAdd();
}
return limitationsMap.get(layer).getAccess().isAdd();
}

Expand All @@ -104,6 +108,9 @@ public boolean canRead() {
}

public boolean canRead(LayerType layer) {
if (accessOverride.isRead() != null) {
return accessOverride.isRead();
}
return limitationsMap.get(layer).getAccess().isRead();
}

Expand All @@ -113,12 +120,15 @@ public boolean canModify() {
}

public boolean canModify(LayerType layer) {
if (accessOverride.isModify() != null) {
return accessOverride.isModify();
}
return limitationsMap.get(layer).getAccess().isModify();
}

@Override
public void setReadOnly() {
throw new UnsupportedOperationException("Parts of refined attribute are immutable");
setCanRead(false);
}

@Override
Expand All @@ -138,17 +148,17 @@ public void setMaxOccurs(int maxOccurs) {

@Override
public void setCanRead(boolean read) {
throw new UnsupportedOperationException("Parts of refined attribute are immutable");
accessOverride.setRead(read);
}

@Override
public void setCanModify(boolean update) {
throw new UnsupportedOperationException("Parts of refined attribute are immutable");
accessOverride.setModify(update);
}

@Override
public void setCanAdd(boolean create) {
throw new UnsupportedOperationException("Parts of refined attribute are immutable");
accessOverride.setAdd(create);
}

@Override
Expand Down Expand Up @@ -469,6 +479,34 @@ static boolean isIgnored(ResourceAttributeDefinitionType attrDefType) throws Sch
}

@Override
public RefinedAttributeDefinition<T> clone() {
ResourceAttributeDefinition<T> attrDefClone = this.attributeDefinition.clone();
RefinedAttributeDefinition<T> clone = new RefinedAttributeDefinition<>(attrDefClone, prismContext);
copyDefinitionData(clone);
return clone;
}

protected void copyDefinitionData(RefinedAttributeDefinition<T> clone) {
clone.accessOverride = this.accessOverride.clone();
clone.description = this.description;
clone.displayName = this.displayName;
clone.fetchStrategy = this.fetchStrategy;
clone.inboundMappingTypes = this.inboundMappingTypes;
clone.intolerantValuePattern = this.intolerantValuePattern;
clone.isExclusiveStrong = this.isExclusiveStrong;
clone.limitationsMap = this.limitationsMap;
clone.matchingRuleQName = this.matchingRuleQName;
clone.modificationPriority = this.modificationPriority;
clone.outboundMappingType = this.outboundMappingType;
clone.readReplaceMode = this.readReplaceMode;
clone.secondaryIdentifier = this.secondaryIdentifier;
clone.tolerant = this.tolerant;
clone.tolerantValuePattern = this.tolerantValuePattern;
}



@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
Expand Down

0 comments on commit d7216ed

Please sign in to comment.