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.lifecycle;
018:
019: import java.util.Map;
020: import java.util.Vector;
021: import javax.persistence.EntityManagerFactory;
022:
023: import org.compass.core.mapping.CascadeMapping;
024: import org.compass.gps.device.jpa.AbstractDeviceJpaEntityListener;
025: import org.compass.gps.device.jpa.JpaGpsDevice;
026: import org.compass.gps.device.jpa.JpaGpsDeviceException;
027: import org.compass.gps.spi.CompassGpsInterfaceDevice;
028: import org.eclipse.persistence.descriptors.ClassDescriptor;
029: import org.eclipse.persistence.descriptors.DescriptorEvent;
030: import org.eclipse.persistence.descriptors.DescriptorEventListener;
031: import org.eclipse.persistence.jpa.JpaEntityManager;
032: import org.eclipse.persistence.sessions.Session;
033:
034: /**
035: * Injects lifecycle listeners directly into Eclipse Persistence for mirroring operations.
036: *
037: * @author kimchy
038: */
039: public class EclipseLinkJpaEntityLifecycleInjector implements
040: JpaEntityLifecycleInjector {
041:
042: private class TopLinkEssentialsEventListener extends
043: AbstractDeviceJpaEntityListener implements
044: DescriptorEventListener {
045:
046: private JpaGpsDevice device;
047:
048: public TopLinkEssentialsEventListener(JpaGpsDevice device) {
049: this .device = device;
050: }
051:
052: @Override
053: protected JpaGpsDevice getDevice() {
054: return this .device;
055: }
056:
057: public void postUpdate(DescriptorEvent event) {
058: postUpdate(event.getObject());
059: }
060:
061: public void postDelete(DescriptorEvent event) {
062: postRemove(event.getObject());
063: }
064:
065: public void postInsert(DescriptorEvent event) {
066: postPersist(event.getObject());
067: }
068:
069: // things we don't use
070:
071: public void aboutToDelete(DescriptorEvent event) {
072: }
073:
074: public void aboutToInsert(DescriptorEvent event) {
075: }
076:
077: public void aboutToUpdate(DescriptorEvent event) {
078: }
079:
080: public boolean isOverriddenEvent(DescriptorEvent event,
081: Vector eventManagers) {
082: return false;
083: }
084:
085: public void postBuild(DescriptorEvent event) {
086: }
087:
088: public void postClone(DescriptorEvent event) {
089: }
090:
091: public void postMerge(DescriptorEvent event) {
092: }
093:
094: public void postRefresh(DescriptorEvent event) {
095: }
096:
097: public void postWrite(DescriptorEvent event) {
098: }
099:
100: public void preDelete(DescriptorEvent event) {
101: }
102:
103: public void preInsert(DescriptorEvent event) {
104: }
105:
106: public void prePersist(DescriptorEvent event) {
107: }
108:
109: public void preRemove(DescriptorEvent event) {
110: }
111:
112: public void preUpdate(DescriptorEvent event) {
113: }
114:
115: public void preUpdateWithChanges(DescriptorEvent event) {
116: }
117:
118: public void preWrite(DescriptorEvent event) {
119: }
120:
121: }
122:
123: private DescriptorEventListener eventListener;
124:
125: public void setEventListener(DescriptorEventListener eventListener) {
126: this .eventListener = eventListener;
127: }
128:
129: public void injectLifecycle(
130: EntityManagerFactory entityManagerFactory,
131: JpaGpsDevice device) throws JpaGpsDeviceException {
132:
133: CompassGpsInterfaceDevice gps = (CompassGpsInterfaceDevice) device
134: .getGps();
135:
136: if (eventListener == null) {
137: eventListener = new TopLinkEssentialsEventListener(device);
138: }
139:
140: JpaEntityManager entityManager = (JpaEntityManager) entityManagerFactory
141: .createEntityManager();
142: Session session = entityManager.getServerSession();
143: entityManager.close();
144:
145: Map descriptors = session.getDescriptors();
146: for (Object o : descriptors.values()) {
147: ClassDescriptor classDescriptor = (ClassDescriptor) o;
148: Class mappedClass = classDescriptor.getJavaClass();
149: if (gps.hasMappingForEntityForMirror(mappedClass,
150: CascadeMapping.Cascade.ALL)) {
151: classDescriptor.getDescriptorEventManager()
152: .addListener(eventListener);
153: }
154: }
155: }
156:
157: public void removeLifecycle(
158: EntityManagerFactory entityManagerFactory,
159: JpaGpsDevice device) throws JpaGpsDeviceException {
160: CompassGpsInterfaceDevice gps = (CompassGpsInterfaceDevice) device
161: .getGps();
162:
163: JpaEntityManager entityManager = (JpaEntityManager) entityManagerFactory
164: .createEntityManager();
165: Session session = entityManager.getServerSession();
166: entityManager.close();
167:
168: Map descriptors = session.getDescriptors();
169: for (Object o : descriptors.values()) {
170: ClassDescriptor classDescriptor = (ClassDescriptor) o;
171: Class mappedClass = classDescriptor.getJavaClass();
172: if (gps.hasMappingForEntityForMirror(mappedClass,
173: CascadeMapping.Cascade.ALL)) {
174: classDescriptor.getDescriptorEventManager()
175: .removeListener(eventListener);
176: }
177: }
178: }
179: }
|