http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/HibernateJUnitTest.java ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/HibernateJUnitTest.java b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/HibernateJUnitTest.java new file mode 100644 index 0000000..2566515 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/HibernateJUnitTest.java @@ -0,0 +1,401 @@ +/*========================================================================= + * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. + * This product is protected by U.S. and international copyright + * and intellectual property laws. Pivotal products are covered by + * one or more patents listed at http://www.pivotal.io/patents. + *========================================================================= + */ +package com.gemstone.gemfire.modules; + +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.Region.Entry; +import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; +import com.gemstone.gemfire.modules.Owner.Status; +import com.gemstone.gemfire.test.junit.categories.IntegrationTest; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.AnnotationConfiguration; +import org.hibernate.cfg.Configuration; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.logging.Level; + +import static org.junit.Assert.assertEquals; + +@Category(IntegrationTest.class) +public class HibernateJUnitTest { + + private Logger log = LoggerFactory.getLogger(getClass()); + + //private static final String jdbcURL = "jdbc:hsqldb:hsql://localhost/test"; + private static final String jdbcURL = "jdbc:hsqldb:mem:test"; + + static File tmpDir; + + static String gemfireLog; + + @Before + public void setUp() throws Exception { + // Create a per-user scratch directory + tmpDir = new File(System.getProperty("java.io.tmpdir"), + "gemfire_modules-" + System.getProperty("user.name")); + tmpDir.mkdirs(); + tmpDir.deleteOnExit(); + + gemfireLog = tmpDir.getPath() + + System.getProperty("file.separator") + "gemfire_modules.log"; + } + + public static SessionFactory getSessionFactory(Properties overrideProps) { + System.setProperty("gemfire.home", "GEMFIREHOME"); + Configuration cfg = new Configuration(); + cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); + cfg.setProperty("hibernate.connection.driver_class", + "org.hsqldb.jdbcDriver"); + // cfg.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test"); + cfg.setProperty("hibernate.connection.url", jdbcURL); + cfg.setProperty("hibernate.connection.username", "sa"); + cfg.setProperty("hibernate.connection.password", ""); + cfg.setProperty("hibernate.connection.pool_size", "1"); + cfg.setProperty("hibernate.connection.autocommit", "true"); + cfg.setProperty("hibernate.hbm2ddl.auto", "update"); + + cfg.setProperty("hibernate.cache.region.factory_class", + "com.gemstone.gemfire.modules.hibernate.GemFireRegionFactory"); + cfg.setProperty("hibernate.show_sql", "true"); + cfg.setProperty("hibernate.cache.use_query_cache", "true"); + //cfg.setProperty("gemfire.mcast-port", AvailablePort.getRandomAvailablePort(AvailablePort.JGROUPS)+""); + cfg.setProperty("gemfire.mcast-port", "0"); + cfg.setProperty("gemfire.statistic-sampling-enabled", "true"); + cfg.setProperty("gemfire.log-file", gemfireLog); + cfg.setProperty("gemfire.writable-working-dir", tmpDir.getPath()); + //cfg.setProperty("gemfire.statistic-archive-file", "plugin-stats-file.gfs"); + //cfg.setProperty("gemfire.default-client-region-attributes-id", "CACHING_PROXY"); + //cfg.setProperty("gemfire.cache-topology", "client-server"); + //cfg.setProperty("gemfire.locators", "localhost[5432]"); + //cfg.setProperty("gemfire.log-level", "fine"); + // cfg.setProperty("", ""); + cfg.addClass(Person.class); + cfg.addClass(Event.class); + if (overrideProps != null) { + Iterator it = overrideProps.keySet().iterator(); + while (it.hasNext()) { + String key = (String)it.next(); + cfg.setProperty(key, overrideProps.getProperty(key)); + } + } + return cfg.buildSessionFactory(); + } + + @Test + public void testpreload() { + log.info("SWAP:creating session factory In hibernateTestCase"); + + Session session = getSessionFactory(null).openSession(); + log.info("SWAP:session opened"); + session.beginTransaction(); + Event theEvent = new Event(); + theEvent.setTitle("title"); + theEvent.setDate(new Date()); + session.save(theEvent); + Long id = theEvent.getId(); + session.getTransaction().commit(); + session.beginTransaction(); + Event ev = (Event)session.get(Event.class, id); + log.info("SWAP:load complete: " + ev); + session.getTransaction().commit(); + } + + @Test + public void testNothing() throws Exception { + java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.ALL); + log.info("SWAP:creating session factory In hibernateTestCase"); + + Session session = getSessionFactory(null).openSession(); + log.info("SWAP:session opened"); + // session.setFlushMode(FlushMode.COMMIT); + session.beginTransaction(); + Event theEvent = new Event(); + theEvent.setTitle("title"); + theEvent.setDate(new Date()); + //session.save(theEvent); + session.persist(theEvent); + Long id = theEvent.getId(); + session.getTransaction().commit(); + log.info("commit complete...doing load"); + session.beginTransaction(); + Event ev = (Event)session.load(Event.class, id); + log.info("load complete: " + ev); + log.trace("SWAP"); + ev.setTitle("newTitle"); + session.save(ev); + log.info("commit"); + session.getTransaction().commit(); + log.info("save complete " + ev); + + session.beginTransaction(); + ev = (Event)session.load(Event.class, id); + log.info("load complete: " + ev); + ev.setTitle("newTitle2"); + session.save(ev); + log.info("commit"); + session.getTransaction().commit(); + log.info("save complete " + ev); + + ev = (Event)session.load(Event.class, id); + log.info("second load " + ev); + session.flush(); + session.close(); + log.info("flush complete session:" + session); + + for (int i=0; i<5; i++) { + session = getSessionFactory(null).openSession(); + log.info("doing get "+id); + // ev = (Event) session.load(Event.class, id); + ev = (Event)session.get(Event.class, id); + log.info("third load " + ev); + } + printExistingDB(); + Iterator it = GemFireCacheImpl.getInstance().rootRegions().iterator(); + while (it.hasNext()) { + Region r = (Region)it.next(); + System.out.println("Region:"+r); + Iterator enIt = r.entrySet().iterator(); + while (enIt.hasNext()) { + Region.Entry re = (Entry)enIt.next(); + System.out.println("key:"+re.getKey()+" value:"+re.getValue()); + } + } + Thread.sleep(3000); + //System.in.read(); + // try direct data + + } + + public void _testInvalidation() { + Session s = getSessionFactory(null).openSession(); + } + + static Long personId; + + @Test + public void testRelationship() throws Exception { + //java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.ALL); + Properties props = new Properties(); + props.put("gemfire.topology", "client-server"); + Session session = getSessionFactory(null).openSession(); + session.beginTransaction(); + + Person thePerson = new Person(); + thePerson.setFirstname("foo"); + thePerson.setLastname("bar"); + thePerson.setAge(1); + thePerson.setId(99L); + session.save(thePerson); + personId = thePerson.getId(); + log.info("person saved"); + + Event theEvent = new Event(); + theEvent.setTitle("title"); + theEvent.setDate(new Date()); + session.save(theEvent); + Long eventId = theEvent.getId(); + log.info("event saved"); + + Event theEvent2 = new Event(); + theEvent2.setTitle("title2"); + theEvent2.setDate(new Date()); + session.save(theEvent2); + Long eventId2 = theEvent2.getId(); + log.info("event2 saved"); + session.getTransaction().commit(); + + session.beginTransaction(); + Person aPerson = (Person) session.load(Person.class, personId); + Event anEvent = (Event) session.load(Event.class, eventId); + Event anEvent2 = (Event) session.load(Event.class, eventId2); + log.info("adding event to person"); + aPerson.getE().add(anEvent); + aPerson.getE().add(anEvent2); + log.info("calling commit"); + + session.getTransaction().commit(); + log.info("commit complete"); + session.close(); + log.info("opening new session"); + session = getSessionFactory(null).openSession(); + log.info("SWAP:loading person"); + aPerson = (Person)session.load(Person.class, personId); + log.info("loading events"); + Iterator<Event> e = aPerson.getE().iterator(); + while (e.hasNext()) { + e.next(); + } + session.close(); + log.info("opening new session"); + session = getSessionFactory(null).openSession(); + log.info("SWAP:loading person"); + aPerson = (Person)session.load(Person.class, personId); + log.info("loading events"); + e = aPerson.getE().iterator(); + while (e.hasNext()) { + e.next(); + } + + log.info(aPerson.getE()+""); + session.close(); + //System.in.read(); +// log.info("opening third session"); +// session = getSessionFactory().openSession(); +// log.info("loading person"); +// aPerson = (Person)session.load(Person.class, personId); +// log.info("loading events"); +// log.info(aPerson.getEvents()+""); + } + + public void _testQueryCache() throws Exception { + Session session = getSessionFactory(null).openSession(); + Query q = session.createQuery("from Event"); + q.setCacheable(true); + List l = q.list(); + log.info("list:"+l); +// log.info("Sleeping for 10 seconds"); +// Thread.sleep(10000); + l = q.list(); + log.info("list2:"+l); + log.info("updating an event"); + session.beginTransaction(); + Event e = (Event)l.get(0); + e.setDate(new Date()); + session.saveOrUpdate(e); + session.getTransaction().commit(); + l = q.list(); + log.info("list3:"+l); + } + + @Test + public void testInsert() { + Session session = getSessionFactory(null).openSession(); + Region r = GemFireCacheImpl.getExisting().getRegion(Person.class.getCanonicalName()); + int initSize = r.size(); + session.beginTransaction(); + log.info("SWAP: Saving Person"); + Person p = new Person(); + p.setId(10L); + p.setFirstname("foo"); + p.setLastname("bar"); + session.saveOrUpdate("Person", p); + session.getTransaction().commit(); + assertEquals(1, session.getStatistics().getEntityCount()); + assertEquals(initSize+1, r.size()); + + session.beginTransaction(); + p.setAge(1); + session.saveOrUpdate(p); + session.getTransaction().commit(); + assertEquals(1, session.getStatistics().getEntityCount()); + } + + @Test + public void testNormalRegion() { + Properties props = new Properties(); + props.setProperty("gemfire.default-region-attributes-id", "LOCAL"); + Session session = getSessionFactory(props).openSession(); + session.beginTransaction(); + Event theEvent = new Event(); + theEvent.setTitle("title"); + theEvent.setDate(new Date()); + session.save(theEvent); + Long id = theEvent.getId(); + session.getTransaction().commit(); + session.beginTransaction(); + Event ev = (Event)session.load(Event.class, id); + ev.setTitle("newTitle"); + session.save(ev); + session.getTransaction().commit(); + } + + private void printExistingDB() throws SQLException { + try { + Class.forName("org.hsqldb.jdbc.JDBCDriver"); + } + catch (Exception e) { + System.err.println("ERROR: failed to load HSQLDB JDBC driver."); + e.printStackTrace(); + return; + } + + Connection c = DriverManager.getConnection(jdbcURL, "SA", ""); + log.info("issuing query..."); + ResultSet rs = c.createStatement().executeQuery("select * from events"); + int col = rs.getMetaData().getColumnCount(); + while (rs.next()) { + StringBuilder b = new StringBuilder(); + for (int i = 1; i <= col; i++) { + b.append(" col:" + i + ":" + rs.getString(i)); + } + log.info("Query result:" + b.toString()); + } + } + + @Test + public void testEnum() { + AnnotationConfiguration cfg = new AnnotationConfiguration(); + cfg.addAnnotatedClass(Owner.class); + cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); + cfg.setProperty("hibernate.connection.driver_class", + "org.hsqldb.jdbcDriver"); + cfg.setProperty("hibernate.connection.url", jdbcURL); + cfg.setProperty("hibernate.connection.username", "sa"); + cfg.setProperty("hibernate.connection.password", ""); + cfg.setProperty("hibernate.connection.pool_size", "1"); + cfg.setProperty("hibernate.connection.autocommit", "true"); + cfg.setProperty("hibernate.hbm2ddl.auto", "update"); + + cfg.setProperty("hibernate.cache.region.factory_class", + "com.gemstone.gemfire.modules.hibernate.GemFireRegionFactory"); + cfg.setProperty("hibernate.show_sql", "true"); + cfg.setProperty("hibernate.cache.use_query_cache", "true"); + cfg.setProperty("gemfire.statistic-sampling-enabled", "true"); + cfg.setProperty("gemfire.log-file", gemfireLog); + cfg.setProperty("gemfire.writable-working-dir", tmpDir.getPath()); + cfg.setProperty("gemfire.mcast-port", "0"); + //cfg.setProperty("gemfire.cache-topology", "client-server"); + + SessionFactory sf = cfg.buildSessionFactory(); + Session session = sf.openSession(); + session.beginTransaction(); + Owner o = new Owner(); + o.setAddress("addr"); + o.setCity("pdx"); + o.setStatus(Status.PREMIUM); + session.save(o); + long id = o.getId(); + log.info("testEnum:commiting tx"); + session.getTransaction().commit(); + session.close(); + + session = sf.openSession(); + Owner o1 = (Owner) session.load(Owner.class, id); + log.info("loaded:"+o); + assertEquals(o.getAddress(), o1.getAddress()); + assertEquals(o.getCity(), o1.getCity()); + assertEquals(o.getStatus(), o1.getStatus()); + o1.setAddress("address2"); + session.save(o1); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Owner.java ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Owner.java b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Owner.java new file mode 100644 index 0000000..3701711 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Owner.java @@ -0,0 +1,177 @@ +/*========================================================================= + * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. + * This product is protected by U.S. and international copyright + * and intellectual property laws. Pivotal products are covered by + * one or more patents listed at http://www.pivotal.io/patents. + *========================================================================= + */ +package com.gemstone.gemfire.modules; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hibernate.annotations.Entity; + + +/** + * Simple JavaBean domain object representing an owner. + * + * @author Ken Krebs + * @author Juergen Hoeller + * @author Sam Brannen + */ [email protected] +@Entity +public class Owner { + private static final long serialVersionUID = 4315791692556052565L; + + @Column(name="address") + private String address; + + private String city; + + private String telephone; + +// private Set<Pet> pets; + @Id + @GeneratedValue + private Long id; + + private long versionNum = -1; + + public enum Status { + NORMAL, PREMIUM + }; + + @Enumerated + private Status status = Status.NORMAL; + + private void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public String getAddress() { + return this.address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return this.city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTelephone() { + return this.telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public long getVersionNum() { + return versionNum; + } + + public void setVersionNum(long versionNum) { + this.versionNum = versionNum; + } + + public Status getStatus() { + return this.status; + } + + public void setStatus(Status state) { + if (state != null) { + this.status = state; + } + } + +// protected void setPetsInternal(Set<Pet> pets) { +// this.pets = pets; +// } +// +// protected Set<Pet> getPetsInternal() { +// if (this.pets == null) { +// this.pets = new HashSet<Pet>(); +// } +// return this.pets; +// } +// +// public List<Pet> getPets() { +// List<Pet> sortedPets = new ArrayList<Pet>(getPetsInternal()); +// PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", +// true, true)); +// return Collections.unmodifiableList(sortedPets); +// } +// +// public void addPet(Pet pet) { +// getPetsInternal().add(pet); +// pet.setOwner(this); +// } +// +// /** +// * Return the Pet with the given name, or null if none found for this Owner. +// * +// * @param name +// * to test +// * @return true if pet name is already in use +// */ +// public Pet getPet(String name) { +// return getPet(name, false); +// } +// +// /** +// * Return the Pet with the given name, or null if none found for this Owner. +// * +// * @param name +// * to test +// * @return true if pet name is already in use +// */ +// public Pet getPet(String name, boolean ignoreNew) { +// name = name.toLowerCase(); +// for (Pet pet : getPetsInternal()) { +// if (!ignoreNew || !pet.isNew()) { +// String compName = pet.getName(); +// compName = compName.toLowerCase(); +// if (compName.equals(name)) { +// return pet; +// } +// } +// } +// return null; +// } +// +// @Override +// public String toString() { +// return new ToStringCreator(this).append("id", this.getId()) +// .append("new", this.isNew()) +// .append("lastName", this.getLastName()) +// .append("firstName", this.getFirstName()) +// .append("address", this.address).append("city", this.city) +// .append("telephone", this.telephone) +// .append("version", this.versionNum) +// .append("status", this.status) +// +// .toString(); +// } +} + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Person.java ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Person.java b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Person.java new file mode 100644 index 0000000..14e6294 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/Person.java @@ -0,0 +1,63 @@ +/*========================================================================= + * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. + * This product is protected by U.S. and international copyright + * and intellectual property laws. Pivotal products are covered by + * one or more patents listed at http://www.pivotal.io/patents. + *========================================================================= + */ +package com.gemstone.gemfire.modules; + +import java.util.HashSet; +import java.util.Set; + +public class Person { + private Long id; + private int age; + private String firstname; + private String lastname; + + private Set<Event> e = new HashSet<Event>(); + + public Person() {} + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setAge(int age) { + this.age = age; + } + + public int getAge() { + return age; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getFirstname() { + return firstname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getLastname() { + return lastname; + } + + public void setE(Set<Event> events) { + this.e = events; + } + + public Set<Event> getE() { + return e; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/SecondVMTest.java ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/SecondVMTest.java b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/SecondVMTest.java new file mode 100644 index 0000000..1eb164b --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/java/com/gemstone/gemfire/modules/SecondVMTest.java @@ -0,0 +1,79 @@ +/*========================================================================= + * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. + * This product is protected by U.S. and international copyright + * and intellectual property laws. Pivotal products are covered by + * one or more patents listed at http://www.pivotal.io/patents. + *========================================================================= + */ +package com.gemstone.gemfire.modules; + +import java.io.IOException; +import java.util.Iterator; +import java.util.Properties; +import java.util.logging.Level; + +import junit.framework.TestCase; + +import org.hibernate.Session; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.CacheFactory; +import com.gemstone.gemfire.cache.GemFireCache; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.Region.Entry; +import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; + +public class SecondVMTest extends TestCase { + + private Logger log = LoggerFactory.getLogger(getClass()); + + public void testNoop() { + + } + public void _testStartEmptyVM() throws IOException { + Properties gemfireProperties = new Properties(); + gemfireProperties.setProperty("mcast-port", "5555"); + gemfireProperties.setProperty("log-level", "fine"); + Cache cache = new CacheFactory(gemfireProperties).create(); + System.in.read(); + Iterator it = cache.rootRegions().iterator(); + while (it.hasNext()) { + Region r = (Region)it.next(); + System.out.println("Region:"+r); + Iterator enIt = r.entrySet().iterator(); + while (enIt.hasNext()) { + Region.Entry re = (Entry)enIt.next(); + System.out.println("key:"+re.getKey()+" value:"+re.getValue()); + } + } + } + + public void _testStartVM() throws Exception { + java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.ALL); + Session session = HibernateJUnitTest.getSessionFactory(null).openSession(); + log.info("SWAP:new session open"); + long id = 1; + log.info("loading new person:"+(id)); + GemFireCache cache = GemFireCacheImpl.getInstance(); + Iterator<Region<?, ?>> rSet = cache.rootRegions().iterator(); + while (rSet.hasNext()) { + Region<?, ?> r = rSet.next(); + log.info("SWAP:Region "+r); + Iterator<?> keySet = r.keySet().iterator(); + while (keySet.hasNext()) { + log.info("key:"+keySet.next()); + } + } + log.info("loading new person:"+(id)); + session.beginTransaction(); + Person p = (Person)session.load(Person.class, id); + p.setFirstname("SecondVMfirstname"+id); + log.info("loading events"); + log.info(p.getE()+""); + session.getTransaction().commit(); + //System.in.read(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Event.hbm.xml ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Event.hbm.xml b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Event.hbm.xml new file mode 100644 index 0000000..17faf29 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Event.hbm.xml @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="com.gemstone.gemfire.modules"> + <class name="Event" table="EVENTS"> + <cache usage="read-write"/> + <id name="id" column="EVENT_ID"> + <generator class="native"/> + </id> + <version name="version"/> + <property name="date" type="timestamp" column="EVENT_DATE"/> + <property name="title"/> + </class> +</hibernate-mapping> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Person.hbm.xml ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Person.hbm.xml b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Person.hbm.xml new file mode 100644 index 0000000..a4810d7 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/resources/com/gemstone/gemfire/modules/Person.hbm.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> + +<hibernate-mapping package="com.gemstone.gemfire.modules"> + <class name="Person" table="PERSON"> + <cache usage="read-write"/> + <id name="id" column="PERSON_ID"> + </id> + <property name="age"/> + <property name="firstname"/> + <property name="lastname"/> + <set name="e" table="PERSON_EVENT"> + <cache usage="read-write"/> + <key column="PERSON_ID"/> + <many-to-many column="EVENT_ID" class="Event"/> + </set> + </class> +</hibernate-mapping> http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/resources/log4j.properties b/extensions/gemfire-modules-hibernate/src/test/resources/log4j.properties new file mode 100644 index 0000000..c136990 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/resources/log4j.properties @@ -0,0 +1,16 @@ +# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! +# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J. +#log4j.rootLogger=DEBUG, stdout, logfile +log4j.rootLogger=DEBUG, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +#log4j.appender.logfile=org.apache.log4j.RollingFileAppender +#log4j.appender.logfile.MaxFileSize=512KB +## Keep three backup files. +#log4j.appender.logfile.MaxBackupIndex=3 +## Pattern to output: date priority [category] - message +#log4j.appender.logfile.layout=org.apache.log4j.PatternLayout +#log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-hibernate/src/test/resources/tomcat/conf/tomcat-users.xml ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-hibernate/src/test/resources/tomcat/conf/tomcat-users.xml b/extensions/gemfire-modules-hibernate/src/test/resources/tomcat/conf/tomcat-users.xml new file mode 100644 index 0000000..6c9f217 --- /dev/null +++ b/extensions/gemfire-modules-hibernate/src/test/resources/tomcat/conf/tomcat-users.xml @@ -0,0 +1,3 @@ +<?xml version='1.0' encoding='utf-8'?> +<tomcat-users> +</tomcat-users> http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules-tomcat7/build.gradle ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules-tomcat7/build.gradle b/extensions/gemfire-modules-tomcat7/build.gradle index 34dc7ef..7750069 100644 --- a/extensions/gemfire-modules-tomcat7/build.gradle +++ b/extensions/gemfire-modules-tomcat7/build.gradle @@ -22,10 +22,16 @@ test { into 'build/test/tomcat/' } } + + testLogging { + events 'passed', 'skipped', 'failed' + exceptionFormat = 'full' + } } dependencies { compile(project(':extensions/gemfire-modules')) { + // Remove everything related to Tomcat 6.x exclude group: 'org.apache.tomcat' } @@ -33,9 +39,19 @@ dependencies { compile 'org.apache.tomcat:tomcat-catalina:' + project.'tomcat7.version' compile 'org.apache.tomcat:tomcat-coyote:' + project.'tomcat7.version' compile 'org.apache.tomcat:tomcat-util:' + project.'tomcat7.version' + compile 'org.apache.tomcat:tomcat-juli:' + project.'tomcat7.version' testCompile 'org.httpunit:httpunit:' + project.'httpunit.version' + testRuntime 'javax.servlet:javax.servlet-api:3.1.0' + testRuntime 'javax.annotation:jsr250-api:1.0' + testRuntime 'javax.ejb:ejb-api:3.0' + testRuntime 'javax.persistence:persistence-api:1.0.2' - provided project(path: ':extensions/gemfire-modules', configuration: 'testOutput') + provided(project(path: ':extensions/gemfire-modules', configuration: 'testOutput')) { + // Remove everything related to Tomcat 6.x + exclude group: 'org.apache.tomcat', module: 'catalina' + exclude group: 'org.apache.tomcat', module: 'catalina-ha' + exclude group: 'org.apache.tomcat', module: 'juli' + } provided project(path: ':gemfire-junit', configuration: 'testOutput') } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules/build.gradle ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules/build.gradle b/extensions/gemfire-modules/build.gradle index 7e6a4bd..6a44cff 100644 --- a/extensions/gemfire-modules/build.gradle +++ b/extensions/gemfire-modules/build.gradle @@ -22,6 +22,11 @@ test { into 'build/test/tomcat/' } } + + testLogging { + events 'passed', 'skipped', 'failed' + exceptionFormat = 'full' + } } dependencies { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/extensions/gemfire-modules/src/test/java/com/gemstone/gemfire/modules/session/TestSessionsBase.java ---------------------------------------------------------------------- diff --git a/extensions/gemfire-modules/src/test/java/com/gemstone/gemfire/modules/session/TestSessionsBase.java b/extensions/gemfire-modules/src/test/java/com/gemstone/gemfire/modules/session/TestSessionsBase.java index 57783f3..4b7ab87 100644 --- a/extensions/gemfire-modules/src/test/java/com/gemstone/gemfire/modules/session/TestSessionsBase.java +++ b/extensions/gemfire-modules/src/test/java/com/gemstone/gemfire/modules/session/TestSessionsBase.java @@ -483,7 +483,7 @@ public abstract class TestSessionsBase { Long lastAccess = (Long) session.getAttribute("lastAccessTime"); assertTrue( - "Last access time not set correctly: " + lastAccess.longValue() + " not < " + session.getLastAccessedTime(), - lastAccess.longValue() < session.getLastAccessedTime()); + "Last access time not set correctly: " + lastAccess.longValue() + " not <= " + session.getLastAccessedTime(), + lastAccess.longValue() <= session.getLastAccessedTime()); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/build.gradle ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/build.gradle b/modules/gemfire-modules-hibernate/build.gradle deleted file mode 100644 index 6cd120a..0000000 --- a/modules/gemfire-modules-hibernate/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -test { - include '**/HibernateTestCase.class' - include '**/SecondVMTest.class' - - testLogging { - exceptionFormat = 'full' - } -} - -dependencies { - compile project(':gemfire-modules') - compile 'org.hibernate:hibernate-core:3.5.0-Final' - compile 'org.hibernate:hibernate-annotations:3.5.5-Final' - - testRuntime 'org.slf4j:slf4j-jdk14:1.7.7' - testRuntime 'org.hsqldb:hsqldb:2.0.0' - testRuntime 'org.javassist:javassist:3.13.0-GA' -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/pom.xml ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/pom.xml b/modules/gemfire-modules-hibernate/pom.xml deleted file mode 100644 index 19241b7..0000000 --- a/modules/gemfire-modules-hibernate/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.gemstone</groupId> - <artifactId>gemfire-modules-hibernate</artifactId> - <version>${gemfire.modules.version}</version> - <packaging>jar</packaging> - - <name>gemfire-modules-hibernate</name> - <url>http://maven.apache.org</url> - - <parent> - <groupId>com.gemstone</groupId> - <artifactId>gemfire-modules-parent</artifactId> - <version>1.0-SNAPSHOT</version> - </parent> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - </dependency> - <dependency> - <groupId>org.apache.tomcat</groupId> - <artifactId>catalina</artifactId> - </dependency> - <dependency> - <groupId>org.apache.tomcat</groupId> - <artifactId>catalina-ha</artifactId> - <version>${tomcat.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.gemstone.gemfire</groupId> - <artifactId>gemfire</artifactId> - </dependency> - <dependency> - <groupId>com.gemstone</groupId> - <artifactId>gemfire-modules</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-core</artifactId> - <version>3.5.0-Final</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <version>2.0.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.javassist</groupId> - <artifactId>javassist</artifactId> - <version>3.13.0-GA</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-jdk14</artifactId> - </dependency> - <dependency> - <groupId>org.apache.tomcat</groupId> - <artifactId>coyote</artifactId> - </dependency> - <dependency> - <groupId>org.httpunit</groupId> - <artifactId>httpunit</artifactId> - </dependency> - <dependency> - <groupId>rhino</groupId> - <artifactId>js</artifactId> - </dependency> - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-annotations</artifactId> - <version>3.5.5-Final</version> - <scope>provided</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.7.2</version> - <configuration> - <includes> - <include>**/HibernateTestCase.java</include> - <include>**/SecondVMTest.java</include> - </includes> - <runOrder>alphabetical</runOrder> - </configuration> - </plugin> - </plugins> - </build> -</project> http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/EnumType.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/EnumType.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/EnumType.java deleted file mode 100644 index 86153ed..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/EnumType.java +++ /dev/null @@ -1,49 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import java.io.Serializable; - -import org.hibernate.HibernateException; - -/** - * Extends {@link org.hibernate.type.EnumType} so as to - * override methods responsible for cached representation - * of enums in hibernate. - * This class must be used in place of {@link org.hibernate.type.EnumType} - * in client-server topology when the application classes are - * not available on the server. - * e.g. a typical enum configuration should look like this: - * <pre> - * <property name="myEnum"> - * <type name="<b>com.gemstone.gemfire.modules.hibernate.EnumType</b>"> - * <param name="enumClass">com.mycompany.MyEntity$MyEnum</param> - * <param name="type">12</param> - * </type> - * </property> - * </pre> - * @author sbawaska - */ -public class EnumType extends org.hibernate.type.EnumType { - - private static final long serialVersionUID = 3414902482639744676L; - - @Override - public Object assemble(Serializable cached, Object owner) - throws HibernateException { - String name = (String) cached; - Class<? extends Enum> clazz = returnedClass(); - return Enum.valueOf(clazz, name); - } - - @Override - public Serializable disassemble(Object value) throws HibernateException { - return ((Enum)value).name(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCache.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCache.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCache.java deleted file mode 100644 index 119e137..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCache.java +++ /dev/null @@ -1,229 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import java.util.Map; - -import org.hibernate.cache.Cache; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.Timestamper; - -import com.gemstone.gemfire.cache.EntryNotFoundException; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.Scope; -import com.gemstone.gemfire.distributed.DistributedLockService; -import com.gemstone.gemfire.internal.cache.LocalRegion; - -public class GemFireCache implements Cache { - private Region region; - - private boolean clientRegion = false; - - private final DistributedLockService distributedLockService; - - public GemFireCache(Region region, DistributedLockService lockService) { - this.region = region; - this.distributedLockService = lockService; - this.clientRegion = isClient(region); - } - - private boolean isClient(Region region) { - return region.getAttributes().getPoolName() != null; - } - - /** - * Clear the cache - */ - public void clear() throws CacheException { - GemFireCacheProvider.getLogger().info("GemFireCache: clear called"); - region.clear(); - } - - /** - * Clean up - */ - public void destroy() throws CacheException { - GemFireCacheProvider.getLogger().info("GemFireCache: destroy called"); - region.localDestroyRegion(); - } - - /** - * Get an item from the cache - * - * @param key - * @return the cached object or <tt>null</tt> - * @throws CacheException - */ - public Object get(Object key) throws CacheException { - GemFireCacheProvider.getLogger().debug( - "GemFireCache: get called for: " + key); - try { - Object value = region.get(key); - GemFireCacheProvider.getLogger().debug( - "GemFireCache: retrieved: " + key + "-->" + value); - return value; - } - catch (com.gemstone.gemfire.cache.CacheException e) { - throw new CacheException(e); - } - } - - /** - * The count of entries currently contained in the regions in-memory store. - * - * @return The count of entries in memory; -1 if unknown or unsupported. - */ - public long getElementCountInMemory() { - return ((LocalRegion)region).entryCount(); - } - - /** - * The count of entries currently contained in the regions disk store. - * - * @return The count of entries on disk; -1 if unknown or unsupported. - */ - public long getElementCountOnDisk() { - return -1; - } - - /** - * Get the name of the cache region - */ - public String getRegionName() { - return region.getName(); - } - - /** - * The number of bytes is this cache region currently consuming in memory. - * - * @return The number of bytes consumed by this region; -1 if unknown or - * unsupported. - */ - public long getSizeInMemory() { - return -1; - } - - /** - * Return the lock timeout for this cache. - */ - public int getTimeout() { - GemFireCacheProvider.getLogger().debug("GemFireCache: getTimeout"); - return Timestamper.ONE_MS * 60000; - } - - /** - * If this is a clustered cache, lock the item - */ - public void lock(Object key) throws CacheException { - GemFireCacheProvider.getLogger().info( - "GemFireCache: lock called for: " + key); - - if (!clientRegion) { - // If we're using GLOBAL scope, we don't have to worry about - // locking. - if (!Scope.GLOBAL.equals(region.getAttributes().getScope())) { - this.distributedLockService.lock(key, -1, -1); - } - } - else { - // We assume the server region is GLOBAL for now. Else, use command - // pattern to acquire lock on the server - GemFireCacheProvider.getLogger().info( - "GemFireCache: client region, ignoring lock : " + key); - } - } - - /** - * Generate the next timestamp - */ - public long nextTimestamp() { - GemFireCacheProvider.getLogger().debug("GemFireCache: nextTimestamp called"); - // TODO : Need a counter, cache-wide - return Timestamper.next(); - } - - /** - * Add an item to the cache - * - * @param key - * @param value - * @throws CacheException - */ - public void put(Object key, Object value) throws CacheException { - GemFireCacheProvider.getLogger().debug( - "GemFireCache: put called for key: " + key + "value: " + value); - try { - region.put(key, value); - GemFireCacheProvider.getLogger().debug( - "GemFireCache: put " + key + "-->" + value); - } - catch (com.gemstone.gemfire.cache.CacheException e) { - throw new CacheException(e); - } - } - - public Object read(Object key) throws CacheException { - GemFireCacheProvider.getLogger().info( - "GemFireCache: read called for: " + key); - return region.get(key); - } - - /** - * Remove an item from the cache - */ - public void remove(Object key) throws CacheException { - GemFireCacheProvider.getLogger().debug( - "GemFireCache: remove called for: " + key); - try { - region.destroy(key); - GemFireCacheProvider.getLogger().debug("GemFireCache: removed: " + key); - } - catch (EntryNotFoundException e) { - // We can silently ignore this - } - catch (com.gemstone.gemfire.cache.CacheException e) { - throw new CacheException(e); - } - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("Hibernate cache on GemFire region: "); - buffer.append(region); - return buffer.toString(); - } - - /** - * If this is a clustered cache, unlock the item - */ - public void unlock(Object key) throws CacheException { - GemFireCacheProvider.getLogger().info( - "GemFireCache: unlock called for: " + key); - - if (!clientRegion) { - // If we're using GLOBAL scope, we don't have to worry about locking. - if (!Scope.GLOBAL.equals(region.getAttributes().getScope())) { - this.distributedLockService.unlock(key); - } - } - else { - GemFireCacheProvider.getLogger().info( - "GemFireCache: client region, ignoring lock : " + key); - } - } - - public void update(Object key, Object value) throws CacheException { - GemFireCacheProvider.getLogger().info( - "GemFireCache: update called for: " + key); - this.region.put(key, value); - } - - public Map<?, ?> toMap() { - return null; - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheListener.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheListener.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheListener.java deleted file mode 100644 index fb6db2d..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheListener.java +++ /dev/null @@ -1,45 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import java.util.Properties; - -import com.gemstone.gemfire.cache.Declarable; -import com.gemstone.gemfire.cache.EntryEvent; -import com.gemstone.gemfire.cache.util.CacheListenerAdapter; - -public class GemFireCacheListener extends CacheListenerAdapter implements - Declarable { - - @Override - public void afterCreate(EntryEvent event) { - System.out.println("Create : " + event.getKey() + " / " - + event.getNewValue()); - } - - @Override - public void afterDestroy(EntryEvent event) { - System.out.println("Destroy : " + event.getKey()); - } - - @Override - public void afterInvalidate(EntryEvent event) { - System.out.println("Invalidate : " + event.getKey()); - } - - @Override - public void afterUpdate(EntryEvent event) { - System.out.println("Update : " + event.getKey() + " / " - + event.getNewValue()); - } - - public void init(Properties props) { - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheProvider.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheProvider.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheProvider.java deleted file mode 100644 index 9e38d7f..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireCacheProvider.java +++ /dev/null @@ -1,191 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.RegionShortcut; -import com.gemstone.gemfire.cache.execute.FunctionService; -import com.gemstone.gemfire.distributed.DistributedLockService; -import com.gemstone.gemfire.internal.logging.LogService; -import com.gemstone.gemfire.modules.util.CreateRegionFunction; -import com.gemstone.gemfire.modules.util.RegionConfiguration; -import org.apache.logging.log4j.Logger; -import org.hibernate.cache.Cache; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.CacheProvider; -import org.hibernate.cache.Timestamper; - -import java.util.Iterator; -import java.util.Properties; - -@SuppressWarnings("deprecation") -public class GemFireCacheProvider implements CacheProvider { - - private static final Logger logger = LogService.getLogger(); - - protected com.gemstone.gemfire.cache.Cache _cache; - - private DistributedLockService distributedLockService; - - private Properties regionAttributes = new Properties(); - - private final String DEFAULT_REGION_TYPE = RegionShortcut.REPLICATE_HEAP_LRU - .name(); - - private final String HIBERNATE_DLOCK_SERVICE_NAME = "hibernate-cache-lock-service"; - /** - * Configure the cache - * - * @param regionName - * the name of the cache region - * @param properties - * configuration settings - * @throws CacheException - */ - public Cache buildCache(String regionName, Properties properties) - throws CacheException { - logger.info("GemFireCacheProvider: Creating cache: " + regionName); - Region region = retrieveOrCreateRegion(regionName); - Cache cache = null; - if (region == null) { - // Doh, blow up - throw new RuntimeException("Couldn't find cache region : " + regionName); - } - else { - cache = new GemFireCache(region, this.distributedLockService); - } - logger.info("GemFireCacheProvider: Created cache: " + regionName + "->" + cache); - return cache; - } - - public boolean isMinimalPutsEnabledByDefault() { - return false; - } - - /** - * Generate a timestamp - */ - public long nextTimestamp() { - return Timestamper.next(); - } - - /** - * Returns the region if already created, otherwise first tries to create it - * from cache.xml, if not specified in cache.xml, create the region from the - * properties specified in hibernate.cfg.xml. Two types of properties can be - * specified in hibernate.cfg.xml - * <ol> - * <li>gemfire.default-region-attributes-id: the default region type to - * create. (default value for this is REPLICATE) - * <li>gemfire.region-attributes-for:fullyQualifiedRegionName when a region - * wants to override the default region type - * </ol> - * - * @param regionName - * @return the region - */ - protected Region retrieveOrCreateRegion(String regionName) { - // TODO client regions - Region r = _cache.getRegion(regionName); - if (r == null) { - String regionType = getRegionType(regionName); - r = _cache.createRegionFactory(RegionShortcut.valueOf(regionType)) - .create(regionName); - RegionConfiguration regionConfig = new RegionConfiguration(); - regionConfig.setRegionName(regionName); - regionConfig.setRegionAttributesId(regionType); - FunctionService.onMembers(_cache.getDistributedSystem()) - .withArgs(regionConfig).execute(CreateRegionFunction.ID).getResult(); - } - return r; - } - - /** - * returns the type of region to create by consulting the properties specified - * in hibernate.cfg.xml - * - * @see #retrieveOrCreateRegion(String) - * @param regionName - * @return string representation of {@link RegionShortcut} - */ - private String getRegionType(String regionName) { - String rType = regionAttributes - .getProperty("gemfire.default-region-attributes-id"); - if (rType == null) { - rType = DEFAULT_REGION_TYPE; - } - // iterate to find overridden property for a region - Iterator<Object> it = regionAttributes.keySet().iterator(); - while (it.hasNext()) { - String current = (String)it.next(); - if (current.contains(regionName)) { - rType = regionAttributes.getProperty(current); - break; - } - } - return rType.toUpperCase(); - } - - /** - * Callback to perform any necessary initialization of the underlying cache - * implementation during SessionFactory construction. - * - * @param properties - * current configuration settings. - */ - public void start(Properties properties) throws CacheException { - logger.info("GemFireCacheProvider: Creating cache provider"); - - // We have to strip out any unknown properties, do so here - Properties gemfireOnlyProperties = new Properties(); - for (Object keyObj : properties.keySet()) { - String key = (String)keyObj; - if (key.contains("region-attributes")) { - regionAttributes.put(key, properties.get(key)); - } - else if (key.startsWith("gemfire.")) { - gemfireOnlyProperties.setProperty(key.replace("gemfire.", ""), - properties.getProperty(key)); - } - } - - // Create cache and d-lock service - try { - _cache = new CacheFactory(gemfireOnlyProperties).create(); - DistributedLockService existing = DistributedLockService.getServiceNamed(HIBERNATE_DLOCK_SERVICE_NAME); - if (existing == null) { - this.distributedLockService = DistributedLockService.create( - HIBERNATE_DLOCK_SERVICE_NAME, _cache.getDistributedSystem()); - } else { - this.distributedLockService = existing; - } - } - catch (com.gemstone.gemfire.cache.CacheException e) { - throw new CacheException(e); - } - - FunctionService.registerFunction(new CreateRegionFunction()); - - logger.info("GemFireCacheProvider: Done creating cache provider"); - } - - /** - * Callback to perform any necessary cleanup of the underlying cache - * implementation during SessionFactory.close(). - */ - public void stop() { - logger.info("GemFireCacheProvider: Stopping"); - _cache.close(); - logger.info("GemFireCacheProvider: Stopped"); - } - - public static Logger getLogger() { - return logger; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireQueryCacheFactory.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireQueryCacheFactory.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireQueryCacheFactory.java deleted file mode 100644 index 35a79ee..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireQueryCacheFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import java.util.Properties; - -import org.hibernate.HibernateException; -import org.hibernate.cache.QueryCache; -import org.hibernate.cache.QueryCacheFactory; -import org.hibernate.cache.UpdateTimestampsCache; -import org.hibernate.cfg.Settings; - -/** - * Defines a factory for query cache instances. These factories are responsible - * for creating individual QueryCache instances. - * - */ -public class GemFireQueryCacheFactory implements QueryCacheFactory { - public QueryCache getQueryCache(String regionName, - UpdateTimestampsCache updateTimestampsCache, Settings settings, - Properties props) throws HibernateException { - return new org.hibernate.cache.StandardQueryCache(settings, props, - updateTimestampsCache, regionName); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireRegionFactory.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireRegionFactory.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireRegionFactory.java deleted file mode 100644 index f2d1696..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/GemFireRegionFactory.java +++ /dev/null @@ -1,228 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate; - -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.hibernate.cache.CacheDataDescription; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.CollectionRegion; -import org.hibernate.cache.EntityRegion; -import org.hibernate.cache.QueryResultsRegion; -import org.hibernate.cache.RegionFactory; -import org.hibernate.cache.Timestamper; -import org.hibernate.cache.TimestampsRegion; -import org.hibernate.cache.access.AccessType; -import org.hibernate.cfg.Settings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.GemFireCache; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.RegionShortcut; -import com.gemstone.gemfire.cache.client.ClientCache; -import com.gemstone.gemfire.cache.client.ClientRegionShortcut; -import com.gemstone.gemfire.distributed.internal.DistributionConfig; -import com.gemstone.gemfire.distributed.internal.DistributionConfigImpl; -import com.gemstone.gemfire.modules.hibernate.internal.ClientServerRegionFactoryDelegate; -import com.gemstone.gemfire.modules.hibernate.internal.EntityWrapper; -import com.gemstone.gemfire.modules.hibernate.internal.GemFireCollectionRegion; -import com.gemstone.gemfire.modules.hibernate.internal.GemFireEntityRegion; -import com.gemstone.gemfire.modules.hibernate.internal.GemFireQueryResultsRegion; -import com.gemstone.gemfire.modules.hibernate.internal.RegionFactoryDelegate; -import com.gemstone.gemfire.modules.util.Banner; - -public class GemFireRegionFactory implements RegionFactory { - - - private static final String GEMFIRE_QUERY_RESULTS_REGION_NAME = "gemfire.hibernateQueryResults"; - - private static final String GEMFIRE_TIMESTAMPS_REGION_NAME = "gemfire.hibernateTimestamps"; - - private GemFireCache _cache; - - private RegionFactoryDelegate delegate; - - // TODO get rid of this - private boolean isClient; - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - - private Set<String> gemfireAttributes; - - /** - * maps the entity to the region that stores it. - */ - private ConcurrentMap<String, GemFireEntityRegion> entityRegionMap = new ConcurrentHashMap<String, GemFireEntityRegion>(); - - public GemFireRegionFactory(Properties props) { - log.debug("props:" + props); - } - - public ExecutorService getExecutorService() { - return this.executorService; - } - - @Override - public void start(Settings settings, Properties properties) - throws CacheException { - log.info("Initializing " + Banner.getString()); - extractGemFireProperties(properties); - _cache = delegate.startCache(); - } - - private void extractGemFireProperties(Properties properties) { - // We have to strip out any unknown properties, do so here - Properties gemfireProperties = new Properties(); - Properties regionProperties = new Properties(); - for (Object keyObj : properties.keySet()) { - String key = (String)keyObj; - if (key.contains("region-attributes")) { - regionProperties.put(key, properties.get(key)); - } - else if (key.equals("gemfire.cache-topology")) { - if (properties.getProperty(key).trim() - .equalsIgnoreCase("client-server")) { - isClient = true; - } - } - else if (key.startsWith("gemfire.") && isGemFireAttribute(key)) { - gemfireProperties.setProperty(key.replace("gemfire.", ""), - properties.getProperty(key)); - } - } - if (isClient) { - delegate = new ClientServerRegionFactoryDelegate(gemfireProperties, regionProperties); - } else { - delegate = new RegionFactoryDelegate(gemfireProperties, regionProperties); - } - } - - private boolean isGemFireAttribute(String key) { - String gfKey = key.replace("gemfire.", ""); - Set<String> gemfireAttributes = getGemFireAttributesNames(); - return gemfireAttributes.contains(gfKey); - } - - private Set<String> getGemFireAttributesNames() { - if (this.gemfireAttributes == null) { - //used only to get the list of all gemfire properties - DistributionConfig dConfig = new DistributionConfigImpl(new Properties()); - String[] gemfireAttributeNames = dConfig.getAttributeNames(); - gemfireAttributes = new HashSet<String>(); - for (String attrName : gemfireAttributeNames) { - gemfireAttributes.add(attrName); - } - } - return gemfireAttributes; - } - - @Override - public void stop() { - // we do not want to close the cache, as there may be other - // applications/webapps - // using this cache. TODO do we want to close the regions that are created - // by this application? - } - - @Override - public boolean isMinimalPutsEnabledByDefault() { - // minimal puts is better for clustered cache - return true; - } - - @Override - public AccessType getDefaultAccessType() { - return AccessType.NONSTRICT_READ_WRITE; - } - - @Override - public long nextTimestamp() { - log.debug("nextTimestamp called"); - // TODO use gemfire cache time here. (which tries to minimize clock skews) - return Timestamper.next(); - } - - @Override - public EntityRegion buildEntityRegion(String regionName, - Properties properties, CacheDataDescription metadata) - throws CacheException { - // create the backing region - log.debug("creating Entity region {} ", regionName); - Region<Object, EntityWrapper> region = delegate.createRegion(regionName); - GemFireEntityRegion r = new GemFireEntityRegion(region, isClient, metadata, this); - this.entityRegionMap.put(regionName, r); - return r; - } - - @Override - public CollectionRegion buildCollectionRegion(String regionName, - Properties properties, CacheDataDescription metadata) - throws CacheException { - log.debug("creating collection region {}",regionName); - Region<Object, EntityWrapper> region = delegate.createRegion(regionName); - return new GemFireCollectionRegion(region, isClient, metadata, this); - } - - @Override - public QueryResultsRegion buildQueryResultsRegion(String regionName, - Properties properties) throws CacheException { - log.debug("Creating a query results region"); - Region region = getLocalRegionForQueryCache(); - return new GemFireQueryResultsRegion(region); - } - - private Region getLocalRegionForQueryCache() { - return getLocalRegion(GEMFIRE_QUERY_RESULTS_REGION_NAME); - } - - private Region getLocalRegionForTimestampsCache() { - return getLocalRegion(GEMFIRE_TIMESTAMPS_REGION_NAME); - } - - private Region getLocalRegion(String regionName) { - Region region = _cache.getRegion(regionName); - if (region != null) { - return region; - } - if (isClient) { - ClientCache cc = (ClientCache)_cache; - region = cc.createClientRegionFactory(ClientRegionShortcut.LOCAL_HEAP_LRU).create(regionName); - } else { - Cache c = (Cache)_cache; - region = c.createRegionFactory(RegionShortcut.LOCAL_HEAP_LRU).create(regionName); - } - return region; - } - - @Override - public TimestampsRegion buildTimestampsRegion(String regionName, - Properties properties) throws CacheException { - Region region = getLocalRegionForTimestampsCache(); - return new GemFireQueryResultsRegion(region); - } - - /** - * Given an entity name, gets the region used to store - * that entity. - * @param name name of the entity - * @return the entity region for the given entity name - */ - public GemFireEntityRegion getEntityRegion(String name) { - return this.entityRegionMap.get(name); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/Access.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/Access.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/Access.java deleted file mode 100644 index 55abb6a..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/Access.java +++ /dev/null @@ -1,248 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate.internal; - -import com.gemstone.gemfire.cache.CacheWriterException; -import com.gemstone.gemfire.cache.EntryExistsException; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.client.ServerOperationException; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.EntityRegion; -import org.hibernate.cache.access.EntityRegionAccessStrategy; -import org.hibernate.cache.access.SoftLock; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; -import java.util.Map; - -public abstract class Access implements EntityRegionAccessStrategy { - - private final GemFireEntityRegion region; - - /**Thread local to remember the status of insert, which can be returned in afterInsert*/ - private ThreadLocal<Map<Object, Boolean>> createStatus = new ThreadLocal<Map<Object, Boolean>>() { - @Override - protected Map<Object, Boolean> initialValue() { - return new HashMap<Object, Boolean>(); - } - }; - - private Logger log = LoggerFactory.getLogger(getClass()); - - public Access(GemFireEntityRegion region) { - this.region = region; - } - - @Override - public EntityRegion getRegion() { - return this.region; - } - - @Override - public Object get(Object key, long txTimestamp) throws CacheException { - KeyWrapper wKey = getWrappedKey(key); - if (this.region.isRegisterInterestRequired()) { - this.region.registerInterest(wKey); - } - // first check to see if we have pre-fetched this entity - EntityWrapper wrapper = this.region.get(wKey); - if (wrapper == null) { - wrapper = this.region.getGemFireRegion().get(wKey); - } - if (wrapper == null) { - this.region.getStats().incCacheMiss(); - log.debug("Cache miss for {} count: {}",wKey, this.region.getStats().getCacheMiss()); - return null; - } else { - this.region.getStats().incCacheHit(); - log.debug("cache hit {} count: {} ", wKey, this.region.getStats().getCacheHits()); - } - return wrapper.getEntity(); - } - - @Override - public boolean putFromLoad(Object key, Object value, long txTimestamp, - Object version) throws CacheException { - return putFromLoad(key, value, txTimestamp, version, true); - } - - @Override - public boolean putFromLoad(Object key, Object value, long txTimestamp, - Object version, boolean minimalPutOverride) throws CacheException { - return create(key, value); - } - - private boolean create(Object key, Object value) { - KeyWrapper wKey = getWrappedKey(key); - EntityWrapper wrapper = new EntityWrapper(value, 1L); - log.debug("putting a new entry from load {} value: {}",wKey, wrapper); - boolean remove = false; - try { - this.region.getGemFireRegion().create(wKey, wrapper); - } catch (EntryExistsException ee) { - log.debug("key {} exists in the cache already, destroying", wKey); - remove = true; - } catch (CacheWriterException writerEx) { - this.region.getStats().incHibernateDestroyJobsScheduled(); - log.debug("caught a CacheWriterException {} ",writerEx.getMessage()); - remove = true; - } catch (ServerOperationException serverEx) { - if (serverEx.getCause() instanceof CacheWriterException) { - this.region.getStats().incHibernateDestroyJobsScheduled(); - log.debug("caught a ServerOperationException caused by CacheWriterException {} ",serverEx.getMessage()); - } else { - throw serverEx; - } - remove = true; - } - if (remove) { - this.region.getGemFireRegion().remove(wKey); - return false; - } - return true; - } - - @Override - public SoftLock lockItem(Object key, Object version) throws CacheException { - KeyWrapper wKey = getWrappedKey(key); - EntityWrapper wrapper = this.region.getGemFireRegion().get(wKey); - Long ver = wrapper == null ? 0L : wrapper.getVersion(); - log.debug("lockItem:key: {} entityVersion: {}", new Object[] { wKey, ver }); - return new EntityVersionImpl(ver); - } - - @Override - public SoftLock lockRegion() throws CacheException { - return null; - } - - @Override - public void unlockItem(Object key, SoftLock lock) throws CacheException { - log.debug("unlockItem:key:" + key + " lock:" + lock); - } - - @Override - public void unlockRegion(SoftLock lock) throws CacheException { - } - - @Override - public boolean insert(Object key, Object value, Object version) - throws CacheException { - log.debug("insert:key:{} value:{} version:{}", - new Object[]{key, value, version}); - boolean retVal = create(key, value); - createStatus.get().put(key, retVal); - return retVal; - } - - @Override - public boolean afterInsert(Object key, Object value, Object version) - throws CacheException { - log.info("afterInsert:key:{} value:{} version:{}", - new Object[]{key, value, version}); - return createStatus.get().remove(key); - } - - @Override - public boolean update(Object key, Object value, Object currentVersion, - Object previousVersion) throws CacheException { - KeyWrapper wKey = getWrappedKey(key); - EntityWrapper oldWrapper = this.region.getGemFireRegion().get(wKey); - Long version = oldWrapper == null ? 1L : oldWrapper.getVersion() + 1; - EntityWrapper wrapper = new EntityWrapper(value, version); - log.debug("put:key:{} value:{} version:{}", new Object[] { wKey, value, - version }); - boolean remove = false; - try { - if (oldWrapper == null) { - remove = this.region.getGemFireRegion().putIfAbsent(wKey, wrapper) != null; - } else { - remove = !this.region.getGemFireRegion().replace(wKey, oldWrapper, wrapper); - } - } catch (CacheWriterException writerEx) { - this.region.getStats().incHibernateDestroyJobsScheduled(); - log.debug("caught a CacheWriterException {} ",writerEx.getMessage()); - remove = true; - } catch (ServerOperationException serverEx) { - if (serverEx.getCause() instanceof CacheWriterException) { - this.region.getStats().incHibernateDestroyJobsScheduled(); - log.debug("caught a ServerOperationException caused by CacheWriterException {} ",serverEx.getMessage()); - remove = true; - } else { - throw serverEx; - } - } - if (remove) { - this.region.getGemFireRegion().remove(wKey); - return false; - } - log.debug("put for key {} succeded", wKey); - return true; - } - - @Override - public boolean afterUpdate(Object key, Object value, Object currentVersion, - Object previousVersion, SoftLock lock) throws CacheException { - log.debug("afterUpdate:key:{} value:{} currVersion:{} previousVersion:{}", - new Object[] {key, value, currentVersion, previousVersion}); - KeyWrapper wKey = getWrappedKey(key); - EntityWrapper wrapper = this.region.getGemFireRegion().get(wKey); - if (wrapper == null) { - // this entry was destroyed during update - return false; - } - Long version = wrapper.getVersion(); - Long expectedVersion = ((EntityVersion)lock).getVersion() + 1; - log.debug("afterPut:key:{} value:{} version:{} expected: {}", - new Object[] { wKey, value, version, expectedVersion }); - if (wrapper.getVersion() != expectedVersion) { - log.debug( - "for key {} expected version to be {} but was {}, so destroying the key", - new Object[] { wKey, expectedVersion, version }); - this.region.getGemFireRegion().remove(wKey); - return false; - } - return true; - } - - @Override - public void remove(Object key) throws CacheException { - log.debug("removing key {} ",key); - this.region.getGemFireRegion().remove(getWrappedKey(key)); - } - - @Override - public void removeAll() throws CacheException { - log.debug("removing all keys"); - this.region.getGemFireRegion().clear(); - } - - @Override - public void evict(Object key) throws CacheException { - // TODO we should implement a method on Region to evict - // a particular entry, destroying is inefficient - log.debug("removing key {} ",key); - this.region.getGemFireRegion().remove(getWrappedKey(key)); - } - - @Override - public void evictAll() throws CacheException { - log.debug("removing all keys"); - this.region.getGemFireRegion().clear(); - } - - protected Region<Object, EntityWrapper> getGemFireRegion() { - return this.region.getGemFireRegion(); - } - - protected KeyWrapper getWrappedKey(Object key) { - return new KeyWrapper(key); - } -} - http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0c89797b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/ClientServerRegionFactoryDelegate.java ---------------------------------------------------------------------- diff --git a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/ClientServerRegionFactoryDelegate.java b/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/ClientServerRegionFactoryDelegate.java deleted file mode 100644 index c2fa3ba..0000000 --- a/modules/gemfire-modules-hibernate/src/main/java/com/gemstone/gemfire/modules/hibernate/internal/ClientServerRegionFactoryDelegate.java +++ /dev/null @@ -1,199 +0,0 @@ -/*========================================================================= - * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * one or more patents listed at http://www.pivotal.io/patents. - *========================================================================= - */ -package com.gemstone.gemfire.modules.hibernate.internal; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.StringTokenizer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.gemstone.gemfire.cache.GemFireCache; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.RegionShortcut; -import com.gemstone.gemfire.cache.client.ClientCache; -import com.gemstone.gemfire.cache.client.ClientCacheFactory; -import com.gemstone.gemfire.cache.client.ClientRegionFactory; -import com.gemstone.gemfire.cache.client.ClientRegionShortcut; -import com.gemstone.gemfire.cache.execute.FunctionService; -import com.gemstone.gemfire.modules.util.BootstrappingFunction; -import com.gemstone.gemfire.modules.util.CreateRegionFunction; -import com.gemstone.gemfire.modules.util.RegionConfiguration; - -public class ClientServerRegionFactoryDelegate extends RegionFactoryDelegate { - - private static final String DEFAULT_SERVER_REGION_TYPE = RegionShortcut.PARTITION.name(); - - private static final String DEFAULT_CLIENT_REGION_TYPE = ClientRegionShortcut.PROXY.name(); - - private ClientCache clientCache; - - public ClientServerRegionFactoryDelegate(Properties gemfireProperties, - Properties regionProperties) { - super(gemfireProperties, regionProperties); - } - - @Override - public GemFireCache startCache() { - log.info("Creating a GemFire client cache"); - String locatorsString = (String)gemfireProperties.remove("locators"); - checkExistingCache(); - ClientCacheFactory ccf = new ClientCacheFactory(gemfireProperties).setPoolSubscriptionEnabled(true); - List<LocatorHolder> locators = getLocatorsMap(locatorsString); - for (LocatorHolder locHolder : locators) { - log.debug("adding pool locator with host {} port {}", locHolder.host, locHolder.port); - ccf.addPoolLocator(locHolder.host, locHolder.port); - } - this.clientCache = ccf.create(); - - log.debug("GemFire client cache creation completed"); - // bootstrap the servers - FunctionService.onServers(this.clientCache).execute(new BootstrappingFunction()).getResult(); - FunctionService.registerFunction(new CreateRegionFunction(this.clientCache)); - return this.clientCache; - } - - private List<LocatorHolder> getLocatorsMap(String locatorsString) { - List<LocatorHolder> retval = new ArrayList<LocatorHolder>(); - if (locatorsString == null || locatorsString.isEmpty()) { - return retval; - } - StringTokenizer st = new StringTokenizer(locatorsString, ","); - while (st.hasMoreTokens()) { - String locator = st.nextToken(); - int portIndex = locator.indexOf('['); - if (portIndex < 1) { - portIndex = locator.lastIndexOf(':'); - } - // starting in 5.1.0.4 we allow '@' as the bind-addr separator - // to let people use IPv6 numeric addresses (which contain colons) - int bindAddrIdx = locator.lastIndexOf('@', portIndex - 1); - - if (bindAddrIdx < 0) { - bindAddrIdx = locator.lastIndexOf(':', portIndex - 1); - } - - String host = locator.substring(0, - bindAddrIdx > -1 ? bindAddrIdx : portIndex); - - if (host.indexOf(':') >= 0) { - bindAddrIdx = locator.lastIndexOf('@'); - host = locator.substring(0, bindAddrIdx > -1 ? bindAddrIdx : portIndex); - } - int lastIndex = locator.lastIndexOf(']'); - if (lastIndex == -1) { - if (locator.indexOf('[') >= 0) { - throw new IllegalArgumentException("Invalid locator"); - } else { - // Using host:port syntax - lastIndex = locator.length(); - } - } - String port = locator.substring(portIndex + 1, lastIndex); - int portVal = 0; - try { - portVal = Integer.parseInt(port); - if (portVal < 1 || portVal > 65535) { - throw new IllegalArgumentException("port should be grater than zero and less than 65536"); - } - } catch (NumberFormatException ex) { - throw new IllegalArgumentException("Invalid Locator"); - } - retval.add(new LocatorHolder(host, portVal)); - } - return retval; - } - - @Override - public Region<Object, EntityWrapper> createRegion(String regionName) { - // first create the region on the server - String serverRegionType = getServerRegionType(regionName); - RegionConfiguration regionConfig = new RegionConfiguration(); - regionConfig.setRegionName(regionName); - regionConfig.setRegionAttributesId(serverRegionType); - regionConfig.setCacheWriterName(EntityRegionWriter.class.getCanonicalName()); - FunctionService.onServer(this.clientCache).withArgs(regionConfig) - .execute(CreateRegionFunction.ID).getResult(); - // now create region on the client - Region<Object, EntityWrapper> r = this.clientCache.getRegion(regionName); - if (r != null) { - return r; - } - String clientRegionType = getClientRegionType(regionName); - ClientRegionFactory<Object, EntityWrapper> rf = this.clientCache - .createClientRegionFactory(ClientRegionShortcut - .valueOf(clientRegionType)); - r = rf.create(regionName); - return r; - } - - private String getClientRegionType(String regionName) { - String rType = getOverridenClientRegionType(regionName); - if (rType != null) { - return rType.toUpperCase(); - } - rType = regionProperties.getProperty("gemfire.default-client-region-attributes-id"); - if (rType == null) { - rType = DEFAULT_CLIENT_REGION_TYPE; - } - return rType.toUpperCase(); - } - - private String getServerRegionType(String regionName) { - String rType = getOverridenServerRegionType(regionName); - if (rType != null) { - return rType.toUpperCase(); - } - rType = regionProperties.getProperty("gemfire.default-region-attributes-id"); - if (rType == null) { - rType = DEFAULT_SERVER_REGION_TYPE; - } - return rType.toUpperCase(); - } - - private String getOverridenServerRegionType(String regionName) { - String rType = null; - Iterator<Object> it = regionProperties.keySet().iterator(); - while (it.hasNext()) { - String current = (String)it.next(); - if (current.contains(regionName) && !current.contains("client")) { - rType = regionProperties.getProperty(current); - break; - } - } - return rType; - } - - private String getOverridenClientRegionType(String regionName) { - String rType = null; - Iterator<Object> it = regionProperties.keySet().iterator(); - while (it.hasNext()) { - String current = (String)it.next(); - if (current.contains(regionName) && current.contains("client")) { - rType = regionProperties.getProperty(current); - break; - } - } - return rType; - } - - private static class LocatorHolder { - private String host; - private int port; - private LocatorHolder(String host, int port) { - this.host = host; - this.port = port; - } - } -}
