/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2016, Red Hat Inc, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the Eclipse Public License 1.0 as * published by the Free Software Foundation. * * This software 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 Eclipse * Public License for more details. * * You should have received a copy of the Eclipse Public License * along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.ironjacamar.codegenerator.code; import org.ironjacamar.codegenerator.BasicType; import org.ironjacamar.codegenerator.Definition; import org.ironjacamar.codegenerator.McfDef; import org.ironjacamar.codegenerator.MethodForConnection; import org.ironjacamar.codegenerator.MethodParam; import java.io.IOException; import java.io.Writer; /** * A Test CodeGen. * * @author Jeff Zhang * @version $Revision: $ */ public class TestCodeGen extends AbstractCodeGen { /** * Output class * * @param def definition * @param out Writer * @throws IOException ioException */ @Override public void writeClassBody(Definition def, Writer out) throws IOException { int indent = 1; out.write("@RunWith(IronJacamar.class)\n"); out.write("@SuppressWarnings(\"rawtypes\")\n"); out.write("public class " + getClassName(def)); writeLeftCurlyBracket(out, 0); writeWithIndent(out, indent, "private static String deploymentName = \"" + getClassName(def) + "\";\n\n"); writeResource(def, out, indent); writeDeployment(def, out, indent); writeActivation(def, out, indent); for (int num = 0; num < def.getMcfDefs().size(); num++) { if (def.getMcfDefs().get(num).isDefineMethodInConnection()) { writeTestMethod(def, out, indent, num + 1); } else { writeTestBasic(def, out, indent, num + 1); } } writeRightCurlyBracket(out, 0); } /** * Output class import * * @param def definition * @param out Writer * @throws IOException ioException */ @Override public void writeImport(Definition def, Writer out) throws IOException { out.write("package " + def.getRaPackage() + ";\n\n"); out.write("import org.ironjacamar.embedded.Deployment;\n"); out.write("import org.ironjacamar.embedded.dsl.resourceadapters20.api.ConnectionDefinitionsType;\n"); out.write("import org.ironjacamar.embedded.dsl.resourceadapters20.api.ResourceAdapterType;\n"); out.write("import org.ironjacamar.embedded.dsl.resourceadapters20.api.ResourceAdaptersDescriptor;\n"); out.write("import org.ironjacamar.embedded.junit4.IronJacamar;\n"); writeEol(out); out.write("import javax.annotation.Resource;\n"); writeEol(out); out.write("import org.jboss.shrinkwrap.api.ShrinkWrap;\n"); out.write("import org.jboss.shrinkwrap.api.asset.StringAsset;\n"); out.write("import org.jboss.shrinkwrap.api.spec.JavaArchive;\n"); out.write("import org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive;\n"); out.write("import org.jboss.shrinkwrap.descriptor.api.Descriptors;\n"); writeEol(out); out.write("import org.junit.Test;\n"); out.write("import org.junit.runner.RunWith;\n"); writeEol(out); out.write("import static org.junit.Assert.assertNotNull;\n"); } /** * get this class name * * @param def definition * @return String class name */ @Override public String getClassName(Definition def) { return "ConnectorTestCase"; } /** * Output create deployment method * * @param def definition * @param out Writer * @param indent space number * @throws IOException ioException */ private void writeDeployment(Definition def, Writer out, int indent) throws IOException { writeWithIndent(out, indent, "/**\n"); writeWithIndent(out, indent, " * Define the deployment\n"); writeWithIndent(out, indent, " *\n"); writeWithIndent(out, indent, " * @return The deployment archive\n"); writeWithIndent(out, indent, " */\n"); writeWithIndent(out, indent, "@Deployment(order = 1)\n"); writeWithIndent(out, indent, "public static ResourceAdapterArchive createDeployment()"); writeLeftCurlyBracket(out, indent); writeWithIndent(out, indent + 1, "org.jboss.shrinkwrap.descriptor.api.connector" + def.getVersionNoDot() + ".ConnectorDescriptor raXml = Descriptors\n"); writeWithIndent(out, indent + 2, ".create(org.jboss.shrinkwrap.descriptor.api.connector" + def.getVersionNoDot() + " .ConnectorDescriptor.class, " + "\"ra.xml\").version(\"" + def.getVersion() + "\");\n"); writeWithIndent(out, indent + 1, "org.jboss.shrinkwrap.descriptor.api.connector" + def.getVersionNoDot() + ".ResourceadapterType rt = " + "raXml.getOrCreateResourceadapter()" + (def.isUseRa() ? "" : ";") + "\n"); if (def.isUseRa()) writeWithIndent(out, indent + 2, ".resourceadapterClass(" + def.getRaClass() + ".class.getName());\n"); writeWithIndent(out, indent + 1, "org.jboss.shrinkwrap.descriptor.api.connector" + def.getVersionNoDot() + ".OutboundResourceadapterType ort = rt\n"); writeWithIndent(out, indent + 2, ".getOrCreateOutboundResourceadapter().transactionSupport(\"" + def.getSupportTransaction() + "\")." + "reauthenticationSupport(false);\n"); for (McfDef mcfDef : def.getMcfDefs()) { writeWithIndent(out, indent + 1, "ort.createConnectionDefinition()\n"); writeWithIndent(out, indent + 2, ".managedconnectionfactoryClass(" + mcfDef.getMcfClass() + ".class.getName())\n"); writeWithIndent(out, indent + 2, ".connectionfactoryInterface(" + mcfDef.getCfInterfaceClass() + ".class.getName())\n"); if (mcfDef.isUseCciConnection()) writeWithIndent(out, indent + 2, ".connectionfactoryImplClass(" + mcfDef.getCciConnFactoryClass() + ".class.getName())\n"); else writeWithIndent(out, indent + 2, ".connectionfactoryImplClass(" + mcfDef.getCfClass() + ".class.getName())\n"); writeWithIndent(out, indent + 2, ".connectionInterface(" + mcfDef.getConnInterfaceClass() + ".class.getName())\n"); if (mcfDef.isUseCciConnection()) writeWithIndent(out, indent + 2, ".connectionImplClass(" + mcfDef.getCciConnClass() + ".class.getName());\n"); else writeWithIndent(out, indent + 2, ".connectionImplClass(" + mcfDef.getConnImplClass() + ".class.getName());\n"); } writeWithIndent(out, indent + 1, "ResourceAdapterArchive raa = ShrinkWrap.create(ResourceAdapterArchive.class, " + "deploymentName + \".rar\");\n"); writeWithIndent(out, indent + 1, "JavaArchive ja = ShrinkWrap.create(JavaArchive.class, deploymentName + \".rar\");\n"); if (def.getMcfDefs().size() > 0) { writeWithIndent(out, indent + 1, "ja.addPackages(true, " + def.getMcfDefs().get(0).getMcfClass() + ".class.getPackage());\n"); } else { writeWithIndent(out, indent + 1, "ja.addPackages(true, " + def.getRaClass() + ".class.getPackage());\n"); } writeWithIndent(out, indent + 1, "raa.addAsLibrary(ja);\n"); writeWithIndent(out, indent + 1, "raa.addAsManifestResource(new StringAsset(raXml.exportAsString()), \"ra.xml\");\n"); writeWithIndent(out, indent + 1, "return raa;\n"); writeRightCurlyBracket(out, indent); writeEol(out); } /** * Output create activation method * * @param def definition * @param out Writer * @param indent space number * @throws IOException ioException */ private void writeActivation(Definition def, Writer out, int indent) throws IOException { writeWithIndent(out, indent, "/**\n"); writeWithIndent(out, indent, " * The activation\n"); writeWithIndent(out, indent, " * @throws Throwable In case of an error\n"); writeWithIndent(out, indent, " */\n"); writeWithIndent(out, indent, "@Deployment(order = 2)\n"); writeWithIndent(out, indent, "private ResourceAdaptersDescriptor createActivation() throws Throwable"); writeLeftCurlyBracket(out, indent); indent++; writeWithIndent(out, indent, "ResourceAdaptersDescriptor dashRaXml = Descriptors.create(" + "ResourceAdaptersDescriptor.class, deploymentName + \"-ra.xml\");\n"); writeWithIndent(out, indent, "ResourceAdapterType dashRaXmlRt = dashRaXml.createResourceAdapter().archive(" + "deploymentName + \".rar\");\n"); writeWithIndent(out, indent, "String tsl = \"" + def.getSupportTransaction() + "\";\n"); writeWithIndent(out, indent, "dashRaXmlRt.transactionSupport(tsl);\n"); writeWithIndent(out, indent, "ConnectionDefinitionsType dashRaXmlCdst = dashRaXmlRt.getOrCreateConnectionDefinitions();\n"); int count = 0; for (McfDef mcfDef : def.getMcfDefs()) { count++; writeWithIndent(out, indent, "org.ironjacamar.embedded.dsl.resourceadapters20.api.ConnectionDefinitionType dashRaXmlCdt" + count + "= dashRaXmlCdst\n"); if (mcfDef.isUseCciConnection()) { writeWithIndent(out, indent + 1, ".createConnectionDefinition().className(" + mcfDef.getCciConnFactoryClass() + ".class.getName())\n"); writeWithIndent(out, indent + 1, ".jndiName(\"java:/eis/" + mcfDef.getCciConnFactoryClass() + "\").id(\"" + mcfDef.getCciConnFactoryClass() + "\");\n"); } else { writeWithIndent(out, indent + 1, ".createConnectionDefinition().className(" + mcfDef.getCfInterfaceClass() + ".class.getName())\n"); writeWithIndent(out, indent + 1, ".jndiName(\"java:/eis/" + mcfDef.getCfInterfaceClass() + "\").id(\"" + mcfDef.getCfInterfaceClass() + "\");\n"); } writeWithIndent(out, indent, "if (tsl == null ||\n"); writeWithIndent(out, indent + 1, "tsl.equals(\"NoTransaction\") ||\n"); writeWithIndent(out, indent + 1, "tsl.equals(\"LocalTransaction\"))"); writeLeftCurlyBracket(out, indent); writeWithIndent(out, indent + 1, "dashRaXmlCdt" + count + ".getOrCreatePool().minPoolSize(0).initialPoolSize(0).maxPoolSize(10);\n"); writeRightCurlyBracket(out, indent); writeWithIndent(out, indent, "else"); writeLeftCurlyBracket(out, indent); writeWithIndent(out, indent + 1, "dashRaXmlCdt" + count + ".getOrCreateXaPool().minPoolSize(0).initialPoolSize(0).maxPoolSize(10);\n"); writeRightCurlyBracket(out, indent); } writeWithIndent(out, indent, "return dashRaXml;\n"); writeRightCurlyBracket(out, indent - 1); writeEol(out); } /** * Output resource for conection factory * * @param def definition * @param out Writer * @param indent space number * @throws IOException ioException */ private void writeResource(Definition def, Writer out, int indent) throws IOException { for (int num = 0; num < def.getMcfDefs().size(); num++) { writeWithIndent(out, indent, "/** Resource */\n"); if (def.getMcfDefs().get(num).isUseCciConnection()) { writeWithIndent(out, indent, "@Resource(mappedName = \"java:/eis/" + def.getMcfDefs().get(num).getCciConnFactoryClass() + "\")\n"); } else { writeWithIndent(out, indent, "@Resource(mappedName = \"java:/eis/" + def.getMcfDefs().get(num).getCfInterfaceClass() + "\")\n"); } if (def.getMcfDefs().get(num).isUseCciConnection()) writeWithIndent(out, indent, "private javax.resource.cci.ConnectionFactory"); else writeWithIndent(out, indent, "private " + def.getMcfDefs().get(num).getCfInterfaceClass()); out.write(" connectionFactory" + (num + 1) + ";\n\n"); } } /** * Output test basic method * * @param def definition * @param out Writer * @param indent space number * @param num number of mcf * @throws IOException ioException */ private void writeTestBasic(Definition def, Writer out, int indent, int num) throws IOException { writeWithIndent(out, indent, "/**\n"); writeWithIndent(out, indent, " * Test getConnection\n"); writeWithIndent(out, indent, " *\n"); writeWithIndent(out, indent, " * @exception Throwable Thrown if case of an error\n"); writeWithIndent(out, indent, " */\n"); writeWithIndent(out, indent, "@Test\n"); writeWithIndent(out, indent, "public void testGetConnection" + num + "() throws Throwable"); writeLeftCurlyBracket(out, indent); writeWithIndent(out, indent + 1, "assertNotNull(connectionFactory" + num + ");\n"); writeIndent(out, indent + 1); if (def.getMcfDefs().get(num - 1).isUseCciConnection()) out.write("javax.resource.cci.Connection"); else out.write(def.getMcfDefs().get(num - 1).getConnInterfaceClass()); out.write(" connection" + num + " = connectionFactory" + num + ".getConnection();\n"); writeWithIndent(out, indent + 1, "assertNotNull(connection" + num + ");\n"); writeWithIndent(out, indent + 1, "connection" + num + ".close();"); writeRightCurlyBracket(out, indent); } /** * Output test generated method * * @param def definition * @param out Writer * @param indent space number * @param num number of mcf * @throws IOException ioException */ private void writeTestMethod(Definition def, Writer out, int indent, int num) throws IOException { for (MethodForConnection method : def.getMcfDefs().get(num - 1).getMethods()) { writeWithIndent(out, indent, "/**\n"); writeWithIndent(out, indent, " * Test " + method.getMethodName() + "\n"); writeWithIndent(out, indent, " *\n"); writeWithIndent(out, indent, " * @exception Throwable Thrown if case of an error\n"); writeWithIndent(out, indent, " */\n"); writeWithIndent(out, indent, "@Test\n"); writeWithIndent(out, indent, "public void test" + upcaseFirst(method.getMethodName())); int paramSize = method.getParams().size(); if (paramSize == 0) out.write("NoArg"); else { for (int i = 0; i < paramSize; i++) { MethodParam param = method.getParams().get(i); out.write(upcaseFirst(param.getName())); String type = param.getType(); if (type.indexOf(".") >= 0) type = type.substring(type.lastIndexOf(".") + 1); out.write(type); } } out.write("() throws Throwable"); writeLeftCurlyBracket(out, indent); writeWithIndent(out, indent + 1, "assertNotNull(connectionFactory" + num + ");\n"); writeIndent(out, indent + 1); if (def.getMcfDefs().get(num - 1).isUseCciConnection()) out.write("javax.resource.cci.Connection"); else out.write(def.getMcfDefs().get(num - 1).getConnInterfaceClass()); out.write(" connection" + num + " = connectionFactory" + num + ".getConnection();\n"); writeWithIndent(out, indent + 1, "assertNotNull(connection" + num + ");\n"); writeIndent(out, indent + 1); if (!method.getReturnType().equals("void")) { out.write(method.getReturnType() + " result = "); } out.write("connection" + num + "." + method.getMethodName() + "("); for (int i = 0; i < paramSize; i++) { MethodParam param = method.getParams().get(i); out.write(BasicType.defaultValue(param.getType())); if (i + 1 < paramSize) out.write(", "); } out.write(");\n"); writeWithIndent(out, indent + 1, "connection" + num + ".close();"); writeRightCurlyBracket(out, indent); writeEol(out); } } }