Synchronize git repo with current state of jpa rs
diff --git a/JPA-RS/org.eclipse.persistence.jpars/.classpath b/JPA-RS/org.eclipse.persistence.jpars/.classpath
index 24a3bdc..a52f8c2 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/.classpath
+++ b/JPA-RS/org.eclipse.persistence.jpars/.classpath
@@ -1,24 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry combineaccessrules="false" kind="src" path="/javax.persistence 2.0.0"/>
- <classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.antlr"/>
- <classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.asm"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.core"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.jpa"/>
- <classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.moxy"/>
- <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1">
- <attributes>
- <attribute name="owner.project.facets" value="jst.web"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
- <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
- <classpathentry kind="con" path="org.eclipse.datatools.connectivity.jdt.DRIVERLIBRARY/Oracle Database 11g Driver Default">
- <attributes>
- <attribute name="org.eclipse.jst.component.nondependency" value=""/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="output" path="build/classes"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/javax.persistence 2.0.0"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/javax.xml.bind-2.1.12"/>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish 3.1.2 2"/>
+ <classpathentry kind="output" path="classes"/>
</classpath>
diff --git a/JPA-RS/org.eclipse.persistence.jpars/.project b/JPA-RS/org.eclipse.persistence.jpars/.project
index f54509f..ffc40b5 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/.project
+++ b/JPA-RS/org.eclipse.persistence.jpars/.project
@@ -1,36 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>JPA-RS</name>
+ <name>org.eclipse.persistence.jpars</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
- <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
- <buildCommand>
- <name>org.eclipse.wst.common.project.facet.core.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.wst.validation.validationbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
</buildSpec>
<natures>
- <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
- <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
- <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
diff --git a/JPA-RS/org.eclipse.persistence.jpars/WebContent/META-INF/MANIFEST.MF b/JPA-RS/org.eclipse.persistence.jpars/WebContent/META-INF/MANIFEST.MF
deleted file mode 100644
index 5e94951..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/WebContent/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Class-Path:
-
diff --git a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/beans.xml b/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/beans.xml
deleted file mode 100644
index c1a058e..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/beans.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
-</beans>
\ No newline at end of file
diff --git a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/sun-web.xml b/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/sun-web.xml
deleted file mode 100644
index 0627bea..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/sun-web.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
-<sun-web-app error-url="">
- <context-root>/jpa-rs</context-root>
- <class-loader delegate="true"/>
- <jsp-config>
- <property name="keepgenerated" value="true">
- <description>Keep a copy of the generated servlet class java code.</description>
- </property>
- </jsp-config>
-</sun-web-app>
diff --git a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/web.xml b/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/web.xml
deleted file mode 100644
index 9da5e9e..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/WebContent/WEB-INF/web.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
- <display-name>JPA-RS POC</display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>JPA-RS Service</servlet-name>
- <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
- <init-param>
- <param-name>com.sun.jersey.config.property.packages</param-name>
- <param-value>org.eclipse.persistence.jpa.rs</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>JPA-RS Service</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
-</web-app>
\ No newline at end of file
diff --git a/JPA-RS/org.eclipse.persistence.jpars/eclipselink.jpa-rs.properties b/JPA-RS/org.eclipse.persistence.jpars/eclipselink.jpa-rs.properties
deleted file mode 100644
index fc98da6..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/eclipselink.jpa-rs.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-javax.persistence.jdbc.driver=oracle.jdbc.OracleDriver
-javax.persistence.jdbc.url=jdbc:oracle:thin:@localhost:1521:DJCLARKEORCL
-javax.persistence.jdbc.user=avatar
-javax.persistence.jdbc.password=avatar
-
-eclipselink.jdbc.read-connections.min=1
-eclipselink.jdbc.write-connections.min=1
-
-eclipselink.logging.level=CONFIG
-eclipselink.logging.connection=false
-eclipselink.logging.timestamp=false
-eclipselink.logging.thread=false
-eclipselink.logging.session=false
-eclipselink.logging.exceptions=false
-eclipselink.logging.level.sql=FINE
-eclipselink.logging.level.ejb_or_metadata=WARNING
-
-eclipselink.target-server=NONE
\ No newline at end of file
diff --git a/JPA-RS/org.eclipse.persistence.jpars/readme.txt b/JPA-RS/org.eclipse.persistence.jpars/readme.txt
deleted file mode 100644
index e847df7..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/readme.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Configuring on GlassFish
-
-- Requires Oracle DB 11.2 or better for change notification
-- Requires GlassFish 3.1.2 or better for web sockets
-- I suggest using OPEE version 12
-- Add 3.1.2 to your OPEE install if you are using GlassFish 3.1.2 or later
- (update site: http://download.java.net/glassfish/eclipse/indigo)
-
-0) Stop GlassFish and OEPE if running
-1) Move the grizzly-utils.jar down a folder from GF_HOME/glassfish/modules to
- GF_HOME/glassfish/modules/endorsed. This works around a limitation in the
- OEPE GlassFish classpath configuration
-2) Copy your oracle jdbc driver jar into GF_HOME/domains/<domain>/lib/ext
-3) Edit GF_HOME/glassfish/osgi.properties. (GF_HOME/glassfish/osgi/felix/conf/config.properties on 3.1.1)
- Add oracle.jdbc.*, oracle.jdbc.dcn.* to eclipselink.bootdelegation line.
- It will look roughly like this: eclipselink.bootdelegation=oracle.sql, oracle.sql.*, oracle.jdbc.*, oracle.jdbc.dcn.*
-4) Delete domain OSGi caches. By default you'll have a domain1 created and caches
- are in GF_HOME/glassfish/domains/domain1/osgi-cache
- Start GlassFish
-5) Enable websockets with the following asadmin (located in GF_HOME/glassfish/bin)
- command:
-
- asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true
-
-6) You can now compile and deploy websocket applications to GlassFish.
-
-
-
-
\ No newline at end of file
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/META-INF/beans.xml b/JPA-RS/org.eclipse.persistence.jpars/src/META-INF/beans.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/META-INF/beans.xml
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
index b94173c..7122135 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceContext.java
@@ -21,15 +21,19 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import javax.ejb.EJB;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.ws.rs.core.MediaType;
+
import org.eclipse.persistence.jaxb.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
@@ -51,16 +55,19 @@
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.jpa.PersistenceProvider;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
+import org.eclipse.persistence.jpa.metadata.XMLMetadataSource;
+import org.eclipse.persistence.jpa.rs.eventlistener.DatabaseEventListenerFactory;
import org.eclipse.persistence.jpa.rs.util.CustomSerializationMetadataSource;
+import org.eclipse.persistence.jpa.rs.util.DatabaseListener;
import org.eclipse.persistence.jpa.rs.util.DynamicXMLMetadataSource;
import org.eclipse.persistence.jpa.rs.util.InMemoryArchive;
+import org.eclipse.persistence.platform.database.events.DatabaseEventListener;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.server.Server;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.jpa.rs.util.ChangeListener;
-import org.eclipse.persistence.jpa.rs.qcn.JPARSChangeNotificationListener;
import org.eclipse.persistence.jpa.rs.PersistenceFactory;
@@ -73,7 +80,8 @@
public class PersistenceContext {
private static final String PACKAGE_ROOT = "jpars.app.";
- private static final String MODEL_PACKAGE = ".model";
+ private static final String MODEL_PACKAGE = ".model";
+ public static DatabaseEventListenerFactory EVENT_LISTENER_FACTORY = null;
private String name = null;
@@ -83,6 +91,7 @@
private URI baseURI = null;
+
public PersistenceContext(Archive archive, Map<String, Object> properties, ClassLoader classLoader){
super();
List<SEPersistenceUnitInfo> persistenceUnits = PersistenceUnitProcessor.getPersistenceUnits(archive, classLoader);
@@ -97,15 +106,39 @@
this.emf = emf;
try{
- JAXBContext jaxbContext = createJAXBContext(persistenceUnitInfo.getPersistenceUnitName(), emf.getServerSession());
+ JAXBContext jaxbContext = createDynamicJAXBContext(persistenceUnitInfo.getPersistenceUnitName(), emf.getServerSession());
this.context = jaxbContext;
} catch (Exception e){
- e.printStackTrace();
emf.close();
throw new RuntimeException("JAXB Creation Exception", e);
}
}
+ @SuppressWarnings("unchecked")
+ public PersistenceContext(String emfName, EntityManagerFactoryImpl emf, URI defaultURI){
+ super();
+ this.emf = emf;
+
+ boolean createStaticContext = true;
+ if (!emf.getServerSession().getDescriptors().isEmpty()){
+ ClassDescriptor descriptor = emf.getServerSession().getDescriptors().entrySet().iterator().next().getValue();
+ if (DynamicEntity.class.isAssignableFrom(descriptor.getJavaClass())){
+ createStaticContext = false;
+ }
+ }
+ try{
+ JAXBContext jaxbContext = null;
+ if (createStaticContext){
+ jaxbContext = createStaticJAXBContext(emfName, emf.getServerSession());
+ } else {
+ jaxbContext = createDynamicJAXBContext(emfName, emf.getServerSession());
+ }
+ this.context = jaxbContext;
+ } catch (Exception e){
+ throw new RuntimeException("JAXB Creation Exception", e);
+ }
+ }
+
protected EntityManagerFactoryImpl createDynamicEMF(PersistenceUnitInfo info, Map<String, ?> properties){
PersistenceProvider provider = new PersistenceProvider();
EntityManagerFactory emf = provider.createContainerEntityManagerFactory(info, properties);
@@ -117,25 +150,16 @@
* @param session
* @return
*/
- protected JAXBContext createJAXBContext(String persistenceUnitName, Server session) throws JAXBException, IOException {
+ protected JAXBContext createDynamicJAXBContext(String persistenceUnitName, Server session) throws JAXBException, IOException {
JAXBContext jaxbContext = (JAXBContext) session.getProperty(JAXBContext.class.getName());
if (jaxbContext != null) {
return jaxbContext;
}
- String oxmLocation = (String) emf.getProperties().get("eclipselink.jpa-rs.oxm");
-
String packageName = PACKAGE_ROOT + persistenceUnitName + MODEL_PACKAGE;
- Map<String, Object> properties = new HashMap<String, Object>(1);
- Object metadataLocation = null;
- if (oxmLocation != null){
- metadataLocation = new InMemoryArchive((new URL(oxmLocation)).openStream());
- } else {
- metadataLocation = new DynamicXMLMetadataSource(persistenceUnitName, session, packageName);
- }
- List<Object> metadataLocations = new ArrayList<Object>();
- metadataLocations.add(metadataLocation);
- metadataLocations.add(new CustomSerializationMetadataSource(persistenceUnitName, session, packageName));
- properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataLocations);
+
+ Map<String, Object> properties = createJAXBProperties(persistenceUnitName, session, packageName);
+
+ ((List<Object>)properties.get(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY)).add(new CustomSerializationMetadataSource(persistenceUnitName, session, packageName));
ClassLoader cl = session.getPlatform().getConversionManager().getLoader();
jaxbContext = DynamicJAXBContextFactory.createContextFromOXM(cl, properties);
@@ -145,6 +169,60 @@
return jaxbContext;
}
+ /**
+ * @param session
+ * @return
+ */
+ protected JAXBContext createStaticJAXBContext(String persistenceUnitName, Server session) throws JAXBException, IOException {
+ JAXBContext jaxbContext = (JAXBContext) session.getProperty(JAXBContext.class.getName());
+ if (jaxbContext != null) {
+ return jaxbContext;
+ }
+ Map<String, Object> properties = createJAXBProperties(persistenceUnitName, session, null);
+
+ Object[] classes = session.getDescriptors().keySet().toArray();
+ Class[] classesToBeBound = new Class[classes.length];
+ for (int i=0;i<classes.length;i++){
+ classesToBeBound[i] = (Class)classes[i];
+ }
+ jaxbContext = (JAXBContext)JAXBContextFactory.createContext(classesToBeBound, properties);
+
+ session.setProperty(JAXBContext.class.getName(), jaxbContext);
+
+ return jaxbContext;
+ }
+
+ public Map<String, Object> createJAXBProperties(String persistenceUnitName, Server session, String dynamicPackageName) throws IOException{
+ String oxmLocation = (String) emf.getProperties().get("eclipselink.jpa-rs.oxm");
+
+ Map<String, Object> properties = new HashMap<String, Object>(1);
+ List<Object> metadataLocations = new ArrayList<Object>();
+
+ addDynamicXMLMetadataSources(metadataLocations, persistenceUnitName, session);
+ if (oxmLocation != null){
+ metadataLocations.add(new org.eclipse.persistence.jaxb.metadata.XMLMetadataSource((new URL(oxmLocation)).openStream()));
+ }
+ properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, metadataLocations);
+ return properties;
+ }
+
+ public void addDynamicXMLMetadataSources(List<Object> metadataSources, String persistenceUnitName, Server session){
+ // metadataLocation = new DynamicXMLMetadataSource(persistenceUnitName, session, dynamicPackageName);
+ Set<String> packages = new HashSet<String>();
+ Iterator<Class> i = session.getDescriptors().keySet().iterator();
+ while (i.hasNext()){
+ Class descriptorClass = i.next();
+ String packageName = descriptorClass.getName().substring(0, descriptorClass.getName().lastIndexOf('.'));
+ if (!packages.contains(packageName)){
+ packages.add(packageName);
+ }
+ }
+
+ for(String packageName: packages){
+ metadataSources.add(new DynamicXMLMetadataSource(persistenceUnitName, session, packageName));
+ }
+ }
+
public String getName() {
return name;
}
@@ -165,7 +243,7 @@
this.baseURI = baseURI;
}
- public void create(String tenantId, DynamicEntity entity) {
+ public void create(String tenantId, Object entity) {
EntityManager em = getEmf().createEntityManager();
try {
@@ -177,22 +255,23 @@
}
}
- public DynamicEntity merge(String type, String tenantId, DynamicEntity entity) {
+ public Object merge(String type, String tenantId, Object entity) {
EntityManager em = getEmf().createEntityManager();
- DynamicEntity mergedEntity = null;
+ Object mergedEntity = null;
try {
em.getTransaction().begin();
if (isList(type)){
- mergedEntity = newEntity(type);
+ DynamicEntity mergedDynamic = (DynamicEntity)newEntity(type);
List<Object> returnValues = new ArrayList<Object>();
- mergedEntity.set("list", returnValues);
+ mergedDynamic.set("list", returnValues);
@SuppressWarnings("unchecked")
- List<Object> values = (List<Object>)entity.get("list");
+ List<Object> values = (List<Object>)((DynamicEntity)entity).get("list");
for (Object value: values){
Object merged = em.merge(value);
returnValues.add(merged);
}
+ mergedEntity = mergedDynamic;
} else {
mergedEntity = em.merge(entity);
}
@@ -240,7 +319,7 @@
/**
* TODO
*/
- public void save(String tenantId, DynamicEntity entity) {
+ public void save(String tenantId, Object entity) {
EntityManager em = getEmf().createEntityManager();
try {
@@ -260,7 +339,7 @@
try {
em.getTransaction().begin();
- DynamicEntity entity = (DynamicEntity)em.find(getClass(type), id);
+ Object entity = em.find(getClass(type), id);
em.remove(entity);
em.getTransaction().commit();
} finally {
@@ -277,19 +356,19 @@
this.context = null;
}
- public DynamicEntity find(String entityName, Object id) {
+ public Object find(String entityName, Object id) {
return find(null, entityName, id);
}
- public DynamicEntity find(String tenantId, String entityName, Object id) {
+ public Object find(String tenantId, String entityName, Object id) {
return find(tenantId, entityName, id, null);
}
- public DynamicEntity find(String tenantId, String entityName, Object id, Map<String, Object> properties) {
+ public Object find(String tenantId, String entityName, Object id, Map<String, Object> properties) {
EntityManager em = getEmf().createEntityManager();
try {
- return (DynamicEntity) em.find(getClass(entityName), id, properties);
+ return em.find(getClass(entityName), id, properties);
} finally {
em.close();
}
@@ -318,11 +397,11 @@
}
public Object query(String name, Map<?, ?> parameters) {
- return query(name, parameters, false);
+ return query(name, parameters, null, false);
}
@SuppressWarnings("rawtypes")
- public Object query(String name, Map<?, ?> parameters, boolean returnSingleResult) {
+ public Object query(String name, Map<?, ?> parameters, Map<String, ?> hints, boolean returnSingleResult) {
EntityManager em = getEmf().createEntityManager();
try{
Query query = em.createNamedQuery(name);
@@ -343,6 +422,11 @@
query.setParameter(key, parameter);
}
}
+ if (hints != null){
+ for (String key: hints.keySet()){
+ query.setHint(key, hints.get(key));
+ }
+ }
if (returnSingleResult){
return query.getSingleResult();
} else {
@@ -356,7 +440,7 @@
return null;
}
- public DynamicEntity unmarshalEntity(String entityName, String tenantId, String acceptedMedia, InputStream in) throws JAXBException {
+ public Object unmarshalEntity(String entityName, String tenantId, String acceptedMedia, InputStream in) throws JAXBException {
Unmarshaller unmarshaller = getJAXBContext().createUnmarshaller();
if (acceptedMedia == null || acceptedMedia.indexOf(MediaType.APPLICATION_JSON) < 0) {
unmarshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_JSON);
@@ -365,7 +449,7 @@
unmarshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_XML);
}
JAXBElement<?> element = unmarshaller.unmarshal(new StreamSource(in), getClass(entityName));
- return (DynamicEntity) element.getValue();
+ return element.getValue();
}
protected EntityManager createEntityManager(String tenantId) {
@@ -376,7 +460,7 @@
* TODO
*/
public void addListener(ChangeListener listener) {
- JPARSChangeNotificationListener changeListener = (JPARSChangeNotificationListener) JpaHelper.getDatabaseSession(getEmf()).getProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER);
+ DatabaseListener changeListener = (DatabaseListener) JpaHelper.getDatabaseSession(getEmf()).getProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER);
if (changeListener == null) {
throw new RuntimeException("Change Listener not registered properly");
}
@@ -387,24 +471,34 @@
* TODO
*/
public void remove(ChangeListener listener) {
- JPARSChangeNotificationListener changeListener = (JPARSChangeNotificationListener) JpaHelper.getDatabaseSession(getEmf()).getProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER);
+ DatabaseListener changeListener = (DatabaseListener) JpaHelper.getDatabaseSession(getEmf()).getProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER);
if (changeListener != null) {
changeListener.removeChangeListener(listener);
}
}
- public static JPARSChangeNotificationListener subscribeToEventNotification(EntityManagerFactory emf) {
- ServerSession session = (ServerSession) JpaHelper.getServerSession(emf);
- Iterator<ClassDescriptor> i = session.getDescriptors().values().iterator();
- JPARSChangeNotificationListener listener = new JPARSChangeNotificationListener();
- session.setDatabaseEventListener(listener);
- while (i.hasNext()) {
- ClassDescriptor descriptor = i.next();
- listener.initialize(descriptor, session);
+ public static DatabaseEventListener subscribeToEventNotification(EntityManagerFactory emf) {
+ DatabaseEventListener listener = null;
+ if (EVENT_LISTENER_FACTORY != null){
+ listener = EVENT_LISTENER_FACTORY.createDatabaseEventListener();
+ ServerSession session = (ServerSession) JpaHelper.getServerSession(emf);
+ Iterator<ClassDescriptor> i = session.getDescriptors().values().iterator();
+ session.setDatabaseEventListener(listener);
+ System.out.println("--- Subscribe set Listener " + listener);
+
+ while (i.hasNext()) {
+ ClassDescriptor descriptor = i.next();
+ listener.initialize(descriptor, session);
+ }
+ listener.register(session);
+ session.setProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER, listener);
}
- listener.register(session);
- session.setProperty(PersistenceFactory.CHANGE_NOTIFICATION_LISTENER, listener);
return listener;
}
+ public static void setEventListenerFactory(
+ DatabaseEventListenerFactory eventListenerFactory) {
+ EVENT_LISTENER_FACTORY = eventListenerFactory;
+ }
+
}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceFactory.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceFactory.java
index 839c961..3bc1fe4 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceFactory.java
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/PersistenceFactory.java
@@ -15,17 +15,23 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.ejb.EJB;
import javax.ejb.Singleton;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.dynamic.DynamicClassLoader;
+import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
import org.eclipse.persistence.jpa.Archive;
+import org.eclipse.persistence.jpa.rs.eventlistener.DatabaseEventListenerFactory;
import org.eclipse.persistence.jpa.rs.metadata.Application;
import org.eclipse.persistence.jpa.rs.metadata.MetadataStore;
import org.eclipse.persistence.jpa.rs.util.InMemoryArchive;
@@ -45,6 +51,8 @@
private Map<String, PersistenceContext> persistenceContexts = new HashMap<String, PersistenceContext>();
private MetadataStore metadataStore;
+
+ private DatabaseEventListenerFactory eventListenerFactory;
public PersistenceFactory(){
}
@@ -92,6 +100,7 @@
if (persistenceContext == null || replace){
DynamicClassLoader dcl = new DynamicClassLoader(Thread.currentThread().getContextClassLoader());
Map<String, Object> properties = createProperties(dcl, originalProperties);
+ properties.putAll(originalProperties);
persistenceContext = new PersistenceContext(archive, properties, dcl);
persistenceContexts.put(name, persistenceContext);
@@ -105,9 +114,24 @@
return persistenceContext;
}
- public PersistenceContext getPersistenceContext(String name){
+ public PersistenceContext bootstrapPersistenceContext(String name, EntityManagerFactory emf, URI baseURI, boolean replace){
initialize();
- return persistenceContexts.get(name);
+ PersistenceContext persistenceContext = null;
+ if (!replace){
+ persistenceContext = getPersistenceContext(name);
+ }
+ if (persistenceContext == null){
+ persistenceContext = new PersistenceContext(name, (EntityManagerFactoryImpl)emf, baseURI);
+ persistenceContexts.put(name, persistenceContext);
+ }
+ persistenceContext.setBaseURI(baseURI);
+ return persistenceContext;
+ }
+
+
+ public synchronized PersistenceContext getPersistenceContext(String name){
+ initialize();
+ return persistenceContexts.get(name);
}
public Set<String> getPersistenceContextNames(){
@@ -166,4 +190,14 @@
this.metadataStore = metadataStore;
}
+
+ public DatabaseEventListenerFactory getEventListenerFactory() {
+ return eventListenerFactory;
+ }
+
+ public void setEventListenerFactory(
+ DatabaseEventListenerFactory eventListenerFactory) {
+ this.eventListenerFactory = eventListenerFactory;
+ }
+
}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/Service.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/Service.java
index 309cb8a..7851aa5 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/Service.java
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/Service.java
@@ -29,6 +29,8 @@
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Singleton;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
@@ -55,6 +57,7 @@
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.jpa.rs.metadata.DatabaseMetadataStore;
@@ -135,18 +138,20 @@
public Response bootstrap(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, @Context UriInfo uriInfo, InputStream in){
ResponseBuilder rb = new ResponseBuilderImpl();
String urlString = getURL(hh);
+
PersistenceContext persistenceContext = null;
boolean replace = false;
List<String> replaceValues = hh.getRequestHeader("replace");
if (replaceValues != null && replaceValues.size() > 0){
replace = Boolean.getBoolean(replaceValues.get(0));
}
+ Map<String, Object> properties = new HashMap<String, Object>();
try{
if (urlString != null){
URL url = new URL(urlString);
- persistenceContext = factory.bootstrapPersistenceContext(persistenceUnit, url, new HashMap<String, Object>(), replace);
+ persistenceContext = factory.bootstrapPersistenceContext(persistenceUnit, url, properties, replace);
} else {
- persistenceContext = factory.bootstrapPersistenceContext(persistenceUnit, in, new HashMap<String, Object>(), replace);
+ persistenceContext = factory.bootstrapPersistenceContext(persistenceUnit, in, properties, replace);
}
} catch (Exception e){
e.printStackTrace();
@@ -163,9 +168,9 @@
@GET
@Path("{context}")
@Consumes({ MediaType.WILDCARD})
- public Response getTypes(@PathParam("context") String persistenceUnit, @Context HttpHeaders hh) {
+ public Response getTypes(@PathParam("context") String persistenceUnit, @Context HttpHeaders hh, @Context UriInfo uriInfo) {
ResponseBuilder rb = new ResponseBuilderImpl();
- PersistenceContext app = get(persistenceUnit);
+ PersistenceContext app = get(persistenceUnit, uriInfo.getBaseUri());
if (app == null){
rb.status(Status.NOT_FOUND);
} else {
@@ -199,7 +204,7 @@
@GET
@Path("{context}/entity/{type}")
public Response find(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, @Context UriInfo ui) {
- PersistenceContext app = get(persistenceUnit);
+ PersistenceContext app = get(persistenceUnit, ui.getBaseUri());
Object id = IdHelper.buildId(app, type, ui.getQueryParameters());
Object entity = app.find(getTenantId(hh), type, id);
@@ -215,8 +220,8 @@
@PUT
@Path("{context}/entity/{type}")
- public Response create(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, InputStream in) {
- PersistenceContext app = get(persistenceUnit);
+ public Response create(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, @Context UriInfo uriInfo, InputStream in) {
+ PersistenceContext app = get(persistenceUnit, uriInfo.getBaseUri());
DynamicEntity entity = unmarshalEntity(app, type, getTenantId(hh), mediaType(hh.getAcceptableMediaTypes()), in);
app.create(getTenantId(hh), entity);
@@ -228,11 +233,11 @@
@POST
@Path("{context}/entity/{type}")
- public StreamingOutput update(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, InputStream in) {
- PersistenceContext app = get(persistenceUnit);
+ public StreamingOutput update(@PathParam("context") String persistenceUnit, @PathParam("type") String type, @Context HttpHeaders hh, @Context UriInfo uriInfo, InputStream in) {
+ PersistenceContext app = get(persistenceUnit, uriInfo.getBaseUri());
String tenantId = getTenantId(hh);
MediaType contentType = mediaType(hh.getRequestHeader(HttpHeaders.CONTENT_TYPE));
- DynamicEntity entity = unmarshalEntity(app, type, tenantId, contentType, in);
+ Object entity = unmarshalEntity(app, type, tenantId, contentType, in);
entity = app.merge(type, tenantId, entity);
return new StreamingOutputMarshaller(app, entity, hh.getAcceptableMediaTypes());
}
@@ -240,8 +245,13 @@
@GET
@Path("{context}/query/{name}")
public StreamingOutput namedQuery(@PathParam("context") String persistenceUnit, @PathParam("name") String name, @Context HttpHeaders hh, @Context UriInfo ui) {
- PersistenceContext app = get(persistenceUnit);
- Object result = app.query(name, Service.getParameterMap(ui), false);
+long millis = System.currentTimeMillis();
+ System.out.println("Start Named Query " + name);
+ PersistenceContext app = get(persistenceUnit, ui.getBaseUri());
+ Object result = app.query(name, Service.getParameterMap(ui), Service.getHintMap(ui), false);
+
+
+ System.out.println("Named Query " + name + " Marshalling. time: " + (System.currentTimeMillis() - millis));
return new StreamingOutputMarshaller(app, result, hh.getAcceptableMediaTypes());
}
@@ -249,8 +259,8 @@
@Path("{context}/singleResultQuery/{name}")
@Produces(MediaType.WILDCARD)
public StreamingOutput namedQuerySingleResult(@PathParam("context") String persistenceUnit, @PathParam("name") String name, @Context HttpHeaders hh, @Context UriInfo ui) {
- PersistenceContext app = get(persistenceUnit);
- Object result = app.query(name, Service.getParameterMap(ui), true);
+ PersistenceContext app = get(persistenceUnit, ui.getBaseUri());
+ Object result = app.query(name, Service.getParameterMap(ui), Service.getHintMap(ui), true);
return new StreamingOutputMarshaller(app, result, hh.getAcceptableMediaTypes());
}
@@ -271,15 +281,35 @@
return parameters;
}
+ private static Map<String, Object> getHintMap(UriInfo info){
+ Map<String, Object> hints = new HashMap<String, Object>();
+ for(String key : info.getQueryParameters().keySet()) {
+ hints.put(key, info.getQueryParameters().getFirst(key));
+ }
+ return hints;
+ }
+
@GET
@Path("{context}/query")
public StreamingOutput adhocQuery(@PathParam("context") String persistenceUnit, @Context HttpHeaders hh, @Context UriInfo ui) {
throw new WebApplicationException(Status.SERVICE_UNAVAILABLE);
}
- private PersistenceContext get(String persistenceUnit) {
+ private PersistenceContext get(String persistenceUnit, URI defaultURI) {
PersistenceContext app = getPersistenceFactory().getPersistenceContext(persistenceUnit);
+ if (app == null){
+ try{
+ DynamicClassLoader dcl = new DynamicClassLoader(Thread.currentThread().getContextClassLoader());
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put(PersistenceUnitProperties.CLASSLOADER, dcl);
+ EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnit, properties);
+ if (factory != null){
+ app = getPersistenceFactory().bootstrapPersistenceContext(persistenceUnit, factory, defaultURI, true);
+ }
+ } catch (Exception e){}
+ }
+
if (app == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
@@ -309,6 +339,7 @@
throw new WebApplicationException(Status.BAD_REQUEST);
}
}
+
private String getURL(HttpHeaders hh){
List<String> persistenceXmlURLs = hh.getRequestHeader("persistenceXmlURL");
@@ -320,7 +351,7 @@
}
return persistenceXmlURLs.get(0);
}
-
+
@PreDestroy
public void close() {
factory.close();
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/eventlistener/DatabaseEventListenerFactory.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/eventlistener/DatabaseEventListenerFactory.java
new file mode 100644
index 0000000..2e5b1fd
--- /dev/null
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/eventlistener/DatabaseEventListenerFactory.java
@@ -0,0 +1,9 @@
+package org.eclipse.persistence.jpa.rs.eventlistener;
+
+import org.eclipse.persistence.platform.database.events.DatabaseEventListener;
+
+public interface DatabaseEventListenerFactory {
+
+ public DatabaseEventListener createDatabaseEventListener();
+
+}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSChangeNotificationListener.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSChangeNotificationListener.java
deleted file mode 100644
index da645ba..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSChangeNotificationListener.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * tware - initial
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.qcn;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import oracle.jdbc.OracleStatement;
-import oracle.jdbc.driver.OracleConnection;
-
-import org.eclipse.persistence.annotations.DatabaseChangeNotificationType;
-import org.eclipse.persistence.descriptors.CacheIndex;
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.descriptors.DescriptorEvent;
-import org.eclipse.persistence.descriptors.DescriptorEventAdapter;
-import org.eclipse.persistence.exceptions.DatabaseException;
-import org.eclipse.persistence.internal.databaseaccess.Accessor;
-import org.eclipse.persistence.internal.expressions.SQLSelectStatement;
-import org.eclipse.persistence.internal.helper.DatabaseField;
-import org.eclipse.persistence.internal.helper.DatabaseTable;
-import org.eclipse.persistence.internal.identitymaps.CacheId;
-import org.eclipse.persistence.internal.identitymaps.CacheKey;
-import org.eclipse.persistence.internal.sessions.AbstractRecord;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
-import org.eclipse.persistence.logging.SessionLog;
-import org.eclipse.persistence.mappings.DatabaseMapping;
-import org.eclipse.persistence.queries.ValueReadQuery;
-import org.eclipse.persistence.sessions.Session;
-
-import org.eclipse.persistence.jpa.rs.util.ChangeListener;
-
-/**
- * TODO
- *
- * @author tware
- * @since EclipseLink 2.4.0
- */
-public class JPARSChangeNotificationListener extends org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener {
-
- public Set<ChangeListener> changeListeners = null;
-
- public JPARSChangeNotificationListener() {
- super();
- changeListeners = new HashSet<ChangeListener>();
- }
-
- public void addChangeListener(ChangeListener changeListener){
- changeListeners.add(changeListener);
- }
-
- public Set<ChangeListener> getChangeListeners(){
- return changeListeners;
- }
-
- public void remove(Session session) {
- super.remove(session);
- }
-
- /**
- * INTERNAL:
- * Register the event listener with the database.
- */
- public void register(Session session) {
- final AbstractSession databaseSession = (AbstractSession)session;
- // Determine which tables should be tracked for change events.
- this.descriptorsByTable = new HashMap<DatabaseTable, ClassDescriptor>();
- for (ClassDescriptor descriptor : session.getDescriptors().values()) {
- if (!descriptor.getTables().isEmpty()) {
- if ((descriptor.getCachePolicy().getDatabaseChangeNotificationType() != null)
- && (descriptor.getCachePolicy().getDatabaseChangeNotificationType() != DatabaseChangeNotificationType.NONE)) {
- this.descriptorsByTable.put(descriptor.getTables().get(0), descriptor);
- }
- }
- }
- Accessor accessor = databaseSession.getAccessor();
- accessor.incrementCallCount(databaseSession);
- try {
- OracleConnection connection = (OracleConnection)databaseSession.getServerPlatform().unwrapConnection(accessor.getConnection());
- databaseSession.log(SessionLog.FINEST, SessionLog.CONNECTION, "dcn_registering");
- Properties properties = new Properties();
- properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
- properties.setProperty(OracleConnection.DCN_IGNORE_INSERTOP, "false");
- try {
- // Register with the database change notification, the connection is not relevant, the events occur after the connection is closed,
- // and a different connection can be used to unregister the event listener.
- this.register = connection.registerDatabaseChangeNotification(properties);
- final List<DatabaseField> fields = new ArrayList<DatabaseField>();
- fields.add(new DatabaseField(ROWID));
- this.register.addListener(new JPARSDatabaseChangeListener(this, databaseSession));
- // Register each table for database events, this is done by executing a select from the table.
- for (DatabaseTable table : this.descriptorsByTable.keySet()) {
- OracleStatement statement = (OracleStatement)connection.createStatement();
- statement.setDatabaseChangeRegistration(this.register);
- try {
- statement.executeQuery("SELECT ROWID FROM " + table.getQualifiedName()).close();
- databaseSession.log(SessionLog.FINEST, SessionLog.CONNECTION, "dcn_register_table", table.getQualifiedName());
- } catch (Exception failed) {
- // This will fail if the table does not exist,
- // just log the error to allow table creation to work.
- databaseSession.logThrowable(SessionLog.WARNING, SessionLog.SQL, failed);
- } finally {
- statement.close();
- }
- }
- } catch (SQLException exception) {
- throw DatabaseException.sqlException(exception, databaseSession.getAccessor(), databaseSession, false);
- }
- } finally {
- accessor.decrementCallCount();
- }
- }
-
- /**
- * Initialize the descriptor to receive database change events.
- * This is called when the descriptor is initialized.
- */
- public void initialize(final ClassDescriptor descriptor, AbstractSession session) {
- if (descriptor.getOptimisticLockingPolicy() == null) {
- boolean requiresLocking = descriptor.hasMultipleTables();
- for (DatabaseMapping mapping : descriptor.getMappings()) {
- if (mapping.isCollectionMapping()) {
- requiresLocking = true;
- }
- }
- if (requiresLocking) {
- session.log(SessionLog.WARNING, SessionLog.EJB_OR_METADATA, "locking_required_for_database_change_notification", descriptor.getJavaClass());
- }
- }
- final DatabaseField rowId = descriptor.buildField(new DatabaseField(ROWID));
- final List<DatabaseField> fields = new ArrayList<DatabaseField>();
- fields.add(rowId);
- // May already have the index if has inheritance.
- CacheIndex existingIndex = descriptor.getCachePolicy().getCacheIndex(fields);
- if (existingIndex == null) {
- if (descriptor.isChildDescriptor()) {
- existingIndex = descriptor.getInheritancePolicy().getRootParentDescriptor().getCachePolicy().getCacheIndex(fields);
- }
- if (existingIndex == null) {
- existingIndex = new CacheIndex(fields);
- existingIndex.setIsUpdatable(false);
- existingIndex.setIsInsertable(false);
- }
- descriptor.getCachePolicy().addCacheIndex(existingIndex);
- }
-
- final CacheIndex index = existingIndex;
- rowId.setInsertable(false);
- rowId.setUpdatable(false);
- rowId.setCreatable(false);
- descriptor.getFields().add(rowId);
- descriptor.getAllFields().add(rowId);
-
- final ValueReadQuery rowIdQuery = new ValueReadQuery();
- rowIdQuery.setName(ROWID);
- SQLSelectStatement sqlStatement = new SQLSelectStatement();
- sqlStatement.setWhereClause(descriptor.getObjectBuilder().getPrimaryKeyExpression());
- sqlStatement.addField(rowId);
- sqlStatement.addTable(descriptor.getTables().get(0));
- rowIdQuery.setSQLStatement(sqlStatement);
- sqlStatement.normalize(session, null);
-
- descriptor.getEventManager().addListener(new DescriptorEventAdapter() {
- @Override
- public void postMerge(DescriptorEvent event) {
- if ((event.getChangeSet() != null) && event.getChangeSet().hasChanges()) {
- Object id = event.getChangeSet().getId();
- CacheKey cacheKey = event.getChangeSet().getActiveCacheKey();
- if (cacheKey == null) {
- cacheKey = event.getSession().getParent().getIdentityMapAccessorInstance().getIdentityMapManager().getCacheKeyForObject(id, descriptor.getJavaClass(), descriptor, false);
- }
- cacheKey.setTransactionId(event.getSession().getProperty(ORA_TRANSACTION_ID));
- if (event.getChangeSet().isNew()) {
- AbstractRecord row = descriptor.getObjectBuilder().buildRowFromPrimaryKeyValues(id, event.getSession());
- Object rowid = event.getSession().executeQuery(rowIdQuery, row);
- CacheId indexValue = new CacheId(new Object[]{rowid});
- event.getSession().getParent().getIdentityMapAccessorInstance().getIdentityMapManager().putCacheKeyByIndex(index, indexValue, cacheKey, descriptor);
- }
- }
- }
- @Override
- public void postUpdate(DescriptorEvent event) {
- Object txId = event.getSession().getProperty(ORA_TRANSACTION_ID);
- if (txId == null) {
- txId = event.getSession().executeQuery(transactionIdQuery);
- event.getSession().setProperty(ORA_TRANSACTION_ID, txId);
- }
- }
-
- @Override
- public void postInsert(DescriptorEvent event) {
- Object txId = event.getSession().getProperty(ORA_TRANSACTION_ID);
- if (txId == null) {
- txId = event.getSession().executeQuery(transactionIdQuery);
- event.getSession().setProperty(ORA_TRANSACTION_ID, txId);
- }
- }
- });
- }
-
-
- public void removeChangeListener(ChangeListener changeListener){
- changeListeners.remove(changeListener);
- }
-
- public void objectUpdated(Object object){
- for (ChangeListener listener: changeListeners){
- listener.objectUpdated(object);
- }
- }
-
- public void objectInserted(Object object){
- for (ChangeListener listener: changeListeners){
- listener.objectInserted(object);
- }
- }
-
-}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java
deleted file mode 100644
index 72ef625..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/qcn/JPARSDatabaseChangeListener.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * dclarke/tware - initial
- * tware
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.qcn;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.persistence.descriptors.CacheIndex;
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.expressions.Expression;
-import org.eclipse.persistence.expressions.ExpressionBuilder;
-import org.eclipse.persistence.internal.helper.DatabaseField;
-import org.eclipse.persistence.internal.helper.DatabaseTable;
-import org.eclipse.persistence.internal.identitymaps.CacheId;
-import org.eclipse.persistence.internal.identitymaps.CacheKey;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
-import org.eclipse.persistence.logging.SessionLog;
-import org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener;
-import org.eclipse.persistence.queries.ReadObjectQuery;
-
-import oracle.jdbc.dcn.DatabaseChangeEvent;
-import oracle.jdbc.dcn.DatabaseChangeListener;
-import oracle.jdbc.dcn.RowChangeDescription;
-import oracle.jdbc.dcn.TableChangeDescription;
-import oracle.jdbc.dcn.RowChangeDescription.RowOperation;
-
-/**
- * TODO
- *
- * @author tware
- * @since EclipseLink 2.4.0
- */
-public class JPARSDatabaseChangeListener implements DatabaseChangeListener {
-
- private JPARSChangeNotificationListener owner = null;
- private AbstractSession session = null;
-
- public JPARSDatabaseChangeListener(JPARSChangeNotificationListener owner, AbstractSession session){
- this.owner = owner;
- this.session = session;
- }
-
- public void onDatabaseChangeNotification(DatabaseChangeEvent changeEvent) {
- session.log(SessionLog.FINEST, SessionLog.CONNECTION, "dcn_change_event", changeEvent);
- if (changeEvent.getTableChangeDescription() != null) {
- final List<DatabaseField> fields = new ArrayList<DatabaseField>();
- fields.add(new DatabaseField(OracleChangeNotificationListener.ROWID));
- for (TableChangeDescription tableChange : changeEvent.getTableChangeDescription()) {
- ClassDescriptor descriptor = owner.getDescriptorsByTable().get(new DatabaseTable(tableChange.getTableName()));
- if (descriptor != null) {
- CacheIndex index = descriptor.getCachePolicy().getCacheIndex(fields);
- for (RowChangeDescription rowChange : tableChange.getRowChangeDescription()) {
- if (rowChange.getRowOperation().equals(RowOperation.INSERT) || rowChange.getRowOperation().equals(RowOperation.UPDATE)){
- CacheId id = new CacheId(new Object[]{rowChange.getRowid().stringValue()});
- CacheKey key = session.getIdentityMapAccessorInstance().getIdentityMapManager().getCacheKeyByIndex(
- index, id, true, descriptor);
- Object updatedObject = null;
- if ((key == null) || (key.getTransactionId() == null) || !key.getTransactionId().equals(changeEvent.getTransactionId(true))) {
- ExpressionBuilder builder = new ExpressionBuilder();
- Expression expression = builder.getField(OracleChangeNotificationListener.ROWID).equal(rowChange.getRowid());
- ReadObjectQuery query = new ReadObjectQuery(descriptor.getJavaClass(), expression);
- query.refreshIdentityMapResult();
- updatedObject = session.executeQuery(query);
- } else {
- updatedObject = key.getObject();
- }
- if (rowChange.getRowOperation().equals(RowOperation.INSERT)){
- owner.objectInserted(updatedObject);
- } else {
- owner.objectUpdated(updatedObject);
- }
- }
- }
- }
-
- }
-
- }
- }
-}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DatabaseListener.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DatabaseListener.java
new file mode 100644
index 0000000..90fa854
--- /dev/null
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DatabaseListener.java
@@ -0,0 +1,11 @@
+package org.eclipse.persistence.jpa.rs.util;
+
+import org.eclipse.persistence.platform.database.events.DatabaseEventListener;
+
+public interface DatabaseListener extends DatabaseEventListener {
+
+ public void addChangeListener(ChangeListener listener);
+
+ public void removeChangeListener(ChangeListener listener);
+
+}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
index 5d1781b..43d8f17 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
@@ -65,10 +65,14 @@
xmlBindings.setXmlSchema(xmlSchema);
for (ClassDescriptor ormDescriptor : session.getProject().getOrderedDescriptors()) {
- javaTypes.getJavaType().add(createJAXBType(ormDescriptor, objectFactory));
+ String descriptorPackageName = ormDescriptor.getJavaClassName().substring(0, ormDescriptor.getJavaClassName().lastIndexOf('.'));
+ if (descriptorPackageName.equals(packageName)){
+ javaTypes.getJavaType().add(createJAXBType(ormDescriptor, objectFactory));
+ }
}
}
+
private JavaType createJAXBType(ClassDescriptor classDescriptor, ObjectFactory objectFactory) {
JavaType javaType = new JavaType();
javaType.setName(classDescriptor.getAlias());
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
index 4f6827f..12c330e 100644
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
+++ b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
@@ -30,8 +30,10 @@
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.StreamingOutput;
import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl;
@@ -63,6 +65,8 @@
}
public void write(OutputStream output) throws IOException, WebApplicationException {
+long millis = System.currentTimeMillis();
+ System.out.println("SteamingOutputMarshaller About to write ");
if (this.context != null && this.context.getJAXBContext() != null && this.result != null && !this.mediaType.equals(MediaType.WILDCARD_TYPE)) {
try {
Marshaller marshaller = createMarshaller(context, mediaType);
@@ -75,7 +79,9 @@
Iterator<Object> i = objs.iterator();
writer.write("[");
if (i.hasNext()) {
- marshaller.marshal(i.next(), writer);
+ Object element = i.next();
+ //JAXBElement jaxbElement = new JAXBElement(new QName(null, "data"), element.getClass(), element);
+ marshaller.marshal(element, writer);
while (i.hasNext()) {
writer.write(",");
marshaller.marshal(i.next(), writer);
@@ -117,6 +123,8 @@
oos.close();
output.write(baos.toByteArray());
}
+ System.out.println("SteamingOutputMarshaller done write. time: " + (System.currentTimeMillis() - millis));
+
}
/**
@@ -160,12 +168,14 @@
marshaller.setAdapter(new LinkAdapter(context.getBaseURI().toString(), context));
marshaller.setListener(new Marshaller.Listener() {
@Override
- public void beforeMarshal(Object source) {
- DynamicEntityImpl sourceImpl = (DynamicEntityImpl)source;
- PropertyChangeListener listener = sourceImpl._persistence_getPropertyChangeListener();
- sourceImpl._persistence_setPropertyChangeListener(null);
- ((DynamicEntity)source).set("self", source);
- sourceImpl._persistence_setPropertyChangeListener(listener);
+ public void beforeMarshal(Object source) {
+ if (source instanceof DynamicEntity){
+ DynamicEntityImpl sourceImpl = (DynamicEntityImpl)source;
+ PropertyChangeListener listener = sourceImpl._persistence_getPropertyChangeListener();
+ sourceImpl._persistence_setPropertyChangeListener(null);
+ ((DynamicEntity)source).set("self", source);
+ sourceImpl._persistence_setPropertyChangeListener(listener);
+ }
}
});
return marshaller;
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java
deleted file mode 100644
index a24e1e3..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/ApplicationListener.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * dclarke/tware - initial
- * tware
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.websockets;
-
-import java.util.logging.Logger;
-
-import org.eclipse.persistence.jpa.rs.PersistenceContext;
-import org.eclipse.persistence.jpa.rs.util.ChangeListener;;
-
-public class ApplicationListener implements ChangeListener {
- static final Logger logger = Logger.getLogger("ApplicationListener");
-
- private JPARSWebSocket socket;
- private PersistenceContext context;
-
- public ApplicationListener(JPARSWebSocket webSocket, PersistenceContext context) {
- this.socket = webSocket;
- this.context = context;
- }
-
- @Override
- public void objectUpdated(Object object) {
- this.socket.sendUpdate(this.context, object);
- }
-
- @Override
- public void objectInserted(Object object) {
- this.socket.sendInsert(this.context, object);
- }
-
- public void register() {
- logger.info(this + " registering with application");
- this.context.addListener(this);
- }
-
- public void unregister() {
- logger.info(this + " unregistering from application");
- this.context.remove(this);
- }
-
- public JPARSWebSocket getSocket() {
- return socket;
- }
-
- public PersistenceContext getApplication() {
- return context;
- }
-
-
-
-
-}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java
deleted file mode 100644
index 6a865c6..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * ssmith - initial
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.websockets;
-
-import static org.eclipse.persistence.jaxb.JAXBContext.MEDIA_TYPE;
-
-import java.beans.PropertyChangeListener;
-import java.io.StringWriter;
-import java.util.logging.Logger;
-
-import javax.ws.rs.core.MediaType;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-
-import org.eclipse.persistence.dynamic.DynamicEntity;
-import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl;
-import org.eclipse.persistence.internal.helper.Helper;
-
-import org.eclipse.persistence.jpa.rs.PersistenceContext;
-import org.eclipse.persistence.jpa.rs.util.LinkAdapter;
-import org.eclipse.persistence.jpa.rs.util.StreamingOutputMarshaller;
-
-import com.sun.grizzly.websockets.DataFrame;
-import com.sun.grizzly.websockets.DefaultWebSocket;
-import com.sun.grizzly.websockets.ProtocolHandler;
-import com.sun.grizzly.websockets.WebSocketListener;
-
-public class JPARSWebSocket extends DefaultWebSocket {
- static final Logger logger = Logger.getLogger("JPARSWebSocket");
- private Registration registration;
- private ApplicationListener listener;
-
- public JPARSWebSocket(ProtocolHandler handler, WebSocketListener[] listeners) {
- super(handler, listeners);
- }
-
- public Registration getRegistration() {
- return registration;
- }
-
- public void setRegistration(Registration registration) {
- this.registration = registration;
- }
-
- public void setApplication(PersistenceContext context) {
- this.listener = new ApplicationListener(this, context);
- this.listener.register();
- }
-
- @Override
- public void onClose(DataFrame frame) {
- if (this.listener != null) {
- this.listener.unregister();
- }
- super.onClose(frame);
- }
-
- public void sendInsert(PersistenceContext application, Object entity) {
- send(application, entity);
- }
-
- public void sendUpdate(PersistenceContext application, Object entity) {
- send(application, entity);
- }
-
- protected void send(PersistenceContext application, Object entity) {
- String entityName = Helper.getShortClassName(entity.getClass());
- if (ofInterest(application, entity, entityName)) {
- String json = marshallEntity(application, entity);
- if (json == null) {
- logger.severe("Entity did not marshall, not sending: " + entity);
- } else {
- String wrappedJson =
- "{" +
- "\"url\" : \"persistence/" + application.getName() + "/" + entityName + "\", " +
- "\"data\" : " + json +
- "}";
- logger.info(this + " sending: " + wrappedJson);
- send(wrappedJson);
- }
- }
- }
-
- /**
- * Answer whether the socket should send the update. The application name must
- * match but the entity name is optional and will only be used if not null. This
- * allows clients to register interest in changes to all entities in an application.
- *
- * @param application
- * @param entity
- * @param entityName
- * @return
- */
- private boolean ofInterest(PersistenceContext application, Object entity, String entityName) {
- String appName = application.getName();
- if ((appName == null) || (getRegistration() == null)) {
- return false;
- }
-
- boolean appNameMatches = appName.equals(getRegistration().getAppName());
- boolean entityNameMatches = (getRegistration().getEntityName() == null)
- || (getRegistration().getEntityName().equals(entityName));
- return appNameMatches && entityNameMatches;
- }
-
- protected String marshallEntity(PersistenceContext context, Object entity) {
- try {
- Marshaller marshaller = StreamingOutputMarshaller.createMarshaller(context, MediaType.APPLICATION_JSON_TYPE);
- StringWriter stringWriter = new StringWriter();
- marshaller.marshal(entity, stringWriter);
-
- String jsonString = stringWriter.toString();
- return jsonString;
- } catch (Exception e) {
- logger.severe("Failed to marshall object: " + entity + ", exception: " + e.getMessage());
- return null;
- }
- }
-
-}
\ No newline at end of file
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocketApplication.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocketApplication.java
deleted file mode 100644
index 928c913..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocketApplication.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * ssmith - initial
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.websockets;
-
-import static org.eclipse.persistence.jaxb.JAXBContext.MEDIA_TYPE;
-
-import java.io.StringReader;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Logger;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.ejb.EJB;
-import javax.ejb.Singleton;
-import javax.ejb.Startup;
-import javax.ws.rs.core.MediaType;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.stream.StreamSource;
-
-import org.eclipse.persistence.jpa.rs.PersistenceContext;
-import org.eclipse.persistence.jpa.rs.PersistenceFactory;
-
-import com.sun.grizzly.tcp.Request;
-import com.sun.grizzly.websockets.ProtocolHandler;
-import com.sun.grizzly.websockets.WebSocket;
-import com.sun.grizzly.websockets.WebSocketApplication;
-import com.sun.grizzly.websockets.WebSocketEngine;
-import com.sun.grizzly.websockets.WebSocketListener;
-
-@Singleton
-@Startup
-public class JPARSWebSocketApplication extends WebSocketApplication {
- static final Logger logger = Logger.getLogger("JPARSWebSocketApplication");
- protected JAXBContext jaxbContext;
- protected PersistenceFactory factory;
- protected Map<PersistenceContext, ApplicationListener> applicationToListener = new ConcurrentHashMap<PersistenceContext, ApplicationListener>();
-
- public JPARSWebSocketApplication() {
- logger.info("JPARSWebSocketApplication created: " + this);
-// initialize();
- try {
- jaxbContext = JAXBContext.newInstance(Registration.class);
- } catch (JAXBException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- @PostConstruct
- public void initialize() {
- logger.info(this + " Registering JPARSWebSocket Application with WebSocketEngine");
- WebSocketEngine.getEngine().register(this);
- }
-
- @PreDestroy
- public void cleanup() {
- logger.info(this + " Unregistering JPARSWebSocket Application from WebSocketEngine");
- WebSocketEngine.getEngine().unregister(this);
- }
-
- public PersistenceFactory getFactory() {
- return this.factory;
- }
-
- @EJB
- public void setRepository(PersistenceFactory factory) {
- this.factory = factory;
- }
-
- @Override
- public WebSocket createWebSocket(ProtocolHandler protocolHandler, WebSocketListener... listeners) {
- return new JPARSWebSocket(protocolHandler, listeners);
- }
-
- @Override
- public boolean isApplicationRequest(Request request) {
- String uri = request.requestURI().toString();
- return uri.endsWith("/ws");
- }
-
- @Override
- public void onMessage(WebSocket socket, String text) {
- logger.info(socket + " message received: " + text);
- JPARSWebSocket jparsSocket = (JPARSWebSocket) socket;
- try {
- Registration message = unmarshallMessage(text);
- jparsSocket.setRegistration(message);
- PersistenceContext application = this.factory.getPersistenceContext(message.getAppName());
- if (application != null){
- jparsSocket.setApplication(application);
- } else {
- logger.info("Message recieved for unavailable application: " + message.getAppName() + " closing socket.");
- closeSocket(jparsSocket);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- logger.info(jparsSocket + " exception processing message, closing socket");
- closeSocket(jparsSocket);
- }
- }
-
- @Override
- public boolean add(WebSocket socket) {
- logger.info(socket + " add");
- boolean success = super.add(socket);
- logger.info("After add now managing sockets: " + getWebSockets().size());
- return success;
- }
-
- @Override
- public boolean remove(WebSocket socket) {
- JPARSWebSocket chatSocket = (JPARSWebSocket) socket;
- logger.info(socket + " remove: " + chatSocket.getRegistration());
- boolean success = super.remove(socket);
- logger.info("After remove now managing sockets: " + getWebSockets().size());
- return success;
- }
-
-
- protected void closeSocket(WebSocket socket) {
- try {
- socket.close(WebSocket.INVALID_DATA);
- } catch (Exception e2) {
- logger.info(socket + " exception closing socket: " + e2.getMessage());
- }
- }
-
- public Registration unmarshallMessage(String text) throws JAXBException,
- PropertyException {
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- unmarshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_JSON);
- StringReader reader = new StringReader(text);
- StreamSource inSource = new StreamSource(reader);
- JAXBElement<Registration> jaxbElement = unmarshaller.unmarshal(
- inSource, Registration.class);
- Registration message = jaxbElement.getValue();
- return message;
- }
-
-
-
-
-}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java
deleted file mode 100644
index 3d3e908..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/Registration.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oracle. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * dclarke/tware - initial
- * tware
- ******************************************************************************/
-package org.eclipse.persistence.jpa.rs.websockets;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Registration {
-
- private String appName;
- private String entityName;
-
- public String getAppName() {
- return appName;
- }
- public void setAppName(String appName) {
- this.appName = appName;
- }
- public String getEntityName() {
- return entityName;
- }
- public void setEntityName(String entityName) {
- this.entityName = entityName;
- }
- @Override
- public String toString() {
- return "Registration [appName=" + appName + ", entityName="
- + entityName + "]";
- }
-}
diff --git a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/jaxb.properties b/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/jaxb.properties
deleted file mode 100644
index 5837a4c..0000000
--- a/JPA-RS/org.eclipse.persistence.jpars/src/org/eclipse/persistence/jpa/rs/websockets/jaxb.properties
+++ /dev/null
@@ -1 +0,0 @@
-javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
\ No newline at end of file