RequestConstants.RESTAPI_NS); for (Map.Entry<QName, Object> metadataProperty : getMetadata() .entrySet()) { QName propertyName = metadataProperty.getKey();
serializer.writeCharacters(getName()); serializer.writeEndElement(); serializer.writeCharacters(getDescription()); serializer.writeEndElement(); writeMetadataElement(serializer);
protected void receiveContent(InputStream content) { rules = new ArrayList<RuleDefinition>(); DOMHandle domHandle = new DOMHandle(); HandleAccessor.receiveContent(domHandle, content); Document document = domHandle.get(); NodeList ruleNodes = document.getElementsByTagNameNS(RequestConstants.RESTAPI_NS, "rule"); for (int i=0; i < ruleNodes.getLength(); i++) { Element ruleElement = (Element) ruleNodes.item(i); RuleDefinition ruleDefinition = new RuleDefinition(); ruleDefinition.receiveElement(ruleElement); rules.add(ruleDefinition); } } }
/** * Make a new rule definition * * @param name * The name of the rule. Should be unique among rule names on the * REST server. * @param description * Text description of the rule. */ public RuleDefinition(String name, String description) { this(); this.setName(name); this.setDescription(description); }
void receiveElement(Element ruleElement) { Element nameElement = getChildByName(ruleElement, RequestConstants.RESTAPI_NS, "name"); this.setName(nameElement.getTextContent()); Element descElement = getChildByName(ruleElement, RequestConstants.RESTAPI_NS, "description"); this.setDescription(descElement.getTextContent()); Element searchElement = getChildByName(ruleElement, RequestConstants.SEARCH_NS, "search"); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); TransformerFactory transfac = TransformerFactory.newInstance(); Transformer trans = transfac.newTransformer(); trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); trans.setOutputProperty(OutputKeys.VERSION, "1.0"); trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); trans.setOutputProperty(OutputKeys.INDENT, "no"); trans.transform(new DOMSource(searchElement), new StreamResult(baos)); importQueryDefinition(new BytesHandle(baos.toByteArray()) .withFormat(Format.XML)); } catch (TransformerConfigurationException e) { throw new MarkLogicIOException( "Could not get query from rule payload"); } catch (TransformerException e) { throw new MarkLogicIOException( "Could not get query from rule payload"); } receiveRuleMetadataImpl(ruleElement); }
System.out.println( "document criteria " + criteria + " matched rule " + rule.getName() + " with metadata " + rule.getMetadata() ); expected = expected + rule.getName() + " - " + rule.getMetadata() + " | ";
RuleDefinition definition = new RuleDefinition("javatestrule", "Rule for testing java"); definition.importQueryDefinition(textQuery); .exportQueryDefinition(new StringHandle()); assertEquals(head + qtext1 + tail, qdefCheck.get()); RuleMetadata metadata = definition.getMetadata(); metadata.put(new QName("dataelem1"), "Here's a value in metadata"); metadata.put(new QName("dataelem2"), 10.2); new RuleDefinition()); assertEquals("javatestrule", roundTripped.getName()); assertEquals("Rule for testing java", roundTripped.getDescription()); .exportQueryDefinition(new BytesHandle()); .exportQueryDefinition(new FileHandle(new File( "target/fileout.xml"))); RuleMetadata metadataReturned = roundTripped.getMetadata(); assertEquals(metadata.get(new QName("dataelem1")), metadataReturned.get(new QName("dataelem1"))); definition.importQueryDefinition(rawDefWithOptions); ruleManager.writeRule(definition); roundTripped = ruleManager.readRule("javatestrule", new RuleDefinition());
@Test public void testXMLRuleDefinitionsWithStructuredQuery() throws SAXException, IOException, ForbiddenUserException, FailedRequestException, ResourceNotFoundException { RuleDefinition defWithImport = new RuleDefinition(); defWithImport.setName("javatestrule2"); File ruleFile = new File("src/test/resources/structured-query.xml"); FileHandle queryHandle = new FileHandle(ruleFile); defWithImport.importQueryDefinition(queryHandle); ruleManager.writeRule(defWithImport); assertTrue(ruleManager.exists("javatestrule2")); RuleDefinition def = ruleManager.readRule("javatestrule2", new RuleDefinition()); assertEquals("javatestrule2", def.getName()); assertXMLEqual( "Search element round-tripped - structured query and options", "<search:search xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:query>" + "<search:term-query><search:text>foo</search:text></search:term-query>" + "</search:query>" + "</search:search>", new String( def.exportQueryDefinition(new BytesHandle()).get())); ruleManager.delete("javatestrule"); }
private static void setupMatchRules() throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException { RuleDefinition definition = new RuleDefinition("favorites", "Rule for testing favorited:true"); String head = "<search:search xmlns:search=\"http://marklogic.com/appservices/search\">"; String qtext1 = "<search:qtext>favorited:true</search:qtext>"; String qtext2 = "<search:qtext>favorited:false</search:qtext>"; String tail = "</search:search>"; String ruleOptions = "<search:options >" + "<search:constraint name=\"favorited\">" + "<search:value>" + "<search:element name=\"favorited\" ns=\"\"/>" + "</search:value>" + "</search:constraint>" + "</search:options>"; StringHandle textQuery = new StringHandle(head + qtext1 + ruleOptions + tail); definition.importQueryDefinition(textQuery); ruleManager.writeRule(definition); textQuery = new StringHandle(head + qtext2 + ruleOptions + tail); definition.importQueryDefinition(textQuery); definition.setName("notfavorited"); definition.setDescription("Rule for testing favorited:false"); ruleManager.writeRule(definition); }
@Test public void testXMLRuleDefinitions() throws SAXException, IOException, ForbiddenUserException, FailedRequestException, ResourceNotFoundException { File ruleFile = new File("src/test/resources/rule1.xml"); FileHandle ruleHandle = new FileHandle(ruleFile); ruleManager.writeRule("javatestrule", ruleHandle); assertTrue(ruleManager.exists("javatestrule")); RuleDefinition def = ruleManager.readRule("javatestrule", new RuleDefinition()); assertEquals("javatestrule", def.getName()); assertXMLEqual( "Search element round-tripped - structured query and options", "<search:search xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:qtext>favorited:true</search:qtext>" + "<search:options xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:constraint name=\"favorited\">" + "<search:value>" + "<search:element ns=\"\" name=\"favorited\" />" + "</search:value>" + "</search:constraint>" + "</search:options>" + "</search:search>", new String( def.exportQueryDefinition(new BytesHandle()).get())); ruleManager.delete("javatestrule"); }
@Override public void writeRule(RuleDefinition ruleHandle) { String ruleName = ruleHandle.getName(); writeRule(ruleName, ruleHandle); } @SuppressWarnings("rawtypes")
@Test public void testWriteRuleAs() { RuleDefinition definition = new RuleDefinition("original" + RULE_NAME_WRITE_RULE_AS_TEST, "test to verify that writeRuleAs does not result in stackoverflow"); String query = "<search:search xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:qtext>favorited:true</search:qtext>" + "</search:search>"; StringHandle textQuery = new StringHandle(query).withFormat(Format.XML); definition.importQueryDefinition(textQuery); ruleManager.writeRuleAs(RULE_NAME_WRITE_RULE_AS_TEST, definition); assertTrue("Rule was written with the name provided", ruleManager.exists(RULE_NAME_WRITE_RULE_AS_TEST)); } }
@Override public void writeRuleAs(String ruleName, Object ruleSource) throws ResourceNotFoundException, ForbiddenUserException, FailedRequestException { if (ruleSource == null) { throw new IllegalArgumentException("no source to write"); } Class<?> as = ruleSource.getClass(); RuleWriteHandle sourceHandle = null; if (RuleWriteHandle.class.isAssignableFrom(as)) { sourceHandle = (RuleWriteHandle) ruleSource; } else { ContentHandle<?> handle = getHandleRegistry().makeHandle(as); if (!RuleWriteHandle.class.isAssignableFrom(handle.getClass())) { throw new IllegalArgumentException( "Handle "+handle.getClass().getName()+ " cannot be used to write rule source as "+as.getName() ); } Utilities.setHandleContent(handle, ruleSource); sourceHandle = (RuleWriteHandle) handle; } if (sourceHandle instanceof RuleDefinition) { ((RuleDefinition) sourceHandle).setName(ruleName); } writeRule(ruleName, sourceHandle); }
@Override protected void receiveContent(InputStream content) { DOMHandle handle = new DOMHandle(); HandleAccessor.receiveContent(handle, content); Element ruleElement = handle.get().getDocumentElement(); receiveElement(ruleElement); }
System.out.println( "document criteria " + criteria + " matched rule " + rule.getName() + " with metadata " + rule.getMetadata() ); expected = expected + rule.getName() + " - " + rule.getMetadata() + " | ";
void receiveElement(Element ruleElement) { Element nameElement = getChildByName(ruleElement, RequestConstants.RESTAPI_NS, "name"); this.setName(nameElement.getTextContent()); Element descElement = getChildByName(ruleElement, RequestConstants.RESTAPI_NS, "description"); this.setDescription(descElement.getTextContent()); Element searchElement = getChildByName(ruleElement, RequestConstants.SEARCH_NS, "search"); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); TransformerFactory transfac = TransformerFactory.newInstance(); Transformer trans = transfac.newTransformer(); trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); trans.setOutputProperty(OutputKeys.VERSION, "1.0"); trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); trans.setOutputProperty(OutputKeys.INDENT, "no"); trans.transform(new DOMSource(searchElement), new StreamResult(baos)); importQueryDefinition(new BytesHandle(baos.toByteArray()) .withFormat(Format.XML)); } catch (TransformerConfigurationException e) { throw new MarkLogicIOException( "Could not get query from rule payload"); } catch (TransformerException e) { throw new MarkLogicIOException( "Could not get query from rule payload"); } receiveRuleMetadataImpl(ruleElement); }
@Test public void testJSONRuleDefinitions() throws SAXException, IOException, ForbiddenUserException, FailedRequestException, ResourceNotFoundException { File ruleFile = new File("src/test/resources/rule1.json"); FileHandle ruleHandle = new FileHandle(ruleFile); ruleHandle.setFormat(Format.JSON); ruleManager.writeRule("javatestrule", ruleHandle); assertTrue(ruleManager.exists("javatestrule")); RuleDefinition def = ruleManager.readRule("javatestrule", new RuleDefinition()); assertEquals("javatestrule", def.getName()); assertXMLEqual( "Search element round-tripped - structured query and options", "<search:search xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:qtext>favorited:true</search:qtext>" + "<search:options xmlns:search=\"http://marklogic.com/appservices/search\">" + "<search:constraint name=\"favorited\">" + "<search:value>" + "<search:element ns=\"\" name=\"favorited\" />" + "</search:value>" + "</search:constraint>" + "</search:options>" + "</search:search>", new String( def.exportQueryDefinition(new BytesHandle()).get())); BytesHandle bHandle = ruleManager.readRule("javatestrule", new BytesHandle().withFormat(Format.JSON)); assertEquals( "{\"rule\":{\"name\":\"javatestrule\", \"description\":\"rule to demonstrate REST alerting\", \"search\":{\"qtext\":[\"favorited:true\"], \"options\":{\"constraint\":[{\"name\":\"favorited\", \"value\":{\"element\":{\"ns\":\"\", \"name\":\"favorited\"}}}]}}, \"rule-metadata\":null}}", new String(bHandle.get())); ruleManager.delete("javatestrule"); }
@Override public void writeRule(RuleDefinition ruleHandle) { String ruleName = ruleHandle.getName(); writeRule(ruleName, ruleHandle); } @SuppressWarnings("rawtypes")
/** * Make a new rule definition * * @param name * The name of the rule. Should be unique among rule names on the * REST server. * @param description * Text description of the rule. */ public RuleDefinition(String name, String description) { this(); this.setName(name); this.setDescription(description); }
protected void receiveContent(InputStream content) { DOMHandle handle = new DOMHandle(); HandleAccessor.receiveContent(handle, content); Element ruleElement = handle.get().getDocumentElement(); receiveElement(ruleElement); }