001: /*
002: * Copyright 2007 Bastian Schenke Licensed under the Apache License, Version 2.0 (the "License");
003: * you may not use this file except in compliance with the License.
004: * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
005: * Unless required by applicable law or agreed to in writing, software distributed under the
006: * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
007: * either express or implied. See the License for the specific language governing permissions
008: * and limitations under the License.
009: */
010: package nz.org.take.r2ml;
011:
012: import java.beans.BeanInfo;
013: import java.beans.Introspector;
014: import java.beans.PropertyDescriptor;
015: import java.util.Collection;
016:
017: import nz.org.take.Fact;
018: import nz.org.take.Predicate;
019: import nz.org.take.PropertyPredicate;
020: import nz.org.take.SimplePredicate;
021: import nz.org.take.Term;
022: import nz.org.take.r2ml.util.R2MLUtil;
023: import de.tu_cottbus.r2ml.AttributionAtom;
024: import de.tu_cottbus.r2ml.PropertyAtom;
025:
026: /**
027: * @author Bastian Schenke (bastian.schenke@googlemail.com)
028: *
029: */
030: class PropertyAtomHandler implements XmlTypeHandler {
031:
032: /**
033: * Map a PropertyAtom to a Fact.
034: *
035: * @param obj
036: * a PropertyAtom
037: * @return a Fact
038: *
039: * @see nz.org.take.r2ml.XmlTypeHandler#importObject(java.lang.Object,
040: * nz.org.take.r2ml.R2MLDriver)
041: */
042: public Object importObject(Object obj) throws R2MLException {
043: PropertyAtom atom = (PropertyAtom) obj;
044: R2MLDriver driver = R2MLDriver.get();
045: if (driver.getPropertyMode() == R2MLDriver.INFER_PROPERTIES_MODE)
046: throw new R2MLException(
047: "PropertyAtoms are not supported while using the infer-properties-mode!");
048: MappingContext context = MappingContext.get();
049:
050: Fact fact = R2MLUtil.newFact();
051: String propertyName = atom.getPropertyID().getLocalPart();
052: // domain
053: XmlTypeHandler subjectHandler = driver.getHandlerByXmlType(atom
054: .getSubject().getClass());
055: Term domain = (Term) subjectHandler.importObject(atom
056: .getSubject());
057: // range
058: XmlTypeHandler valueHandler = driver.getHandlerByXmlType(atom
059: .getValue().getTerm().getValue().getClass());
060: Term range = (Term) valueHandler.importObject(atom.getValue()
061: .getTerm().getValue());
062:
063: fact.setTerms(new Term[] { domain, range });
064:
065: String[] slotNames = driver.getNameMapper().getSlotNames(
066: atom.getPropertyID());
067:
068: // Predicate predicate = ;
069: fact
070: .setPredicate(buildPredicate(propertyName, domain,
071: range, atom.isIsNegated() == null ? false
072: : atom.isIsNegated(), slotNames,
073: context));
074:
075: fact.setId(propertyName);
076:
077: return fact;
078: }
079:
080: private Predicate buildPredicate(String propertyName, Term domain,
081: Term range, boolean negated, String[] slotNames,
082: MappingContext context) throws R2MLException {
083: // if predicate already exists
084: if (context.getPredicate(propertyName) != null) {
085: return context.getPredicate(propertyName);
086: }
087: PropertyDescriptor property = buildProperty(propertyName,
088: domain.getType());
089: Predicate returnPredicate = null;
090: // if attribute is beanproperty use it
091: if (property != null) {
092: PropertyPredicate propPredicate = new PropertyPredicate();
093: propPredicate.setNegated(negated);
094: propPredicate.setOwnerType(domain.getType());
095: propPredicate.setProperty(property);
096: propPredicate.setSlotNames(slotNames);
097: // this method does some initialization stuff (setOne2One)
098: // is this really neccessary here?
099: propPredicate.getSlotTypes();
100: context.addPredicate(propPredicate);
101: returnPredicate = propPredicate;
102: } else {
103: SimplePredicate simplePredicate = new SimplePredicate();
104: simplePredicate.setName(propertyName);
105: simplePredicate.setNegated(negated);
106: simplePredicate.setSlotTypes(new Class[] {
107: domain.getType(), range.getType() });
108: simplePredicate.setSlotNames(slotNames);
109: context.addPredicate(simplePredicate);
110: returnPredicate = simplePredicate;
111: }
112: return returnPredicate;
113: }
114:
115: private PropertyDescriptor buildProperty(String name, Class clazz) {
116: try {
117: BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
118: PropertyDescriptor[] properties = beanInfo
119: .getPropertyDescriptors();
120: for (PropertyDescriptor property : properties) {
121: if (name.equals(property.getName())
122: && property.getReadMethod() != null) {
123: return property;
124: }
125: }
126: } catch (Exception e) {
127: }
128: // no property found or exception occured
129: return null;
130: }
131: }
|