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.toplink;
018:
019: import java.util.Properties;
020: import java.util.Vector;
021: import javax.persistence.EntityManager;
022: import javax.persistence.EntityManagerFactory;
023:
024: import oracle.toplink.essentials.sessions.Session;
025: import org.compass.core.Compass;
026: import org.compass.core.CompassException;
027: import org.compass.core.CompassSession;
028: import org.compass.gps.device.jpa.JpaGpsDevice;
029: import org.compass.gps.device.jpa.embedded.DefaultJpaCompassGps;
030: import org.compass.gps.device.jpa.embedded.JpaCompassGps;
031:
032: /**
033: * Helper class to get different Compass constructs embedded with TopLink.
034: *
035: * @author kimchy
036: */
037: public abstract class TopLinkHelper {
038:
039: private TopLinkHelper() {
040:
041: }
042:
043: /**
044: * Returns the Compass instance assoicated with the given TopLink {@link javax.persistence.EntityManagerFactory}.
045: * This allows to get a Compass instnace in order to perform search operations for example outside of a JPA
046: * transaction (for performance reasons, mostly there is no need to start a DB transaction).
047: */
048: public static Compass getCompass(EntityManagerFactory emf) {
049: EntityManager em = emf.createEntityManager();
050: try {
051: return getCompass(em);
052: } finally {
053: em.close();
054: }
055: }
056:
057: /**
058: * Returns the Compass instance assoicated with the given TopLink {@link javax.persistence.EntityManager}.
059: * This allows to get a Compass instnace in order to perform search operations for example outside of a JPA
060: * transaction (for performance reasons, mostly there is no need to start a DB transaction).
061: */
062: public static Compass getCompass(EntityManager em) {
063: return findCompassSessionEventListener(em).getCompass();
064: }
065:
066: /**
067: * Returns the index settings that are configured within the {@link javax.persistence.EntityManagerFactory}
068: * configuration. Can be used to configure exteranally a {@link org.compass.gps.device.jpa.embedded.JpaCompassGps}
069: * instance.
070: */
071: public static Properties getIndexSettings(EntityManagerFactory emf) {
072: EntityManager em = emf.createEntityManager();
073: try {
074: return getIndexSettings(em);
075: } finally {
076: em.close();
077: }
078: }
079:
080: /**
081: * Returns the index settings that are configured within the {@link javax.persistence.EntityManager}
082: * configuration. Can be used to configure exteranally a {@link org.compass.gps.device.jpa.embedded.JpaCompassGps}
083: * instnace.
084: */
085: public static Properties getIndexSettings(EntityManager em) {
086: return findCompassSessionEventListener(em).getIndexSettings();
087: }
088:
089: /**
090: * Returns the current Compass session associated with the {@link javax.persistence.EntityManager}.
091: * Compass Session is associated with an Entity Manager when a transaction is started and removed when the
092: * transaction commits/rollsback.
093: *
094: * <p>The session can be used to perform searches that needs to take into account current transactional changes
095: * or to perform additional Compass operations that are not reflected by the mirroring feature.
096: */
097: public static CompassSession getCurrentCompassSession(
098: EntityManager em) {
099: Session serverSession = ((oracle.toplink.essentials.ejb.cmp3.EntityManager) em)
100: .getServerSession();
101: Session session = ((oracle.toplink.essentials.ejb.cmp3.EntityManager) em)
102: .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 TopLink {@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 TopLink {@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(((oracle.toplink.essentials.ejb.cmp3.EntityManager) 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 TopLink?");
173: }
174: }
|