001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.gps.device.jpa.embedded.eclipselink;
018:
019: import java.util.Properties;
020: import java.util.Vector;
021: import javax.persistence.EntityManager;
022: import javax.persistence.EntityManagerFactory;
023:
024: import org.compass.core.Compass;
025: import org.compass.core.CompassException;
026: import org.compass.core.CompassSession;
027: import org.compass.gps.device.jpa.JpaGpsDevice;
028: import org.compass.gps.device.jpa.embedded.DefaultJpaCompassGps;
029: import org.compass.gps.device.jpa.embedded.JpaCompassGps;
030: import org.eclipse.persistence.jpa.JpaEntityManager;
031: import org.eclipse.persistence.sessions.Session;
032:
033: /**
034: * Helper class to get different Compass constructs embedded with EclipseLink.
035: *
036: * @author kimchy
037: */
038: public abstract class EclipseLinkHelper {
039:
040: private EclipseLinkHelper() {
041:
042: }
043:
044: /**
045: * Returns the Compass instance assoicated with the given EclipseLink {@link javax.persistence.EntityManagerFactory}.
046: * This allows to get a Compass instnace in order to perform search operations for example outside of a JPA
047: * transaction (for performance reasons, mostly there is no need to start a DB transaction).
048: */
049: public static Compass getCompass(EntityManagerFactory emf) {
050: EntityManager em = emf.createEntityManager();
051: try {
052: return getCompass(em);
053: } finally {
054: em.close();
055: }
056: }
057:
058: /**
059: * Returns the Compass instance assoicated with the given EclispeLink {@link javax.persistence.EntityManager}.
060: * This allows to get a Compass instnace in order to perform search operations for example outside of a JPA
061: * transaction (for performance reasons, mostly there is no need to start a DB transaction).
062: */
063: public static Compass getCompass(EntityManager em) {
064: return findCompassSessionEventListener(em).getCompass();
065: }
066:
067: /**
068: * Returns the index settings that are configured within the {@link javax.persistence.EntityManagerFactory}
069: * configuration. Can be used to configure exteranally a {@link org.compass.gps.device.jpa.embedded.JpaCompassGps}
070: * instance.
071: */
072: public static Properties getIndexSettings(EntityManagerFactory emf) {
073: EntityManager em = emf.createEntityManager();
074: try {
075: return getIndexSettings(em);
076: } finally {
077: em.close();
078: }
079: }
080:
081: /**
082: * Returns the index settings that are configured within the {@link javax.persistence.EntityManager}
083: * configuration. Can be used to configure exteranally a {@link org.compass.gps.device.jpa.embedded.JpaCompassGps}
084: * instnace.
085: */
086: public static Properties getIndexSettings(EntityManager em) {
087: return findCompassSessionEventListener(em).getIndexSettings();
088: }
089:
090: /**
091: * Returns the current Compass session associated with the {@link javax.persistence.EntityManager}.
092: * Compass Session is associated with an Entity Manager when a transaction is started and removed when the
093: * transaction commits/rollsback.
094: *
095: * <p>The session can be used to perform searches that needs to take into account current transactional changes
096: * or to perform additional Compass operations that are not reflected by the mirroring feature.
097: */
098: public static CompassSession getCurrentCompassSession(
099: EntityManager em) {
100: Session serverSession = ((JpaEntityManager) em)
101: .getServerSession();
102: Session session = ((JpaEntityManager) em).getUnitOfWork();
103: return findCompassSessionEventListener(serverSession)
104: .getCurrentCompassSession(session);
105: }
106:
107: /**
108: * Returns the current Compass session associated with the {@link javax.persistence.EntityManager}.
109: * Compass Session is associated with an Entity Manager when a transaction is started and removed when the
110: * transaction commits/rollsback.
111: *
112: * <p>The session can be used to perform searches that needs to take into account current transactional changes
113: * or to perform additional Compass operations that are not reflected by the mirroring feature.
114: */
115: public static CompassSession getCurrentCompassSession(
116: Session session) {
117: return findCompassSessionEventListener(session)
118: .getCurrentCompassSession(session);
119: }
120:
121: /**
122: * Returns the Compass Gps instance associated with the given EclipseLink {@link javax.persistence.EntityManagerFactory}.
123: * Used in order to perform {@link org.compass.gps.device.jpa.embedded.JpaCompassGps#index()} operation. Note, the index
124: * operation should not be perfomed within a running transaction.
125: */
126: public static JpaCompassGps getCompassGps(EntityManagerFactory emf) {
127: EntityManager em = emf.createEntityManager();
128: try {
129: return getCompassGps(em);
130: } finally {
131: em.close();
132: }
133: }
134:
135: /**
136: * Returns the Compass Gps instance associated with the given EclipseLink {@link javax.persistence.EntityManager}.
137: * Used in order to perform {@link org.compass.gps.device.jpa.embedded.JpaCompassGps#index()} operation. Note, the index
138: * operation should not be perfomed within a running transaction.
139: */
140: public static JpaCompassGps getCompassGps(EntityManager em) {
141: return findCompassSessionEventListener(em).getJpaCompassGps();
142: }
143:
144: /**
145: * A helper class to create the <code>JpaCompasGps</code> based on the passed device.
146: */
147: public static JpaCompassGps createCompassGps(JpaGpsDevice device) {
148: DefaultJpaCompassGps gps = new DefaultJpaCompassGps(
149: getCompass(device.getEntityManagerFactory()));
150: device.setMirrorDataChanges(false);
151: gps.setIndexProperties(getIndexSettings(device
152: .getEntityManagerFactory()));
153: gps.addGpsDevice(device);
154: return gps;
155: }
156:
157: private static CompassSessionEventListener findCompassSessionEventListener(
158: EntityManager em) throws CompassException {
159: return findCompassSessionEventListener(((JpaEntityManager) em)
160: .getServerSession());
161: }
162:
163: private static CompassSessionEventListener findCompassSessionEventListener(
164: Session session) throws CompassException {
165: Vector listeners = session.getEventManager().getListeners();
166: for (Object o : listeners) {
167: if (o instanceof CompassSessionEventListener) {
168: return (CompassSessionEventListener) o;
169: }
170: }
171: throw new CompassException(
172: "Failed to find CompassSessionEventListener, have you configured Compass with EclipseLink?");
173: }
174: }
|