blob: 13e9fdb7afb62c0f5bb76dfd24288a7be62ee750 [file] [log] [blame]
/*
* 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.openjpa.persistence.datacache;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.StoreCache;
import org.apache.openjpa.persistence.test.AbstractCachedEMFTestCase;
public class TestCacheExclusions extends AbstractCachedEMFTestCase {
private OpenJPAEntityManagerFactorySPI emf = null;
private static String[] ITEM_NAMES =
{ "Cup", "pen", "pencil", "phone", "laptop", "keyboard", "mouse" };
private static final String _tSep = ";";
Item[] items = new Item[ITEM_NAMES.length];
Order o1, o2;
Purchase p;
public void populate() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
int n = 0;
for (String s : ITEM_NAMES) {
items[n] = new Item();
items[n].setName(s);
items[n].setId(n);
em.persist(items[n++]);
}
p = new Purchase();
p.setOrders(new ArrayList<>());
o1 = new Order();
o1.setItem(em.find(Item.class, 1));
o1.setQuantity(2);
o1.setPurchase(p);
p.getOrders().add(o1);
o2 = new Order();
o2.setItem(em.find(Item.class, 4));
o2.setQuantity(23);
o2.setPurchase(p);
p.getOrders().add(o2);
em.persist(p);
em.getTransaction().commit();
em.close();
}
@Override
public void tearDown() throws Exception {
if (emf != null) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
for (ClassMapping mapping : ((ClassMapping[]) emf
.getConfiguration().getMetaDataRepositoryInstance()
.getMetaDatas())) {
Query q =
em.createNativeQuery("DROP TABLE "
+ mapping.getTable().getName());
q.executeUpdate();
}
em.getTransaction().commit();
em.close();
emf.close();
}
emf = null;
super.tearDown();
}
public void testCacheAll() {
getEntityManagerFactoryCacheSettings(null, null);
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, true, true, true);
}
public void testCacheItems() {
getEntityManagerFactoryCacheSettings(new Class[] { Item.class }, null);
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, false, false, true);
}
public void testCacheItemsAndPurchases() {
getEntityManagerFactoryCacheSettings(new Class[] { Item.class,
Purchase.class }, null);
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, true, false, true);
}
public void testCacheItemsAndOrders() {
getEntityManagerFactoryCacheSettings(new Class[] { Item.class,
Order.class }, null);
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, false, true, true);
}
public void testCachePurchasesAndOrders() {
getEntityManagerFactoryCacheSettings(new Class[] { Purchase.class,
Order.class }, null);
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, true, true, false);
}
public void testExcludePurchases() {
getEntityManagerFactoryCacheSettings(null,
new Class[] { Purchase.class });
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, false, true, true);
}
public void testExcludeOrders() {
getEntityManagerFactoryCacheSettings(null, new Class[] { Order.class });
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, true, false, true);
}
public void testExcludeItems() {
getEntityManagerFactoryCacheSettings(null, new Class[] { Item.class });
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, true, true, false);
}
public void testExcludeOrdersAndPurchases() {
getEntityManagerFactoryCacheSettings(null, new Class[] { Order.class,
Purchase.class });
populate();
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, false, false, true);
}
public void testIncludePurchaseItemExcludePurchase() {
try{
getEntityManagerFactoryCacheSettings(new Class[] { Purchase.class,
Item.class }, new Class[] { Purchase.class });
populate();
fail("Shouldn't be able to create an EMF with an entity in both Types and ExcludedTypes");
StoreCache cache = emf.getStoreCache();
assertCacheContents(cache, false, false, true);
}catch(Exception e){
//expected
}
}
public OpenJPAEntityManagerFactorySPI getEntityManagerFactoryCacheSettings(
Class<?>[] includedTypes, Class<?>[] excludedTypes) {
StringBuilder includes = new StringBuilder();
if (includedTypes != null && includedTypes.length > 0) {
includes.append("Types=");
for (Class<?> c : includedTypes) {
includes.append(c.getName());
includes.append(_tSep);
}
includes.setLength(includes.length() - 1); // remove last semicolon
}
StringBuilder excludes = new StringBuilder();
if (excludedTypes != null && excludedTypes.length > 0) {
excludes.append("ExcludedTypes=");
for (Class<?> c : excludedTypes) {
excludes.append(c.getName());
excludes.append(_tSep);
}
excludes.setLength(excludes.length() - 1); // remove last semicolon
}
StringBuilder dataCacheSettings = new StringBuilder();
boolean hasIncludeOrExclude = includes.length() > 0 || excludes.length() > 0;
dataCacheSettings.append("true" + (hasIncludeOrExclude ? "(" : ""));
if (hasIncludeOrExclude) {
dataCacheSettings.append(includes);
if (includes.length() > 0 && excludes.length() > 0)
dataCacheSettings.append(",");
dataCacheSettings.append(excludes);
dataCacheSettings.append(")");
}
Map<String, String> props = new HashMap<>();
props.put("openjpa.DataCache", dataCacheSettings.toString());
props.put("openjpa.RemoteCommitProvider", "sjvm");
props.put("openjpa.MetaDataFactory", "jpa(Types="
+ Item.class.getName() + _tSep + Purchase.class.getName() + _tSep
+ Order.class.getName() + ")");
emf =
(OpenJPAEntityManagerFactorySPI) javax.persistence.Persistence
.createEntityManagerFactory("test", props);
return emf;
}
public void assertCacheContents(StoreCache cache, boolean expectPurchase,
boolean expectOrders, boolean expectItems) {
assertEquals("Expected purchases to " + (expectPurchase ? "" : "not ")
+ "exist in the cache", expectPurchase, cache.contains(
Purchase.class, p.getId()));
assertEquals("Expected Orders to " + (expectOrders ? "" : "not ")
+ "exist in the cache", expectOrders, cache.contains(Order.class,
o1.getId()));
assertEquals("Expected Orders to " + (expectOrders ? "" : "not ")
+ "exist in the cache", expectOrders, cache.contains(Order.class,
o2.getId()));
for (int i = 0; i < ITEM_NAMES.length; i++) {
assertEquals("Expected Items to " + (expectItems ? "" : "not ")
+ "exist in the cache", expectItems, cache.contains(Item.class,
items[i].getId()));
}
}
}