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.lang.reflect.Method;
013: import java.util.ArrayList;
014: import java.util.Iterator;
015: import java.util.List;
016:
017: import javax.xml.bind.JAXBElement;
018:
019: import nz.org.take.Fact;
020: import nz.org.take.JPredicate;
021: import nz.org.take.Predicate;
022: import nz.org.take.Term;
023: import nz.org.take.r2ml.util.R2MLUtil;
024:
025: import de.tu_cottbus.r2ml.EqualityAtom;
026: import de.tu_cottbus.r2ml.ObjectTerm;
027:
028: /**
029: * @author Bastian Schenke (bastian.schenke@googlemail.com)
030: */
031: class EqualityAtomHandler implements XmlTypeHandler {
032:
033: class EqualityPair {
034: EqualityPair(ObjectTerm obj1, ObjectTerm obj2) {
035: this .obj1 = obj1;
036: this .obj2 = obj2;
037: }
038:
039: ObjectTerm obj1 = null;
040: ObjectTerm obj2 = null;
041: }
042:
043: /**
044: * Map a
045: *
046: *
047: * @param obj
048: * an EqualityAtom
049: * @return a List of Facts
050: *
051: * @see nz.org.take.r2ml.XmlTypeHandler#importObject(java.lang.Object,
052: * nz.org.take.r2ml.R2MLDriver)
053: */
054: public Object importObject(Object obj) throws R2MLException {
055: EqualityAtom atom = (EqualityAtom) obj;
056: if (atom.isIsNegated() != null && atom.isIsNegated())
057: throw new R2MLException(
058: "Negation is not yet supported in EqualityAtoms",
059: R2MLException.FEATURE_NOT_YET_IMPLEMENTED);
060: List<Fact> facts = new ArrayList<Fact>();
061: try {
062: for (EqualityPair pair : getArgsAsPairs(atom
063: .getObjectTerm())) {
064: facts.add(buildFact(pair, MappingContext.get(),
065: R2MLDriver.get()));
066: }
067: } catch (Exception e) {
068: throw new R2MLException(
069: "Error while handling EqualityAtom!", e);
070: }
071: return facts;
072: }
073:
074: private Fact buildFact(EqualityPair pair, MappingContext context,
075: R2MLDriver driver) throws R2MLException {
076: XmlTypeHandler handler1 = driver.getHandlerByXmlType(pair.obj1
077: .getClass());
078: XmlTypeHandler handler2 = driver.getHandlerByXmlType(pair.obj2
079: .getClass());
080: Term term1 = (Term) handler1.importObject(pair.obj1);
081: Term term2 = (Term) handler2.importObject(pair.obj2);
082: Fact fact = R2MLUtil.newFact();
083: fact.setTerms(new Term[] { term1, term2 });
084: fact.setPredicate(buildEqualsPredicate(term1, term2, driver));
085: return fact;
086: }
087:
088: private Predicate buildEqualsPredicate(Term term1, Term term2,
089: R2MLDriver driver) throws R2MLException {
090: JPredicate jp = new JPredicate();
091: Method method = R2MLUtil.getMethod(EQUALITY_CHECK_METHOD,
092: new Term[] { term1, term2 });
093: jp.setMethod(method);
094: return jp;
095: }
096:
097: private List<EqualityPair> getArgsAsPairs(
098: List<JAXBElement<? extends ObjectTerm>> args) {
099: List<EqualityPair> pairs = new ArrayList<EqualityPair>(args
100: .size()
101: * (args.size() - 1));
102: for (JAXBElement<? extends ObjectTerm> i : args) {
103: for (JAXBElement<? extends ObjectTerm> j : args) {
104: if (!(i == j))
105: pairs.add(new EqualityPair(i.getValue(), j
106: .getValue()));
107: }
108: }
109: return pairs;
110: }
111:
112: }
|