package org.simantics.db.layer0.variable; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.type.Datatype; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.exception.NonWritableVariableException; import org.simantics.utils.ObjectUtils; abstract public class AbstractConstantPropertyVariable extends AbstractPropertyVariable { final protected Variable parent; final String name; final Binding binding; final Map properties; public AbstractConstantPropertyVariable(Variable parent, String name, Binding binding, Collection propertyBuilders, Set classifications) { assert parent != null; assert name != null; this.parent = parent; this.name = name; this.binding = binding; this.properties = new HashMap(propertyBuilders.size()); for(ConstantPropertyVariableBuilder builder : propertyBuilders) { properties.put(builder.getName(), builder.build(this)); } if(!classifications.isEmpty()) properties.put(Variables.CLASSIFICATIONS, new ConstantPropertyVariable(this, Variables.CLASSIFICATIONS, classifications, null)); } public AbstractConstantPropertyVariable(Variable parent, String name, Binding binding) { this(parent, name, binding, Collections.emptyList(), Collections.emptySet()); } @Override public void setValue(WriteGraph graph, Object value, Binding binding) throws DatabaseException { throw new NonWritableVariableException("Value is constant."); } @Override public String getName(ReadGraph graph) throws DatabaseException { return name; } @Override public Resource getType(ReadGraph graph) throws DatabaseException { return null; } @Override public Resource getPossibleType(ReadGraph graph) throws DatabaseException { return null; } @Override public Resource getType(ReadGraph graph, Resource baseType) throws DatabaseException { return null; } @Override public Resource getPossibleType(ReadGraph graph, Resource baseType) throws DatabaseException { return null; } // @Override // public Object getSerialized(ReadGraph graph) throws DatabaseException { // return name; // } @Override public Variable getParent(ReadGraph graph) throws DatabaseException { return parent; } @Override public Resource getRepresents(ReadGraph graph) throws DatabaseException { return null; } @Override public Datatype getDatatype(ReadGraph graph) throws DatabaseException { return binding != null ? binding.type() : null; } @Override public Resource getPropertyResource(ReadGraph graph) throws DatabaseException { return null; } @Override public Resource getContainerResource(ReadGraph graph) throws DatabaseException { return null; } @Override public Variable getPredicate(ReadGraph graph) throws DatabaseException { return null; } @Override protected Variable getPossibleDomainProperty(ReadGraph graph, String name) throws DatabaseException { return properties.get(name); } @Override public Map collectDomainProperties(ReadGraph graph, Map properties) throws DatabaseException { if(!this.properties.isEmpty()) { if(properties == null) properties = new HashMap(this.properties.size()); properties.putAll(this.properties); } return properties; } @Override public Set getClassifications(ReadGraph graph) throws DatabaseException { Variable property = getPossibleDomainProperty(graph, Variables.CLASSIFICATIONS); if(property != null) return property.getValue(graph); else return Collections.emptySet(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + name.hashCode(); result = prime * result + parent.hashCode(); result = prime * result + ((binding == null) ? 0 : binding.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; AbstractConstantPropertyVariable other = (AbstractConstantPropertyVariable) obj; if (!name.equals(other.name)) return false; if (!parent.equals(other.parent)) return false; return ObjectUtils.objectEquals(binding, other.binding); } }