BasicAttributeContext implements AttributeContext, Serializable { public void inherit(AttributeContext parent) { if (parent instanceof BasicAttributeContext) { inherit((BasicAttributeContext) parent); } else { Attribute parentTemplateAttribute = parent.getTemplateAttribute(); inheritParentTemplateAttribute(parentTemplateAttribute); if (preparer == null) { preparer = parent.getPreparer(); } Set<String> names = parent.getCascadedAttributeNames(); if (names != null && !names.isEmpty()) { for (String name : names) { Attribute attribute = parent.getCascadedAttribute(name); Attribute destAttribute = getCascadedAttribute(name); if (destAttribute == null) { putAttribute(name, attribute, true); } else if (attribute instanceof ListAttribute && destAttribute instanceof ListAttribute && ((ListAttribute) destAttribute).isInherit()) { ((ListAttribute) destAttribute).inherit((ListAttribute) attribute); } } } names = parent.getLocalAttributeNames(); if (names != null && !names.isEmpty()) { for (String name : names) { Attribute attribute = parent.getLocalAttribute(name); Attribute destAttribute = getLocalAttribute(name); if (destAttribute == null) { putAttribute(name, attribute, false); } else if (attribute instanceof ListAttribute && destAttribute instanceof ListAttribute && ((ListAttribute) destAttribute).isInherit()) { ((ListAttribute) destAttribute).inherit((ListAttribute) attribute); } } } } } BasicAttributeContext();  BasicAttributeContext(Map<String, Attribute> attributes);  BasicAttributeContext(AttributeContext context);  BasicAttributeContext(BasicAttributeContext context); Attribute getTemplateAttribute(); void setTemplateAttribute(Attribute templateAttribute); String getPreparer(); void setPreparer(String url); void inheritCascadedAttributes(AttributeContext context); void inherit(AttributeContext parent); void inherit(BasicAttributeContext parent); void addAll(Map<String, Attribute> newAttributes); void addMissing(Map<String, Attribute> defaultAttributes); Attribute getAttribute(String name); Attribute getLocalAttribute(String name); Attribute getCascadedAttribute(String name); Set<String> getLocalAttributeNames(); Set<String> getCascadedAttributeNames(); void putAttribute(String name, Attribute value); void putAttribute(String name, Attribute value, boolean cascade); void clear(); @Override boolean equals(Object obj); @Override int hashCode();  }
@Test public void testInherit() { AttributeContext toCopy = new BasicAttributeContext(); Attribute parentTemplateAttribute = new Attribute(); parentTemplateAttribute.setValue("/parent/template.jsp"); toCopy.setTemplateAttribute(parentTemplateAttribute); toCopy.putAttribute("name1", new Attribute("value1"), true); toCopy.putAttribute("name2", new Attribute("value2"), true); toCopy.putAttribute("name3", new Attribute("value3"), false); toCopy.putAttribute("name4", new Attribute("value4"), false); AttributeContext context = new BasicAttributeContext(); Attribute templateAttribute = new Attribute(); templateAttribute.setRole("role1,role2"); context.setTemplateAttribute(templateAttribute); context.putAttribute("name1", new Attribute("newValue1"), true); context.putAttribute("name3", new Attribute("newValue3"), false); context.inherit(toCopy); Attribute attribute = context.getTemplateAttribute(); assertEquals("/parent/template.jsp", attribute.getValue()); assertTrue(attribute.getRoles().contains("role1")); assertTrue(attribute.getRoles().contains("role2")); attribute = context.getCascadedAttribute("name1"); assertNotNull("Attribute name1 not found", attribute); assertEquals("Attribute name1 has not been set correctly", "newValue1", attribute.getValue()); attribute = context.getCascadedAttribute("name2"); assertNotNull("Attribute name2 not found", attribute); assertEquals("Attribute name2 has not been set correctly", "value2", attribute.getValue()); attribute = context.getLocalAttribute("name3"); assertNotNull("Attribute name3 not found", attribute); assertEquals("Attribute name3 has not been set correctly", "newValue3", attribute.getValue()); attribute = context.getLocalAttribute("name4"); assertNotNull("Attribute name4 not found", attribute); assertEquals("Attribute name4 has not been set correctly", "value4", attribute.getValue()); toCopy = new BasicAttributeContext(); toCopy.putAttribute("name1", new Attribute("value1"), true); toCopy.putAttribute("name2", new Attribute("value2"), true); toCopy.putAttribute("name3", new Attribute("value3"), false); toCopy.putAttribute("name4", new Attribute("value4"), false); context = new BasicAttributeContext(); context.inherit(toCopy); attribute = context.getCascadedAttribute("name1"); assertNotNull("Attribute name1 not found", attribute); assertEquals("Attribute name1 has not been set correctly", "value1", attribute.getValue()); attribute = context.getCascadedAttribute("name2"); assertNotNull("Attribute name2 not found", attribute); assertEquals("Attribute name2 has not been set correctly", "value2", attribute.getValue()); attribute = context.getLocalAttribute("name3"); assertNotNull("Attribute name3 not found", attribute); assertEquals("Attribute name3 has not been set correctly", "value3", attribute.getValue()); attribute = context.getLocalAttribute("name4"); assertNotNull("Attribute name4 not found", attribute); assertEquals("Attribute name4 has not been set correctly", "value4", attribute.getValue()); }