package org.openflexo.foundation.viewpoint.binding;
import java.lang.reflect.Type;
import java.util.List;
import java.util.logging.Logger;
import org.openflexo.antar.binding.AbstractBinding.BindingEvaluationContext;
import org.openflexo.antar.binding.BindingPathElement;
import org.openflexo.antar.binding.SimpleBindingPathElementImpl;
import org.openflexo.foundation.ontology.OntologyDataProperty;
import org.openflexo.foundation.ontology.owl.DataPropertyStatement;
import org.openflexo.foundation.ontology.owl.OWLIndividual;
import org.openflexo.foundation.ontology.owl.OWLObject;
import org.openflexo.foundation.ontology.owl.PropertyStatement;
public class DataPropertyStatementPathElement extends StatementPathElement<Object> {
private static final Logger logger = Logger.getLogger(DataPropertyStatementPathElement.class.getPackage().getName());
private OntologyDataProperty ontologyProperty;
private SimpleBindingPathElementImpl<String> asStringProperty;
private SimpleBindingPathElementImpl<Boolean> asBooleanProperty;
private SimpleBindingPathElementImpl<Integer> asIntegerProperty;
private SimpleBindingPathElementImpl<Byte> asByteProperty;
private SimpleBindingPathElementImpl<Short> asShortProperty;
private SimpleBindingPathElementImpl<Long> asLongProperty;
private SimpleBindingPathElementImpl<Character> asCharProperty;
private SimpleBindingPathElementImpl<Float> asFloatProperty;
private SimpleBindingPathElementImpl<Double> asDoubleProperty;
public DataPropertyStatementPathElement(BindingPathElement aParent, OntologyDataProperty anOntologyProperty) {
super(aParent);
ontologyProperty = anOntologyProperty;
if (anOntologyProperty.getDataType() == null) {
asStringProperty = new SimpleBindingPathElementImpl<String>(PropertyStatement.AS_STRING, Object.class, String.class, true,
"string_value_for_literal") {
@Override
public String getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getStringValue();
} else if (target instanceof String) {
return (String) target;
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(String value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
System.out.println("sets value [" + value + "] for " + ((PropertyStatement) target).getProperty());
((PropertyStatement) target).setStringValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asStringProperty);
asBooleanProperty = new SimpleBindingPathElementImpl<Boolean>(PropertyStatement.AS_BOOLEAN, Object.class, Boolean.class, true,
"boolean_value_for_literal") {
@Override
public Boolean getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getBooleanValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Boolean value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setBooleanValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asBooleanProperty);
asIntegerProperty = new SimpleBindingPathElementImpl<Integer>(PropertyStatement.AS_INTEGER, Object.class, Integer.class, true,
"int_value_for_literal") {
@Override
public Integer getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getIntegerValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Integer value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setIntegerValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asIntegerProperty);
asByteProperty = new SimpleBindingPathElementImpl<Byte>(PropertyStatement.AS_BYTE, Object.class, Byte.class, true,
"byte_value_for_literal") {
@Override
public Byte getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getByteValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Byte value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setByteValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asByteProperty);
asShortProperty = new SimpleBindingPathElementImpl<Short>(PropertyStatement.AS_SHORT, Object.class, Short.class, true,
"short_value_for_literal") {
@Override
public Short getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getShortValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Short value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setShortValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asShortProperty);
asLongProperty = new SimpleBindingPathElementImpl<Long>(PropertyStatement.AS_LONG, Object.class, Long.class, true,
"long_value_for_literal") {
@Override
public Long getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getLongValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Long value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setLongValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asLongProperty);
asCharProperty = new SimpleBindingPathElementImpl<Character>(PropertyStatement.AS_CHARACTER, Object.class, Character.class,
true, "char_value_for_literal") {
@Override
public Character getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getCharacterValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Character value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setCharacterValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asCharProperty);
asFloatProperty = new SimpleBindingPathElementImpl<Float>(PropertyStatement.AS_FLOAT, Object.class, Float.class, true,
"float_value_for_literal") {
@Override
public Float getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getFloatValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Float value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setFloatValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asFloatProperty);
asDoubleProperty = new SimpleBindingPathElementImpl<Double>(PropertyStatement.AS_DOUBLE, Object.class, Double.class, true,
"string_value_for_literal") {
@Override
public Double getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
return ((PropertyStatement) target).getDoubleValue();
} else {
logger.warning("Unexpected: " + target);
return null;
}
}
@Override
public void setBindingValue(Double value, Object target, BindingEvaluationContext context) {
if (target instanceof PropertyStatement) {
((PropertyStatement) target).setDoubleValue(value);
} else {
logger.warning("Unexpected: " + target);
}
}
};
allProperties.add(asDoubleProperty);
}
}
@Override
public List<BindingPathElement> getAllProperties() {
return allProperties;
}
@Override
public Type getType() {
if (ontologyProperty != null && ontologyProperty.getDataType() != null) {
return ontologyProperty.getDataType().getAccessedType();
}
return Object.class;
}
@Override
public String getLabel() {
return ontologyProperty.getName();
}
@Override
public String getTooltipText(Type resultingType) {
return ontologyProperty.getDisplayableDescription();
}
@Override
public boolean isSettable() {
return true;
}
@Override
public Object getBindingValue(Object target, BindingEvaluationContext context) {
if (target instanceof OWLObject<?>) {
OWLObject<?> object = (OWLObject<?>) target;
if (ontologyProperty != null && (ontologyProperty.isAnnotationProperty() || ontologyProperty.getDataType() != null)) {
return object.getPropertyValue(ontologyProperty);
} else {
return object.getPropertyStatement(ontologyProperty);
}
} else {
logger.warning("Unexpected target " + target + " while evaluateBinding()");
return null;
}
}
@Override
public void setBindingValue(Object value, Object target, BindingEvaluationContext context) {
logger.warning("Attempt to process setBindingValue with " + value);
if (target instanceof OWLIndividual) {
Object oldValue = null;
OWLIndividual individual = (OWLIndividual) target;
logger.info("individual=" + individual);
logger.info("ontologyProperty=" + ontologyProperty);
logger.info("individual.getPropertyStatement(ontologyProperty)=" + individual.getPropertyStatement(ontologyProperty));
PropertyStatement statement = individual.getPropertyStatement(ontologyProperty);
if (statement == null) {
individual.addDataPropertyStatement(ontologyProperty, value);
}
if (statement instanceof DataPropertyStatement) {
oldValue = ((DataPropertyStatement) statement).getValue();
((DataPropertyStatement) statement).setValue(value);
} else {
logger.warning("Unexpected statement " + statement + " while evaluateBinding()");
logger.info("WAS individual=" + individual);
logger.info("WAS ontologyProperty=" + ontologyProperty);
logger.info("WAS individual.getPropertyStatement(ontologyProperty)=" + individual.getPropertyStatement(ontologyProperty));
}
individual.getPropertyChangeSupport().firePropertyChange(ontologyProperty.getName(), oldValue, value);
} else {
logger.warning("Unexpected target " + target + " while evaluateBinding()");
}
}
}