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.io.File;
013: import java.io.FileNotFoundException;
014: import java.io.FileReader;
015: import java.io.InputStream;
016: import java.io.InputStreamReader;
017: import java.io.Reader;
018: import java.util.List;
019:
020: import javax.xml.bind.JAXBContext;
021: import javax.xml.bind.JAXBElement;
022: import javax.xml.bind.JAXBException;
023: import javax.xml.bind.Unmarshaller;
024: import org.apache.log4j.Logger;
025:
026: import de.tu_cottbus.r2ml.RuleBase;
027:
028: import nz.org.take.KnowledgeBase;
029: import nz.org.take.KnowledgeElement;
030: import nz.org.take.KnowledgeSource;
031: import nz.org.take.Query;
032: import nz.org.take.TakeException;
033: import nz.org.take.r2ml.util.QueryGenerator;
034:
035: public class R2MLKnowledgeSource implements KnowledgeSource {
036:
037: private Reader reader = null;
038:
039: private R2MLDriver driver = null;
040:
041: private KnowledgeBase kb = null;
042:
043: private RuleBase rb = null;
044:
045: private QueryGenerator queryGenerator = null;
046:
047: private R2MLKnowledgeSource() {
048: super ();
049: this .driver = R2MLDriver.get();
050: }
051:
052: public R2MLKnowledgeSource(Reader reader) {
053: this ();
054: this .reader = reader;
055: }
056:
057: public R2MLKnowledgeSource(InputStream in) {
058: this ();
059: if (in == null)
060: throw new NullPointerException("InputStream not found.");
061: this .reader = new InputStreamReader(in);
062: }
063:
064: public R2MLKnowledgeSource(File file) throws FileNotFoundException {
065: this ();
066: this .reader = new FileReader(file);
067: }
068:
069: public R2MLKnowledgeSource(String fileName)
070: throws FileNotFoundException {
071: this ();
072: File file = new File(fileName);
073: this .reader = new FileReader(file);
074: }
075:
076: public R2MLKnowledgeSource(RuleBase ruleBase) {
077: this ();
078: this .rb = ruleBase;
079: }
080:
081: /**
082: * Get a knowledge base.
083: * @param generateQuerries if true generate all possible querries for all supported predicates else dont
084: *
085: * @return a knowledge base
086: */
087: public KnowledgeBase getKnowledgeBase() throws TakeException {
088: if (driver.logger.isDebugEnabled())
089: driver.logger.debug("starting mapping process");
090: if (kb == null) {
091: if (rb == null) {
092: if (driver.logger.isDebugEnabled())
093: driver.logger.debug("loading rule base");
094: unmarshallRuleBase();
095: }
096: // System.out.println("import rulebase");
097: kb = driver.importKB(rb);
098: // System.out.println("rulebase imported");
099: if (driver.logger.isDebugEnabled())
100: driver.logger.debug("KnowledgeBase imported.");
101: if (queryGenerator != null)
102: queryGenerator.generateQueries(kb);
103: }
104: // System.out.println("kb created");
105: if (driver.logger.isDebugEnabled())
106: driver.logger
107: .debug("knowledge base created was " + kb != null ? "successful!"
108: : "not succesful!");
109: return kb;
110: }
111:
112: @SuppressWarnings("unchecked")
113: private void unmarshallRuleBase() throws R2MLException {
114:
115: try {
116: JAXBContext jc2 = JAXBContext
117: .newInstance("de.tu_cottbus.r2ml:de.tu_cottbus.r2ml.r2mlv:de.tu_cottbus.dc");
118: Unmarshaller um = jc2.createUnmarshaller();
119: rb = ((JAXBElement<RuleBase>) um.unmarshal(reader))
120: .getValue();
121: } catch (JAXBException e) {
122: throw new R2MLException("XML parsing error", e);
123: } catch (ClassCastException cce) {
124: cce.printStackTrace();
125: throw new R2MLException(
126: "Unmarshalled object has wrong type.", cce);
127: }
128:
129: }
130:
131: public void setSlotNameGenerator(NameMapper nameMapper) {
132: driver.setNameMapper(nameMapper);
133: }
134:
135: public void setDatatypeMapper(DatatypeMapper datatypeMapper) {
136: driver.setDatatypeMapper(datatypeMapper);
137: }
138:
139: public boolean addKnowledge(KnowledgeElement e) {
140: try {
141: getKnowledgeBase().add(e);
142: } catch (TakeException e1) {
143: return false;
144: }
145: return true;
146: }
147:
148: public boolean addKnowledge(List<KnowledgeElement> es) {
149: boolean ret = true;
150: for (KnowledgeElement e : es)
151: if (!addKnowledge(e))
152: ret = false;
153: return ret;
154: }
155:
156: public void addQuery(Query query) throws TakeException {
157: getKnowledgeBase().add(query);
158: }
159:
160: public void addQueries(List<Query> querries) throws TakeException {
161: for (Query q : querries)
162: addQuery(q);
163: }
164:
165: public boolean addKnowledge(KnowledgeBase extraKnowledge)
166: throws TakeException {
167: boolean ret = true;
168: addQueries(extraKnowledge.getQueries());
169: if (!addKnowledge(extraKnowledge.getElements()))
170: ret = false;
171: try {
172: getKnowledgeBase().addAnnotations(
173: extraKnowledge.getAnnotations());
174: } catch (TakeException e) {
175: ret = false;
176: }
177: return ret;
178: }
179:
180: public void setQueryGenerator(QueryGenerator queryGenerator) {
181: this .queryGenerator = queryGenerator;
182:
183: }
184:
185: public void setPropertyMode(int propertyMode) {
186: driver.setPropertyMode(propertyMode);
187: }
188:
189: }
|