/** * This method is used to parse a Negative Fact in the RuleML Document. * * @param neg Element The XOM Element object that represents the neg fact. * @return A definite clause vector that represents the negFact in a way that can be used by the * reasoning engine. * @throws ParseException Thrown if there is a serious error parsing the negFact. */ private Vector<DefiniteClause> parseNegFact(Element neg) throws ParseException { resetVariables(); Elements atoms = neg.getChildElements("Atom"); if (atoms.size() != 1) { logger.error("OO jDREW only supports classical negation over single atoms."); throw new ParseException("OO jDREW only supports classical negation over single atoms."); } Element firstAtom = skipRoleTag(atoms.get(0)); Term atm = parseAtom(firstAtom, true, true); Hashtable<Integer, Integer> types = this.buildTypeTable(); this.fixVarTypes(atm, types); Vector<Term> atms = new Vector<Term>(); atms.add(atm); DefiniteClause dc = new DefiniteClause(atms, variableNames); Vector<DefiniteClause> v = new Vector<DefiniteClause>(); v.add(dc); // Add code to generate consistency check // This should be redone to create the consistency check better String atmstr = dc.toPOSLString(); String clause = "$inconsistent() :-"; clause += atmstr.substring(0, atmstr.length() - 1) + ","; clause += "\"" + atmstr.substring(atmstr.indexOf("-") + 1); System.err.println(clause); POSLParser pp = new POSLParser(); try { v.add(pp.parseDefiniteClause(clause)); } catch (Exception e) { throw new ParseException("Error creating consistency check."); } return v; }
/** * This method is used to parse a implication element, creating a new variable name list if * indicated. Typically a new variable list is wanted; but in certain cases (such as parsing an * inner clause in an assert) the same variable list must be used. * * @param implies Element The XOM Element object that represents the implication to be parsed. * @return A vector of DefiniteClause data structures that represents the implication in a way * that can be used by the reasoning engine. * @throws ParseException Thrown if there is a serious error parsing the implication. */ private Vector<DefiniteClause> parseImplies(Element implies) throws ParseException { Vector<DefiniteClause> newclauses = new Vector<DefiniteClause>(); // Implies must have two children (excluding OID elements) Elements children = implies.getChildElements(); // Set first and second child and skip OID element if exists. Element firstChild = skipRoleTag(children.get(0)); Element secondChild = skipRoleTag(children.get(1)); if (firstChild.getLocalName().equals(tagNames.OID)) { firstChild = skipRoleTag(children.get(1)); secondChild = skipRoleTag(children.get(2)); } String firstChildName = firstChild.getLocalName(); Element premise, conclusion; // Check if implies starts with premise element if (firstChildName.equals(tagNames.PREMISE)) { premise = firstChild.getChildElements().get(0); conclusion = secondChild.getChildElements().get(0); } // If implies starts with conclusion element else if (firstChildName.equals(tagNames.CONCLUSION)) { premise = secondChild.getChildElements().get(0); conclusion = firstChild.getChildElements().get(0); } // No premise or conclusion tag available else { // Use canonical order for stripe-skipped syntax premise = firstChild; conclusion = secondChild; } premise = skipRoleTag(premise); conclusion = skipRoleTag(conclusion); Vector<Term> subterms = new Vector<Term>(); if (conclusion.getLocalName().equals(tagNames.ATOM)) { subterms.add(parseAtom(conclusion, true, false)); } else if (conclusion.getLocalName().equals(tagNames.NEG)) { Elements headatms = conclusion.getChildElements(tagNames.ATOM); if (headatms.size() != 1) throw new ParseException("Neg should have one ATOM element"); Term atom = parseAtom(headatms.get(0), true, true); subterms.add(atom); String atomstr = atom.toPOSLString(true); String clause = "$Sinconsistent() :-"; clause += atomstr + ", \"" + atomstr.substring(6) + "."; System.err.println(clause); POSLParser pp = new POSLParser(); try { DefiniteClause dc2 = pp.parseDefiniteClause(clause); if (dc2 != null) newclauses.add(dc2); } catch (Exception e) { throw new ParseException("Error creating inconsistency check rule."); } } else { throw new ParseException( "Second element of Implies should always be an Atom or Neg element."); } String premiseName = premise.getLocalName(); if (premiseName.equals(tagNames.ATOM)) { subterms.add(parseAtom(premise, false, false)); } else if (premiseName.equals(tagNames.NAF)) { subterms.add(parseNaf(premise)); } else if (premiseName.equals(tagNames.ASSERT)) { subterms.add(parseAssert(premise)); } else if (premiseName.equals(tagNames.NEG)) { subterms.add(parseAtom(premise, false, true)); } else if (premiseName.equals(tagNames.AND)) { children = premise.getChildElements(); for (int i = 0; i < children.size(); i++) { Element el = skipRoleTag(children.get(i)); if (el.getLocalName().equals(tagNames.ATOM)) { subterms.add(parseAtom(el, false, false)); } else if (el.getLocalName().equals(tagNames.NAF)) { subterms.add(parseNaf(el)); } else if (el.getLocalName().equals(tagNames.ASSERT)) { subterms.add(parseAssert(el)); } else if (el.getLocalName().equals(tagNames.NEG)) { subterms.add(parseAtom(el, false, true)); } else { throw new ParseException( "Implies And element should only contain Atom and Naf elements."); } } } else { throw new ParseException("First element of Implies should be an Atom, Naf or And element."); } logger.debug("Building Types"); Hashtable<Integer, Integer> types = this.buildTypeTable(); logger.debug("Built Types"); Iterator<Term> it = subterms.iterator(); int i = 0; while (it.hasNext()) { Term t = (Term) it.next(); this.fixVarTypes(t, types); logger.debug("Fixed atom : " + i++); } DefiniteClause dc = new DefiniteClause(subterms, variableNames); newclauses.add(0, dc); return newclauses; }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { address = PAConfiguration.getAddress(); port = PAConfiguration.getPort(instantiation); poslAddress = PAConfiguration.getPOSL(instantiation, topic); rdfAddress = PAConfiguration.getRDFTaxonomy(instantiation); messageEndpoint = PAConfiguration.getEndpointName(instantiation, topic); } catch (BadConfigurationException e) { System.out.println(e.getMessage()); e.printStackTrace(); System.exit(0); } response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); try { System.out.println("5 Publicty Chair Servlet"); System.out.println(response.toString()); BufferedReader brd = request.getReader(); String input = ""; String message = ""; while (!input.equals("</RuleML>")) { input = brd.readLine(); message = message + input; } String[] varOrder = getVariableOrder(message); System.out.println("Received Message: " + message); // BackwardReasoner br = new BackwardReasoner(); // Iterator solit =null; // DefiniteClause dc = null; // SymbolTable.reset(); POSLParser pp = new POSLParser(); // String contents = "c(a).\nc(b).\nc(c)."; Date t1 = new GregorianCalendar().getTime(); System.out.println(t1.getHours() + ":" + t1.getMinutes()); // append time to contents System.out.println("day: " + t1.getDay()); System.out.println("day: " + t1.getYear()); System.out.println("day: " + t1.getMonth()); // time String time = "time(" + t1.getHours() + ":integer)."; System.out.println(time); String url = poslAddress; // String url = "http://www.jdrew.org/oojdrew/test.posl"; String contents = ""; // day of the week int day = t1.getDay(); boolean weekday = true; if (day == 0 || day == 6) { weekday = false; } String dayOfWeek; if (weekday) { dayOfWeek = "day(weekday)."; } else { dayOfWeek = "day(weekend)."; } // full date Calendar cal = new GregorianCalendar(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day2 = cal.get(Calendar.DAY_OF_MONTH); String date; String day3 = "" + day2; if (day2 == 1 || day2 == 2 || day2 == 3 || day2 == 4 || day2 == 5 || day2 == 6 || day2 == 7 || day2 == 8 || day2 == 9) { day3 = "0" + day2; } if (month == 10 || month == 11 || month == 12) date = "" + year + month + day3; else date = "" + year + "0" + month + day3; date = "date(" + date + ":integer)."; System.out.println(date); String url2 = rdfAddress; HttpClient client2 = new HttpClient(); GetMethod method2 = new GetMethod(url2); method2.setFollowRedirects(true); String typestr = ""; // Execute the GET method int statusCode2 = client2.executeMethod(method2); if (statusCode2 != -1) { typestr = method2.getResponseBodyAsString(); } System.out.println("Types: " + typestr); Types.reset(); RDFSParser.parseRDFSString(typestr); try { HttpClient client = new HttpClient(); GetMethod method = new GetMethod(url); method.setFollowRedirects(true); // Execute the GET method int statusCode = client.executeMethod(method); if (statusCode != -1) { contents = method.getResponseBodyAsString(); } } catch (Exception e) { e.printStackTrace(); } contents = contents + "\n" + time; contents = contents + "\n" + dayOfWeek; contents = contents + "\n" + date; BackwardReasoner br = new BackwardReasoner(); Iterator solit = null; DefiniteClause dc = null; SymbolTable.reset(); pp.parseDefiniteClauses(contents); br.loadClauses(pp.iterator()); System.out.println("TEST"); Iterator it = pp.iterator(); while (it.hasNext()) { DefiniteClause d = (DefiniteClause) it.next(); System.out.println("Loaded clause: " + d.toPOSLString()); } br = new BackwardReasoner(br.clauses, br.oids); MessageParser m = new MessageParser(message); Element atom = null; try { atom = m.parseForContent(); } catch (Exception e) { System.out.println("Invalid Message"); // out.flush(); } QueryBuilder q = new QueryBuilder(atom); String query = q.generateDoc(); System.out.println("ABOUT TO INPUT THIS QUERY:" + query); RuleMLParser qp = new RuleMLParser(); try { dc = qp.parseRuleMLQuery(query); } catch (Exception e) { System.out.println("Invalid Query"); // out.flush(); } // solit = br.iterativeDepthFirstSolutionIterator(dc); solit = br.iterativeDepthFirstSolutionIterator(dc); int varSize = 0; while (solit.hasNext()) { Vector data = new Vector(); BackwardReasoner.GoalList gl = (BackwardReasoner.GoalList) solit.next(); Hashtable varbind = gl.varBindings; javax.swing.tree.DefaultMutableTreeNode root = br.toTree(); root.setAllowsChildren(true); javax.swing.tree.DefaultTreeModel dtm = new DefaultTreeModel(root); int i = 0; Object[][] rowdata = new Object[varbind.size()][2]; varSize = varbind.size(); Enumeration e = varbind.keys(); while (e.hasMoreElements()) { Object k = e.nextElement(); Object val = varbind.get(k); String ks = (String) k; rowdata[i][0] = ks; rowdata[i][1] = val; i++; } data.addElement(rowdata); String[] messages = new String[data.size()]; MessageGenerator g = new MessageGenerator( data, varSize, messageEndpoint, m.getId(), m.getProtocol(), m.getRel(), varOrder); messages = g.Messages2(); String appender = ""; URL sender = new URL(address + ":" + port); HttpMessage msg = new HttpMessage(sender); Properties props = new Properties(); for (int i1 = 0; i1 < data.size(); i1++) { System.out.println(i1 + ")" + messages[i1].toString()); props.put("text", messages[i1].toString()); InputStream in = msg.sendGetMessage(props); } System.out.println("NEXT MESSAGE"); } MessageGenerator g = new MessageGenerator( null, varSize, messageEndpoint, m.getId(), m.getProtocol(), m.getRel()); URL sender = new URL(address + ":" + port); HttpMessage msg = new HttpMessage(sender); Properties props = new Properties(); String finalMessage = g.finalMessage(query); System.out.println(finalMessage); props.put("text", finalMessage); InputStream in = msg.sendGetMessage(props); System.out.println("Stop_Communication"); } catch (Exception e) { System.out.println("ERROR has occured : " + e.toString()); } out.close(); }