BasicAttributeContext implements AttributeContext, Serializable { @Override public int hashCode() { return nullSafeHashCode(templateAttribute) + nullSafeHashCode(preparer) + nullSafeHashCode(attributes) + nullSafeHashCode(cascadedAttributes); } 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 testHashCode() { BasicAttributeContext attributeContext = new BasicAttributeContext(); attributeContext.setPreparer("my.preparer"); Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp"); attributeContext.setTemplateAttribute(templateAttribute); Attribute attribute1 = new Attribute("value1"); Attribute attribute2 = new Attribute("value2"); Attribute attribute3 = new Attribute("value3"); attributeContext.putAttribute("attribute1", attribute1, true); attributeContext.putAttribute("attribute2", attribute2, true); attributeContext.putAttribute("attribute3", attribute3, false); Map<String, Attribute> cascadedAttributes = new HashMap<String, Attribute>(); cascadedAttributes.put("attribute1", attribute1); cascadedAttributes.put("attribute2", attribute2); Map<String, Attribute> attributes = new HashMap<String, Attribute>(); attributes.put("attribute3", attribute3); assertEquals(templateAttribute.hashCode() + "my.preparer".hashCode() + attributes.hashCode() + cascadedAttributes.hashCode(), attributeContext.hashCode()); }