/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.jboss; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CHILD_TYPE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.jboss.as.cli.Util; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest; import org.jboss.as.subsystem.test.KernelServices; import org.jboss.dmr.ModelNode; import org.junit.Assert; import org.junit.Test; import org.teiid.core.util.ObjectConverterUtil; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @SuppressWarnings("nls") public class TestTeiidConfiguration extends AbstractSubsystemBaseTest { public TestTeiidConfiguration() { super(TeiidExtension.TEIID_SUBSYSTEM, new TeiidExtension()); } @Override protected String getSubsystemXml() throws IOException { String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml")); return subsystemXml; } @Override protected String getSubsystemXsdPath() throws Exception { return "schema/jboss-teiid.xsd"; } @Test public void testDescribeHandler() throws Exception { standardSubsystemTest(null, true); } @Override protected String readResource(final String name) throws IOException { String minimum = "<subsystem xmlns=\"urn:jboss:domain:teiid:1.1\"> \n" + "</subsystem>"; if (name.equals("minimum")) { return minimum; } return null; } @Test public void testMinimumConfiguration() throws Exception { standardSubsystemTest("minimum"); } @Test public void testOutputPerisitence() throws Exception { String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt")); ModelNode testModel = ModelNode.fromJSONString(json); String triggered = outputModel(testModel); KernelServices services = standardSubsystemTest(null, true); //Get the model and the persisted xml from the controller ModelNode model = services.readWholeModel(); String marshalled = services.getPersistedSubsystemXml(); //System.out.println(marshalled); Assert.assertEquals(marshalled, triggered); Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered)); } @Test public void testOutputModel() throws Exception { String json = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-model-json.txt")); ModelNode testModel = ModelNode.fromJSONString(json); String triggered = outputModel(testModel); KernelServices services = standardSubsystemTest(null, false); //Get the model and the persisted xml from the controller ModelNode model = services.readWholeModel(); String marshalled = services.getPersistedSubsystemXml(); Assert.assertEquals(marshalled, triggered); Assert.assertEquals(normalizeXML(marshalled), normalizeXML(triggered)); } @Test public void testSchema() throws Exception { String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml")); validate(subsystemXml); KernelServices services = standardSubsystemTest(null, false); //Get the model and the persisted xml from the controller ModelNode model = services.readWholeModel(); String marshalled = services.getPersistedSubsystemXml(); validate(marshalled); } private void validate(String marshalled) throws SAXException, IOException { URL xsdURL = Thread.currentThread().getContextClassLoader().getResource("schema/jboss-teiid.xsd"); SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema schema = factory.newSchema(xsdURL); Validator validator = schema.newValidator(); Source source = new StreamSource(new ByteArrayInputStream(marshalled.getBytes())); validator.setErrorHandler(new ErrorHandler() { @Override public void warning(SAXParseException exception) throws SAXException { fail(exception.getMessage()); } @Override public void fatalError(SAXParseException exception) throws SAXException { fail(exception.getMessage()); } @Override public void error(SAXParseException exception) throws SAXException { if (!exception.getMessage().contains("cvc-enumeration-valid") && !exception.getMessage().contains("cvc-type")) { fail(exception.getMessage()); } } }); validator.validate(source); } @Test public void testParseSubsystem() throws Exception { //Parse the subsystem xml into operations String subsystemXml = ObjectConverterUtil.convertToString(new FileReader("src/test/resources/teiid-sample-config.xml")); List<ModelNode> operations = super.parse(subsystemXml); ///Check that we have the expected number of operations Assert.assertEquals(5, operations.size()); //Check that each operation has the correct content ModelNode addSubsystem = operations.get(0); Assert.assertEquals(ADD, addSubsystem.get(OP).asString()); PathAddress addr = PathAddress.pathAddress(addSubsystem.get(OP_ADDR)); Assert.assertEquals(1, addr.size()); PathElement element = addr.getElement(0); Assert.assertEquals(SUBSYSTEM, element.getKey()); Assert.assertEquals(TeiidExtension.TEIID_SUBSYSTEM, element.getValue()); } @Test public void testQueryOperations() throws Exception { KernelServices services = standardSubsystemTest(null, true); PathAddress addr = PathAddress.pathAddress( PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM)); ModelNode addOp = new ModelNode(); addOp.get(OP).set("read-operation-names"); addOp.get(OP_ADDR).set(addr.toModelNode()); ModelNode result = services.executeOperation(addOp); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); List<String> opNames = getList(result); String[] ops = { "add", "add-anyauthenticated-role", "add-data-role", "add-source", "assign-datasource", "cache-statistics", "cache-types", "cancel-request", "change-vdb-connection-type", "clear-cache", "engine-statistics", "execute-query", "get-query-plan", "get-schema", "get-translator", "get-vdb", "list-add", "list-clear", "list-get", "list-long-running-requests", "list-remove", "list-requests", "list-requests-per-session", "list-requests-per-vdb", "list-sessions", "list-transactions", "list-translators", "list-vdbs", "map-clear", "map-get", "map-put", "map-remove", "mark-datasource-available", "query", "read-attribute", "read-attribute-group", "read-attribute-group-names", "read-children-names", "read-children-resources", "read-children-types", "read-operation-description", "read-operation-names", "read-rar-description", "read-resource", "read-resource-description", "read-translator-properties", "remove", "remove-anyauthenticated-role", "remove-data-role", "remove-source", "restart-vdb", "terminate-session", "terminate-transaction", "undefine-attribute", "update-source", "workerpool-statistics", "write-attribute"}; Assert.assertArrayEquals(opNames.toString(), ops, opNames.toArray(new String[opNames.size()])); } @Test public void testAddRemoveTransport() throws Exception { KernelServices services = standardSubsystemTest(null, true); PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM)); // look at current query engines make sure there are only two from configuration. ModelNode read = new ModelNode(); read.get(OP).set("read-children-names"); read.get(OP_ADDR).set(addr.toModelNode()); read.get(CHILD_TYPE).set("transport"); ModelNode result = services.executeOperation(read); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); List<String> opNames = getList(result); assertEquals(2, opNames.size()); String [] ops = {"jdbc", "odbc"}; assertEquals(Arrays.asList(ops), opNames); // add transport ModelNode addOp = new ModelNode(); addOp.get(OP).set("add"); addOp.get(OP_ADDR).set(addr.toModelNode().add("transport", "newbie")); //$NON-NLS-1$); addOp.get("protocol").set("pg"); addOp.get("socket-binding").set("socket"); addOp.get("authentication-security-domain").set("teiid-security"); result = services.executeOperation(addOp); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); result = services.executeOperation(read); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); opNames = getList(result); assertEquals(3, opNames.size()); String [] ops2 = {"jdbc", "newbie", "odbc"}; assertEquals(Arrays.asList(ops2), opNames); // add transport ModelNode remove = new ModelNode(); remove.get(OP).set("remove"); remove.get(OP_ADDR).set(addr.toModelNode().add("transport", "jdbc")); //$NON-NLS-1$); result = services.executeOperation(remove); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); result = services.executeOperation(read); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); opNames = getList(result); assertEquals(2, opNames.size()); String [] ops3 = {"newbie", "odbc"}; assertEquals(Arrays.asList(ops3), opNames); } private static List<String> getList(ModelNode operationResult) { if(!operationResult.hasDefined("result")) { return Collections.emptyList(); } List<ModelNode> nodeList = operationResult.get("result").asList(); if(nodeList.isEmpty()) { return Collections.emptyList(); } List<String> list = new ArrayList<String>(nodeList.size()); for(ModelNode node : nodeList) { list.add(node.asString()); } return list; } // private ModelNode buildProperty(String name, String value) { // ModelNode node = new ModelNode(); // node.get("property-name").set(name); // node.get("property-value").set(value); // return node; // } @Test public void testTranslator() throws Exception { KernelServices services = standardSubsystemTest(null, true); PathAddress addr = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, TeiidExtension.TEIID_SUBSYSTEM)); ModelNode addOp = new ModelNode(); addOp.get(OP).set("add"); addOp.get(OP_ADDR).set(addr.toModelNode().add("translator", "oracle")); ModelNode result = services.executeOperation(addOp); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); ModelNode read = new ModelNode(); read.get(OP).set("read-children-names"); read.get(OP_ADDR).set(addr.toModelNode()); read.get(CHILD_TYPE).set("translator"); result = services.executeOperation(read); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); List<String> translators = Util.getList(result); Assert.assertTrue(translators.contains("oracle")); ModelNode resourceRead = new ModelNode(); resourceRead.get(OP).set("read-resource"); resourceRead.get(OP_ADDR).set(addr.toModelNode()); resourceRead.get("translator").set("oracle"); result = services.executeOperation(resourceRead); Assert.assertEquals(SUCCESS, result.get(OUTCOME).asString()); // ModelNode oracleNode = result.get("result"); // // ModelNode oracle = new ModelNode(); // oracle.get("translator-name").set("oracle"); // oracle.get("description").set("A translator for Oracle 9i Database or later"); // oracle.get("children", "properties").add(buildProperty("execution-factory-class","org.teiid.translator.jdbc.oracle.OracleExecutionFactory")); // oracle.get("children", "properties").add(buildProperty("TrimStrings","false")); // oracle.get("children", "properties").add(buildProperty("SupportedJoinCriteria","ANY")); // oracle.get("children", "properties").add(buildProperty("requiresCriteria","false")); // oracle.get("children", "properties").add(buildProperty("supportsOuterJoins","true")); // oracle.get("children", "properties").add(buildProperty("useCommentsInSourceQuery","false")); // oracle.get("children", "properties").add(buildProperty("useBindVariables","true")); // oracle.get("children", "properties").add(buildProperty("MaxPreparedInsertBatchSize","2048")); // oracle.get("children", "properties").add(buildProperty("supportsInnerJoins","true")); // oracle.get("children", "properties").add(buildProperty("MaxInCriteriaSize","1000")); // oracle.get("children", "properties").add(buildProperty("supportsSelectDistinct","true")); // oracle.get("children", "properties").add(buildProperty("supportsOrderBy","true")); // oracle.get("children", "properties").add(buildProperty("supportsFullOuterJoins","true")); // oracle.get("children", "properties").add(buildProperty("Immutable","false")); // oracle.get("children", "properties").add(buildProperty("MaxDependentInPredicates","50")); // // super.compare(oracleNode, oracle); } }