| /* |
| * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // David McCann - July 2013 - Initial Implementation |
| package org.eclipse.persistence.tools.metadata.generation.test.objecttype; |
| |
| |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DATABASE_DDL_CREATE_KEY; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DATABASE_DDL_DEBUG_KEY; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DATABASE_DDL_DROP_KEY; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DEFAULT_DATABASE_DDL_CREATE; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DEFAULT_DATABASE_DDL_DEBUG; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DEFAULT_DATABASE_DDL_DROP; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.DEFAULT_PACKAGE_NAME; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.comparer; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.conn; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.databasePlatform; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.documentToString; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.removeEmptyTextNodes; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.runDdl; |
| import static org.eclipse.persistence.tools.metadata.generation.test.AllTests.xmlParser; |
| //javase imports |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.StringReader; |
| import java.sql.SQLException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.persistence.internal.jpa.metadata.xml.XMLEntityMappings; |
| import org.eclipse.persistence.internal.jpa.metadata.xml.XMLEntityMappingsWriter; |
| import org.eclipse.persistence.tools.metadata.generation.JPAMetadataGenerator; |
| import org.eclipse.persistence.tools.metadata.generation.test.AllTests; |
| import org.eclipse.persistence.tools.oracleddl.parser.ParseException; |
| import org.eclipse.persistence.tools.oracleddl.util.DatabaseTypeBuilder; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import org.w3c.dom.Document; |
| |
| |
| /** |
| * Tests metadata generation from a ProcedureType. |
| * |
| */ |
| public class ObjectTypeTestSuite { |
| static final String CREATE_PHONE_TYPE = |
| "CREATE OR REPLACE TYPE DBWS_PHONE_TYPE AS OBJECT (" + |
| "\nHOME VARCHAR2(20)," + |
| "\nCELL VARCHAR2(20)" + |
| "\n)"; |
| static final String CREATE_A_CONTACT_TYPE = |
| "CREATE OR REPLACE TYPE A_CONTACT_TYPE AS OBJECT (" + |
| "\nADDRESS VARCHAR2(40)," + |
| "\nPHONE DBWS_PHONE_TYPE" + |
| "\n)"; |
| static final String CREATE_PHONE_TYPE_PROC = |
| "CREATE OR REPLACE PROCEDURE CREATE_PHONE_TYPE(HOME_NUMBER IN VARCHAR2, CELL_NUMBER IN VARCHAR2, RESULT OUT DBWS_PHONE_TYPE) AS" + |
| "\nBEGIN" + |
| "\nRESULT := DBWS_PHONE_TYPE(HOME_NUMBER, CELL_NUMBER);" + |
| "\nEND CREATE_PHONE_TYPE;"; |
| static final String CREATE_CONTACT_TYPE_PROC = |
| "CREATE OR REPLACE PROCEDURE CREATE_CONTACT_TYPE(ADDRESS IN VARCHAR2, PHONE IN DBWS_PHONE_TYPE, RESULT OUT A_CONTACT_TYPE) AS" + |
| "\nBEGIN" + |
| "\nRESULT := A_CONTACT_TYPE(ADDRESS, PHONE);" + |
| "\nEND CREATE_CONTACT_TYPE;"; |
| |
| static final String DROP_CREATE_PHONE_TYPE_PROC = |
| "DROP PROCEDURE CREATE_PHONE_TYPE"; |
| static final String DROP_CREATE_CONTACT_TYPE_PROC = |
| "DROP PROCEDURE CREATE_CONTACT_TYPE"; |
| static final String DROP_PHONE_TYPE = |
| "DROP TYPE DBWS_PHONE_TYPE FORCE"; |
| static final String DROP_CONTACT_TYPE = |
| "DROP TYPE A_CONTACT_TYPE FORCE"; |
| |
| static boolean ddlCreate = false; |
| static boolean ddlDrop = false; |
| static boolean ddlDebug = false; |
| |
| @SuppressWarnings("rawtypes") |
| static List dbProcedures; |
| static DatabaseTypeBuilder dbTypeBuilder; |
| |
| @BeforeClass |
| public static void setUp() throws ClassNotFoundException, SQLException { |
| AllTests.setUp(); |
| |
| String ddlCreateProp = System.getProperty(DATABASE_DDL_CREATE_KEY, DEFAULT_DATABASE_DDL_CREATE); |
| if ("true".equalsIgnoreCase(ddlCreateProp)) { |
| ddlCreate = true; |
| } |
| String ddlDropProp = System.getProperty(DATABASE_DDL_DROP_KEY, DEFAULT_DATABASE_DDL_DROP); |
| if ("true".equalsIgnoreCase(ddlDropProp)) { |
| ddlDrop = true; |
| } |
| String ddlDebugProp = System.getProperty(DATABASE_DDL_DEBUG_KEY, DEFAULT_DATABASE_DDL_DEBUG); |
| if ("true".equalsIgnoreCase(ddlDebugProp)) { |
| ddlDebug = true; |
| } |
| if (ddlCreate) { |
| runDdl(conn, CREATE_PHONE_TYPE, ddlDebug); |
| runDdl(conn, CREATE_A_CONTACT_TYPE, ddlDebug); |
| runDdl(conn, CREATE_PHONE_TYPE_PROC, ddlDebug); |
| runDdl(conn, CREATE_CONTACT_TYPE_PROC, ddlDebug); |
| } |
| |
| ArrayList<String> schemas = new ArrayList<String>(); |
| ArrayList<String> procedures = new ArrayList<String>(); |
| |
| schemas.add("TOPLEVEL"); |
| procedures.add("CREATE_PHONE_TYPE"); |
| schemas.add("TOPLEVEL"); |
| procedures.add("CREATE_CONTACT_TYPE"); |
| |
| // use DatabaseTypeBuilder to generate a list of ProcedureTypes |
| dbTypeBuilder = new DatabaseTypeBuilder(); |
| try { |
| dbProcedures = dbTypeBuilder.buildProcedures(conn, schemas, procedures); |
| } catch (ParseException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| @AfterClass |
| public static void tearDown() { |
| if (ddlDrop) { |
| runDdl(conn, DROP_CREATE_PHONE_TYPE_PROC, ddlDebug); |
| runDdl(conn, DROP_CREATE_CONTACT_TYPE_PROC, ddlDebug); |
| runDdl(conn, DROP_CONTACT_TYPE, ddlDebug); |
| runDdl(conn, DROP_PHONE_TYPE, ddlDebug); |
| } |
| } |
| |
| @Test |
| @SuppressWarnings({ "unchecked" }) |
| public void testJPAObjectMetadata() { |
| if (dbProcedures == null || dbProcedures.isEmpty()) { |
| fail("No types were generated."); |
| } |
| XMLEntityMappings mappings = null; |
| try { |
| JPAMetadataGenerator gen = new JPAMetadataGenerator(DEFAULT_PACKAGE_NAME, databasePlatform); |
| mappings = gen.generateXmlEntityMappings(dbProcedures); |
| } catch (Exception x) { |
| fail("An unexpected exception occurred: " + x.getMessage()); |
| } |
| if (mappings == null) { |
| fail("No JPA metadata was generated"); |
| } |
| ByteArrayOutputStream metadata = new ByteArrayOutputStream(); |
| XMLEntityMappingsWriter.write(mappings, metadata); |
| Document testDoc = xmlParser.parse(new StringReader(metadata.toString())); |
| removeEmptyTextNodes(testDoc); |
| Document controlDoc = xmlParser.parse(new StringReader(typemetadata)); |
| removeEmptyTextNodes(controlDoc); |
| assertTrue("Metadata comparison failed. Expected:\n" + documentToString(controlDoc) + "\nActual\n" + documentToString(testDoc), comparer.isNodeEqual(controlDoc, testDoc)); |
| } |
| |
| static final String typemetadata = |
| "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + |
| "<orm:entity-mappings xsi:schemaLocation=\"http://www.eclipse.org/eclipselink/xsds/persistence/orm org/eclipse/persistence/jpa/eclipselink_orm_2_5.xsd\"" + |
| " xmlns:orm=\"http://www.eclipse.org/eclipselink/xsds/persistence/orm\" " + |
| " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + |
| " <orm:named-stored-procedure-query name=\"CREATE_CONTACT_TYPE\" procedure-name=\"CREATE_CONTACT_TYPE\" returns-result-set=\"false\">\n" + |
| " <orm:parameter mode=\"IN\" name=\"ADDRESS\" type=\"java.lang.String\" class=\"java.lang.String\" jdbc-type=\"12\" jdbc-type-name=\"VARCHAR\"/>\n" + |
| " <orm:parameter mode=\"IN\" name=\"PHONE\" type=\"metadatagen.Dbws_phone_type\" class=\"metadatagen.Dbws_phone_type\" jdbc-type=\"2002\" jdbc-type-name=\"DBWS_PHONE_TYPE\"/>\n" + |
| " <orm:parameter mode=\"OUT\" name=\"RESULT\" type=\"metadatagen.A_contact_type\" class=\"metadatagen.A_contact_type\" jdbc-type=\"2002\" jdbc-type-name=\"A_CONTACT_TYPE\"/>\n" + |
| " </orm:named-stored-procedure-query>\n" + |
| " <orm:named-stored-procedure-query name=\"CREATE_PHONE_TYPE\" procedure-name=\"CREATE_PHONE_TYPE\" returns-result-set=\"false\">\n" + |
| " <orm:parameter mode=\"IN\" name=\"HOME_NUMBER\" type=\"java.lang.String\" class=\"java.lang.String\" jdbc-type=\"12\" jdbc-type-name=\"VARCHAR\"/>\n" + |
| " <orm:parameter mode=\"IN\" name=\"CELL_NUMBER\" type=\"java.lang.String\" class=\"java.lang.String\" jdbc-type=\"12\" jdbc-type-name=\"VARCHAR\"/>\n" + |
| " <orm:parameter mode=\"OUT\" name=\"RESULT\" type=\"metadatagen.Dbws_phone_type\" class=\"metadatagen.Dbws_phone_type\" jdbc-type=\"2002\" jdbc-type-name=\"DBWS_PHONE_TYPE\"/>\n" + |
| " </orm:named-stored-procedure-query>\n" + |
| " <orm:oracle-object name=\"DBWS_PHONE_TYPE\" java-type=\"metadatagen.Dbws_phone_type\">\n" + |
| " <orm:field name=\"HOME\" database-type=\"VARCHAR_TYPE\"/>\n" + |
| " <orm:field name=\"CELL\" database-type=\"VARCHAR_TYPE\"/>\n" + |
| " </orm:oracle-object>\n" + |
| " <orm:oracle-object name=\"A_CONTACT_TYPE\" java-type=\"metadatagen.A_contact_type\">\n" + |
| " <orm:field name=\"ADDRESS\" database-type=\"VARCHAR_TYPE\"/>\n" + |
| " <orm:field name=\"PHONE\" database-type=\"DBWS_PHONE_TYPE\"/>\n" + |
| " </orm:oracle-object>\n" + |
| " <orm:embeddable class=\"metadatagen.Dbws_phone_type\" access=\"VIRTUAL\">\n" + |
| " <orm:struct name=\"DBWS_PHONE_TYPE\">\n" + |
| " <orm:field>HOME</orm:field>\n" + |
| " <orm:field>CELL</orm:field>\n" + |
| " </orm:struct>\n" + |
| " <orm:attributes>\n" + |
| " <orm:basic name=\"home\" attribute-type=\"java.lang.String\">\n" + |
| " <orm:column name=\"HOME\"/>\n" + |
| " </orm:basic>\n" + |
| " <orm:basic name=\"cell\" attribute-type=\"java.lang.String\">\n" + |
| " <orm:column name=\"CELL\"/>\n" + |
| " </orm:basic>\n" + |
| " </orm:attributes>\n" + |
| " </orm:embeddable>\n" + |
| " <orm:embeddable class=\"metadatagen.A_contact_type\" access=\"VIRTUAL\">\n" + |
| " <orm:struct name=\"A_CONTACT_TYPE\">\n" + |
| " <orm:field>ADDRESS</orm:field>\n" + |
| " <orm:field>PHONE</orm:field>\n" + |
| " </orm:struct>\n" + |
| " <orm:attributes>\n" + |
| " <orm:basic name=\"address\" attribute-type=\"java.lang.String\">\n" + |
| " <orm:column name=\"ADDRESS\"/>\n" + |
| " </orm:basic>\n" + |
| " <orm:structure name=\"phone\" attribute-type=\"metadatagen.Dbws_phone_type\" target-class=\"metadatagen.Dbws_phone_type\"/>\n" + |
| " </orm:attributes>\n" + |
| " </orm:embeddable>\n" + |
| "</orm:entity-mappings>"; |
| } |