001: package org.mandarax.xkb.framework;
002:
003: /**
004: * Copyright (C) 1999-2004 Jens Dietrich (mailto:mandarax@jbdietrich.com)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020:
021: import java.io.PrintWriter;
022: import java.util.Iterator;
023: import java.util.List;
024: import java.util.Map;
025:
026: import org.jdom.Comment;
027: import org.jdom.Element;
028: import org.mandarax.kernel.ClauseSet;
029: import org.mandarax.kernel.Fact;
030: import org.mandarax.kernel.KnowledgeBase;
031: import org.mandarax.kernel.LogicFactory;
032: import org.mandarax.kernel.Query;
033: import org.mandarax.kernel.Rule;
034: import org.mandarax.sql.SQLClauseSet;
035: import org.mandarax.xkb.XKBException;
036:
037: /**
038: * An adapter class for knowledge bases.
039: * @see org.mandarax.kernel.KnowledgeBase
040: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
041: * @version 3.4 <7 March 05>
042: * @since 1.6
043: * @deprecated from v 3.4 - support for new features such as validation will not be added to XKB, please use ZKB instead
044: */
045:
046: public class XMLAdapter4KnowledgeBases extends AbstractXMLAdapter {
047: public static final String KNOWLEDGE_BASE = "knowledge_base";
048:
049: /**
050: * Export an object, i.e., convert it to an element in the DOM.
051: * @param obj an object
052: * @param driver the generic driver
053: * @param cache a cache used in order to associate the same
054: * id with various occurences of the same object
055: * @exception an XKBException is thrown if export fails
056: */
057: public Element exportObject(Object obj, GenericDriver driver,
058: Map cache) throws XKBException {
059: check(obj, KnowledgeBase.class);
060: int ftl = driver.getFaultToleranceLevel();
061: PrintWriter out = driver.getLogWriter();
062: KnowledgeBase kb = (KnowledgeBase) obj;
063: Element e = new Element(KNOWLEDGE_BASE);
064: List clauseSets = kb.getClauseSets();
065: // export knowledge
066: for (Iterator it = clauseSets.iterator(); it.hasNext();) {
067: ClauseSet cs = (ClauseSet) it.next();
068: String kindOfObject = getClauseSetType(cs);
069: if (kindOfObject == null) {
070: String msg = "Cannot figure out what kind of clause set the following object is: "
071: + cs;
072: if (ftl == GenericDriver.LOW_FAULT_TOLERANCE)
073: throw new XKBException(msg);
074: // do nothing if (ftd==driver.HIGH_FAULT_TOLERANCE)
075: else {
076: out.println("Warning");
077: out.println(msg);
078: out.println("The clause is ignored");
079: LOG_XKB.warn(msg);
080: LOG_XKB.warn("The clause is ignored");
081: }
082: } else {
083: try {
084: Element el = exportObject(cs, kindOfObject, driver,
085: cache);
086: e.addContent(el);
087: } catch (XKBException x) {
088: String msg = "Problems exporting the knowledge base, export failed for "
089: + cs;
090: if (ftl == GenericDriver.LOW_FAULT_TOLERANCE)
091: throw new XKBException(msg);
092: // do nothing if (ftd==driver.HIGH_FAULT_TOLERANCE)
093: else {
094: out.println(msg);
095: out.println("See log for details");
096: e.addContent(new Comment(msg));
097: LOG_XKB.error(msg, x);
098: }
099: }
100:
101: }
102: }
103: // export queries
104: for (Iterator it = kb.queryNames(); it.hasNext();) {
105: Query q = kb.getQuery((String) it.next());
106: try {
107: Element el = exportObject(q, GenericDriver.QUERY,
108: driver, cache);
109: e.addContent(el);
110: } catch (XKBException x) {
111: String msg = "Problems exporting the knowledge base, export failed for query "
112: + q;
113: if (ftl == GenericDriver.LOW_FAULT_TOLERANCE)
114: throw new XKBException(msg);
115: // do nothing if (ftd==driver.HIGH_FAULT_TOLERANCE)
116: else {
117: out.println(msg);
118: out.println("See log for details");
119: e.addContent(new Comment(msg));
120: LOG_XKB.error(msg, x);
121: }
122: }
123: }
124: return e;
125: }
126:
127: /**
128: * Get the type of clause set, e.g. GenericDriver.FACT or GenericDriver.RULE.
129: * @param cs a clause set
130: * @return a string
131: */
132: protected String getClauseSetType(ClauseSet cs) {
133: if (cs instanceof Rule)
134: return GenericDriver.RULE;
135: if (cs instanceof Fact)
136: return GenericDriver.FACT;
137: if (cs instanceof SQLClauseSet)
138: return GenericDriver.SQL_CLAUSE_SET;
139: return null;
140: }
141:
142: /**
143: * Build an object from an XML element.
144: * @param e an element
145: * @param driver the generic driver
146: * @param cache a cache used to identify objects that have the same id
147: * @param lfactory the logic factory used to create objects
148: * @exception an XKBException is thrown if export fails
149: */
150: public Object importObject(Element e, GenericDriver driver,
151: Map cache, LogicFactory lfactory) throws XKBException {
152: KnowledgeBase kb = new org.mandarax.reference.AdvancedKnowledgeBase();
153: int ftl = driver.getFaultToleranceLevel();
154: PrintWriter out = driver.getLogWriter();
155: List children = e.getChildren();
156: for (Iterator it = children.iterator(); it.hasNext();) {
157: Element child = (Element) it.next();
158: XMLAdapter adapter = driver.getAdapterByTagName(child
159: .getName());
160: try {
161: Object obj = adapter.importObject(child, driver, cache,
162: lfactory);
163: if (obj instanceof ClauseSet)
164: kb.add((ClauseSet) obj);
165: else if (obj instanceof Query)
166: kb.addQuery((Query) obj);
167: else
168: throw new XKBException(
169: "Can only import clause sets and queries into repository, import for object failed: "
170: + obj);
171: } catch (XKBException x) {
172: String msg = "Problems importing the knowledge base, import failed for element "
173: + e.getText();
174: if (ftl == GenericDriver.LOW_FAULT_TOLERANCE)
175: throw new XKBException(msg);
176: // do nothing if (ftd==driver.HIGH_FAULT_TOLERANCE)
177: else {
178: out.println(msg);
179: out.println("See log for details");
180: LOG_XKB.error(msg, x);
181: }
182: }
183: }
184: return kb;
185: }
186:
187: /**
188: * Get the name of the associated tag (element).
189: * @return a string
190: */
191: public String getTagName() {
192: return KNOWLEDGE_BASE;
193: }
194:
195: /**
196: * Get the kind of object the adapter can export/import.
197: * @return a string
198: */
199: public String getKindOfObject() {
200: return GenericDriver.KNOWLEDGE_BASE;
201: }
202: }
|