/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.manifoldcf.agents.output.searchblox; import org.apache.manifoldcf.agents.interfaces.RepositoryDocument; import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.DocumentAction; import org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.IndexingFormat; import org.apache.manifoldcf.core.interfaces.ManifoldCFException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.*; import static org.apache.manifoldcf.agents.output.searchblox.SearchBloxConfig.*; import static org.apache.manifoldcf.agents.output.searchblox.SearchBloxDocument.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class SearchBloxDocumentTest { private SearchBloxDocument toTest; @Before public void setUp() throws ManifoldCFException { Map<String, List<String>> args=initArgs(); String apikey="apikey"; RepositoryDocument rd=initRepoDocument(); String docURI = "URI"; toTest=new SearchBloxDocument(apikey, docURI,rd,args); } @Test public void updateXmlString() throws SearchBloxException, ParserConfigurationException, SAXException, IOException { String xmlGenerated = toTest.toString(IndexingFormat.XML, DocumentAction.ADD_UPDATE); InputSource is = new InputSource(new ByteArrayInputStream(xmlGenerated.getBytes(StandardCharsets.UTF_8))); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(is); doc.getDocumentElement().normalize(); Element root = doc.getDocumentElement(); assertEquals("searchblox", root.getNodeName()); assertEquals("apikey", root.getAttribute(APIKEY_ATTRIBUTE)); assertEquals(1, root.getElementsByTagName("document").getLength()); assertEquals(Node.ELEMENT_NODE, root.getElementsByTagName("document").item(0).getNodeType()); Element document = (Element) root.getElementsByTagName("document").item(0); assertEquals("collection1", document.getAttribute(COLNAME_ATTRIBUTE)); NodeList nList = document.getChildNodes(); assertEquals(18, nList.getLength()); nList = document.getElementsByTagName(UID_ATTRIBUTE); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("URI", nList.item(0).getTextContent()); nList = document.getElementsByTagName("title"); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("I am a nice title", nList.item(0).getTextContent()); assertEquals("1", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE)); nList = document.getElementsByTagName("content"); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("I am a nice content in english!", nList.item(0).getTextContent()); assertEquals("2", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE)); nList = document.getElementsByTagName("description"); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("I am a little tiny description", nList.item(0).getTextContent()); assertEquals("4", ((Element) nList.item(0)).getAttribute(BOOST_ATTRIBUTE)); nList = document.getElementsByTagName("size"); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("100", nList.item(0).getTextContent()); nList = document.getElementsByTagName("contenttype"); assertEquals(1, nList.getLength()); assertEquals(Node.ELEMENT_NODE, nList.item(0).getNodeType()); assertEquals("html", nList.item(0).getTextContent()); nList = document.getElementsByTagName("meta"); assertEquals(12, nList.getLength()); assertTrue(find(nList, "meta2", "I am META2!")); assertTrue(find(nList, "meta1", "I am META1!")); assertTrue(find(nList, "share_allow", "user1")); assertTrue(find(nList, "share_allow", "user2")); assertTrue(find(nList, "share_allow", "user3")); assertTrue(find(nList, "document_deny", "user42")); assertTrue(find(nList, "document_deny", "user52")); assertTrue(find(nList, "share_deny", "user5")); assertTrue(find(nList, "share_deny", "user4")); assertTrue(find(nList, "document_allow", "user22")); assertTrue(find(nList, "document_allow", "user33")); assertTrue(find(nList, "document_allow", "user12")); } private boolean find(NodeList nList, String name, String textContent) { for (int i = 0; i < nList.getLength(); i++) { Node node = nList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; if (name.equals(element.getAttribute(NAME_ATTRIBUTE)) && textContent.equals(element.getTextContent())) return true; } } return false; } @Test public void updateJsonString() throws Exception { String jsonGenerated = toTest.toString(IndexingFormat.JSON, DocumentAction.ADD_UPDATE); final JSONParser parser = new JSONParser(); JSONObject json = (JSONObject)parser.parse(new java.io.StringReader(jsonGenerated)); assertTrue(json.get(APIKEY_ATTRIBUTE) != null); assertTrue(json.get("document") != null); Object apiObject = json.get(APIKEY_ATTRIBUTE); assertTrue(apiObject instanceof String); assertEquals("apikey", apiObject); Object documentObject = json.get("document"); assertTrue(documentObject instanceof JSONObject); JSONObject document = (JSONObject) documentObject; assertTrue(document.get(UID_ATTRIBUTE) != null); assertTrue(document.get(UID_ATTRIBUTE) instanceof String); assertEquals("URI", document.get(UID_ATTRIBUTE)); assertTrue(document.get(COLNAME_ATTRIBUTE) != null); assertTrue(document.get(COLNAME_ATTRIBUTE) instanceof String); assertEquals("collection1", document.get(COLNAME_ATTRIBUTE)); assertTrue(document.get("size") != null); assertTrue(document.get("size") instanceof String); assertEquals("100", document.get("size")); assertTrue(document.get("meta") != null); Object metaObject = document.get("meta"); assertTrue(metaObject instanceof JSONObject); JSONObject meta = (JSONObject) metaObject; assertEquals(6, meta.size()); assertTrue(find(meta, "meta2", "I am META2!", 1)); assertTrue(find(meta, "meta1", "I am META1!", 1)); assertTrue(find(meta, "share_allow", "user1", 3)); assertTrue(find(meta, "share_allow", "user2", 3)); assertTrue(find(meta, "share_allow", "user3", 3)); assertTrue(find(meta, "document_deny", "user42", 2)); assertTrue(find(meta, "document_deny", "user52", 2)); assertTrue(find(meta, "share_deny", "user5", 2)); assertTrue(find(meta, "share_deny", "user4", 2)); assertTrue(find(meta, "document_allow", "user22", 3)); assertTrue(find(meta, "document_allow", "user33", 3)); assertTrue(find(meta, "document_allow", "user12", 3)); assertTrue(document.get("description") != null); assertTrue(document.get("description") instanceof String); assertEquals("I am a little tiny description", document.get("description")); assertTrue(document.get("title") != null); assertTrue(document.get("title") instanceof String); assertEquals("I am a nice title", document.get("title")); assertTrue(document.get("content") != null); assertTrue(document.get("content") instanceof String); assertEquals("I am a nice content in english!", document.get("content")); assertTrue(document.get("contenttype") != null); assertTrue(document.get("contenttype") instanceof String); assertEquals("html", document.get("contenttype")); } private boolean find(JSONObject meta, String name, String textContent, int size) { assertTrue(meta.get(name) != null); assertTrue(meta.get(name) instanceof JSONArray); assertEquals(size, ((JSONArray) meta.get(name)).size()); for (int i = 0; i < size; i++) { if (textContent.equals(((JSONArray) meta.get(name)).get(i).toString())) return true; } return false; } @Test public void deleteJsonString() throws Exception { String jsonGenerated=toTest.toString(IndexingFormat.JSON, DocumentAction.DELETE); final JSONParser parser = new JSONParser(); JSONObject json = (JSONObject)parser.parse(new java.io.StringReader(jsonGenerated)); assertTrue(json.get(APIKEY_ATTRIBUTE) != null); assertTrue(json.get("document") != null); Object apiObject = json.get(APIKEY_ATTRIBUTE); assertTrue(apiObject instanceof String); assertEquals("apikey", apiObject); Object documentObject = json.get("document"); assertTrue(documentObject instanceof JSONObject); JSONObject document = (JSONObject) documentObject; assertTrue(document.get(UID_ATTRIBUTE) != null); assertTrue(document.get(COLNAME_ATTRIBUTE) != null); Object uidObject = document.get(UID_ATTRIBUTE); assertTrue(uidObject instanceof String); assertEquals("URI", uidObject); Object colObject = document.get(COLNAME_ATTRIBUTE); assertTrue(colObject instanceof String); assertEquals("collection1", colObject); } @Test public void deleteXmlString() throws SearchBloxException, ParserConfigurationException, SAXException, IOException { String xmlGenerated=toTest.toString(IndexingFormat.XML, DocumentAction.DELETE); InputSource is = new InputSource(new ByteArrayInputStream(xmlGenerated.getBytes(StandardCharsets.UTF_8))); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(is); doc.getDocumentElement().normalize(); Element root = doc.getDocumentElement(); assertEquals("searchblox", root.getNodeName()); assertEquals("apikey", root.getAttribute(APIKEY_ATTRIBUTE)); assertEquals(1, root.getElementsByTagName("document").getLength()); assertEquals(Node.ELEMENT_NODE, root.getElementsByTagName("document").item(0).getNodeType()); Element document = (Element) root.getElementsByTagName("document").item(0); assertEquals("collection1", document.getAttribute(COLNAME_ATTRIBUTE)); assertEquals("URI", document.getAttribute(UID_ATTRIBUTE)); } private Map<String, List<String>> initArgs() { Map<String, List<String>> argMap=new HashMap<>(); argMap.put(ATTRIBUTE_COLLECTION_NAME, Collections.singletonList("collection1")); argMap.put(ATTRIBUTE_TITLEBOOST, Collections.singletonList("1")); argMap.put(ATTRIBUTE_CONTENTBOOST, Collections.singletonList("2")); argMap.put(ATTRIBUTE_KEYWORDSBOOST, Collections.singletonList("3")); argMap.put(ATTRIBUTE_DESCRIPTIONBOOST, Collections.singletonList("4")); return argMap; } private RepositoryDocument initRepoDocument() throws ManifoldCFException { RepositoryDocument realRepoDoc=new RepositoryDocument(); String binaryContent="I am the binary content of an Amazing Document"; InputStream stream = new ByteArrayInputStream(binaryContent.getBytes(StandardCharsets.UTF_8)); realRepoDoc.addField("title","I am a nice title"); realRepoDoc.addField("content","I am a nice content in english!"); realRepoDoc.addField("description","I am a little tiny description"); realRepoDoc.addField("meta1","I am META1!"); realRepoDoc.addField("meta2","I am META2!"); realRepoDoc.setMimeType("html"); realRepoDoc.setBinary(stream,100); realRepoDoc.setCreatedDate(new Date(System.currentTimeMillis())); realRepoDoc.setSecurityACL(RepositoryDocument.SECURITY_TYPE_SHARE,new String[]{"user1","user2","user3"}); realRepoDoc.setSecurityACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT,new String[]{"user12","user22","user33"}); realRepoDoc.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_SHARE, new String[]{"user4", "user5"}); realRepoDoc.setSecurityDenyACL(RepositoryDocument.SECURITY_TYPE_DOCUMENT, new String[]{"user42", "user52"}); //allowAttributeName + aclType return realRepoDoc; } }