/*
* 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.resource.adapter.coherence;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.teiid.language.Comparison;
import org.teiid.resource.adapter.coherence.CoherenceConnection;
import org.teiid.resource.adapter.coherence.CoherenceManagedConnectionFactory;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.Filter;
import junit.framework.TestCase;
public class TestCoherenceConnection extends TestCase {
public static final String CACHE_NAME = "Trades";
public static final String OBJECT_TRANSLATOR = "org.teiid.resource.adapter.coherence.TestObjectTranslator";
public static final int NUMLEGS = 10;
public static final int NUMTRADES = 3;
static {
try {
loadCoherence();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Load the cache with 3 trades and 10 legs for each trade.
*
* @throws Exception
*/
private static void loadCoherence() throws Exception {
NamedCache tradesCache = CacheFactory.getCache(CACHE_NAME);
// populate the cache
Map legsMap = new HashMap();
Trade trade = new Trade();
for (int i = 1; i <= NUMTRADES; i++) {
for (int j = 1; j <= NUMLEGS; j++) {
Leg leg = new Leg();
leg.setId(j);
leg.setNotional(i + j);
legsMap.put(j, leg);
}
trade.setId(i);
trade.setName("NameIs " + i);
trade.setLegs(legsMap);
tradesCache.put(i, trade);
}
System.out.println("Loaded Coherence");
}
/**
* This will instantiate the {@link CoherenceManagedConnectionFactory} and
* obtain a connection to
*
* @throws Exception
*/
@Test
public void testGet1Trade() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
List<Object> ids = new ArrayList<Object>();
ids.add(new Long(1));
Filter criteria = CoherenceFilterUtil.createInFilter("id", ids, Long.class);
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 1, trades.size());
// grab the first trade to confirm trade 1 was found in the cache.
Trade t = (Trade) trades.get(0);
Map legs = t.getLegs();
assertEquals("Did not get expected number of legs", NUMLEGS, legs.size());
}
@Test
public void testGetAllTrades() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f
.createConnectionFactory().getConnection();
List<Object> trades = conn.get(null);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", NUMTRADES, trades.size());
Trade t = (Trade) trades.get(0);
Map legs = t.getLegs();
assertEquals("Did not get expected number of legs", NUMLEGS, legs.size());
}
@Test
public void testLike() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
Filter criteria = CoherenceFilterUtil.createFilter("Name like 'Name%'");
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 3, trades.size());
}
@Test
public void testIn() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
// NOTE: Coherence, because the datatype of ID is long, wants the "l" appended to the value
Filter criteria = CoherenceFilterUtil.createFilter("Id In (1l)");
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 1, trades.size());
}
@Test
public void testEqualOnTrade() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
// NOTE: Coherence, because the datatype of ID is long, wants the "l" appended to the value
Filter criteria = CoherenceFilterUtil.createFilter("Id = 1l");
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 1, trades.size());
long l = 1;
criteria = CoherenceFilterUtil.createCompareFilter("Id", l, Comparison.Operator.EQ, Long.class);
trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 1, trades.size());
}
/**
* this test will not work out-of-the-box. Coherence, from what I've found, doen'st support this, but can be developed.
* @throws Exception
*/
@Test
public void xtestEqualOnContainerObject() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
long l = 1;
// NOTE: Coherence, because the datatype of ID is long, wants the "l" appended to the value
// Filter criteria = CoherenceFilterUtil.createFilter("Id = 1l");
Filter criteria = CoherenceFilterUtil.createCompareFilter("getLegs.getLegId", l, Comparison.Operator.EQ, Long.class);
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected number of trades", 1, trades.size());
}
@Test
public void testAddAndRemoveTrade() throws Exception {
CoherenceManagedConnectionFactory f = new CoherenceManagedConnectionFactory();
f.setCacheName(CACHE_NAME);
f.setCacheTranslatorClassName(OBJECT_TRANSLATOR);
CoherenceConnection conn = (CoherenceConnection) f.createConnectionFactory().getConnection();
Trade trade = new Trade();
trade.setId(999);
trade.setName("NameIs " + 999);
trade.setLegs(null);
conn.add(999l, trade);
// NOTE: Coherence, because the datatype of ID is long, wants the "l" appended to the value
Filter criteria = CoherenceFilterUtil.createFilter("Id = 999l");
List<?> trades = conn.get(criteria);
assertNotNull(trades);
assertEquals("Did not get expected 999 trade", 1, trades.size());
long l = 999l;
criteria = CoherenceFilterUtil.createCompareFilter("Id", l, Comparison.Operator.EQ, Long.class);
trades = conn.get(CoherenceFilterUtil.createFilter("Id = 999l"));
assertNotNull(trades);
assertEquals("Did not get expected 999 trade", 1, trades.size());
conn.remove(l);
trades = conn.get(CoherenceFilterUtil.createFilter("Id = 999l"));
assertNotNull(trades);
assertEquals("Expected no trade", 0, trades.size());
}
}