/* * 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.tuscany.das.rdb.test; import java.util.ArrayList; import java.util.List; import org.apache.tuscany.das.rdb.Command; import org.apache.tuscany.das.rdb.DAS; import org.apache.tuscany.das.rdb.config.ConfigFactory; import org.apache.tuscany.das.rdb.config.ResultDescriptor; import org.apache.tuscany.das.rdb.test.data.CustomerData; import org.apache.tuscany.das.rdb.test.framework.DasTest; import commonj.sdo.DataObject; public class DynamicResultDescriptorTests extends DasTest { protected void setUp() throws Exception { super.setUp(); new CustomerData(getAutoConnection()).refresh(); } protected void tearDown() throws Exception { super.tearDown(); } /** * Set result descriptor on Command dynamically */ public void testSetResultDescriptors() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); List resultDescriptorList = new ArrayList(); //as long as columnIndex is correct, order in ArrayList does not matter ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(3); desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.String"); desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc1); resultDescriptorList.add(desc2); select.setResultDescriptors(resultDescriptorList); DataObject root = select.executeQuery(); assertEquals(1, root.getList("CUSTOMER").size()); } /** * Set a result descriptor on Command dynamically * and later replace it with another invalid one, and check failure */ public void testReplaceResultDescriptors() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); List resultDescriptorList = new ArrayList(); //as long as columnIndex is correct, order in ArrayList does not matter ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(3); desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.String"); desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc1); resultDescriptorList.add(desc2); select.setResultDescriptors(resultDescriptorList); DataObject root = select.executeQuery(); assertEquals(1, root.getList("CUSTOMER").size()); //Now use invalid one resultDescriptorList.clear(); desc3.setColumnIndex(3); desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.Int");//incompatible type desc3.setTableName("CUSTOMER"); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc2); resultDescriptorList.add(desc1); select.setResultDescriptors(resultDescriptorList); try{ root = select.executeQuery(); fail("Expected exception"); }catch(Exception e){ assertTrue(e instanceof ClassCastException); } } /** * Set result descriptor on Command dynamically * , overriding the one set from static config. */ public void testOverrideResultDescriptorsFromConfig() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; DAS das = DAS.FACTORY.createDAS(getConfig("customerMappingWithResultDescriptor.xml"), getConnection()); Command select = das.getCommand("testSelectCustomer"); DataObject root = select.executeQuery(); List custList = root.getList("CUSTOMER"); assertEquals("Williams", ((DataObject)custList.get(0)).getString("LASTNAME")); List resultDescriptorList = new ArrayList(); ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(3); desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.Int");//incompatible type desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc1); resultDescriptorList.add(desc2); select.setResultDescriptors(resultDescriptorList); try{ select.executeQuery(); fail("Expected exception"); }catch(Exception e){ assertTrue(e instanceof ClassCastException); } } /** * Set null result descriptor on Command dynamically */ public void testNullResultDescriptors() throws Exception { DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); List resultDescriptorList = null; try{ select.setResultDescriptors(resultDescriptorList); select.executeQuery(); this.assertTrue("Derby has DBMS metadata, so it will be used", true); }catch(RuntimeException e){ fail("Expected to succeed with no exception"); } } /** * Set -ve columnIndex in result descriptor on Command dynamically * Set will not be sorted and Type mismatch wi (Int and String for ID) * will throw exception */ public void testNegativeIndexResultDescriptors() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); List resultDescriptorList = new ArrayList(); ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(-3);//invalid desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.String"); desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc1); resultDescriptorList.add(desc2); try{ select.setResultDescriptors(resultDescriptorList); select.executeQuery(); fail("Expected exception"); }catch(RuntimeException e){ assertTrue("Exception as sorting wil not happen due to -ve columnIndex", true); } } /** * Set matching columnIndices in result descriptor on Command dynamically */ public void testMatchingIndexResultDescriptor() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); List resultDescriptorList = new ArrayList(); ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(1);//two times index is 1 desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.String"); desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); resultDescriptorList.add(desc3); resultDescriptorList.add(desc1); resultDescriptorList.add(desc2); try{ select.setResultDescriptors(resultDescriptorList); select.executeQuery(); fail("Expected exception"); }catch(RuntimeException e){ assertTrue(e.getMessage().indexOf("Two columns in Result Descriptor can not have same index")!= -1); } } public void testAddRemoveResultDescriptor() throws Exception { ConfigFactory factory = ConfigFactory.INSTANCE; ResultDescriptor desc3 = factory.createResultDescriptor(); desc3.setColumnIndex(3);//two times index is 1 desc3.setColumnName("ADDRESS"); desc3.setColumnType("commonj.sdo.String"); desc3.setTableName("CUSTOMER"); ResultDescriptor desc1 = factory.createResultDescriptor(); desc1.setColumnIndex(1); desc1.setColumnName("ID"); desc1.setColumnType("commonj.sdo.Int"); desc1.setTableName("CUSTOMER"); ResultDescriptor desc2 = factory.createResultDescriptor(); desc2.setColumnIndex(2); desc2.setColumnName("LASTNAME"); desc2.setColumnType("commonj.sdo.String"); desc2.setTableName("CUSTOMER"); DAS das = DAS.FACTORY.createDAS(getConnection()); // Read a customer Command select = das.createCommand("SELECT ID, LASTNAME, ADDRESS FROM CUSTOMER WHERE CUSTOMER.ID = 1"); select.addResultDescriptor(desc3); select.addResultDescriptor(desc1); select.addResultDescriptor(desc2); //select.printResultDescriptors(System.out); assertEquals(1, ((ResultDescriptor)select.getResultDescriptors().get(0)).getColumnIndex()); assertEquals(2, ((ResultDescriptor)select.getResultDescriptors().get(1)).getColumnIndex()); assertEquals(3, ((ResultDescriptor)select.getResultDescriptors().get(2)).getColumnIndex()); select.removeResultDescriptor(2); //select.printResultDescriptors(System.out); assertEquals(1, ((ResultDescriptor)select.getResultDescriptors().get(0)).getColumnIndex()); assertEquals(3, ((ResultDescriptor)select.getResultDescriptors().get(1)).getColumnIndex()); select.removeResultDescriptor(desc3); //select.printResultDescriptors(System.out); assertEquals(1, ((ResultDescriptor)select.getResultDescriptors().get(0)).getColumnIndex()); select.addResultDescriptor(null); select.removeResultDescriptor(null); //select.printResultDescriptors(System.out); assertEquals(1, ((ResultDescriptor)select.getResultDescriptors().get(0)).getColumnIndex()); } }