Support for links
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java
index 79cb3af..21b8190 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/CustomSerializationMetadataSource.java
@@ -49,10 +49,10 @@
JavaTypes javaTypes = new JavaTypes();
xmlBindings.setJavaTypes(javaTypes);
- addSerializationTypes(persistenceUnitName, session, objectFactory, javaTypes);
+ addSerializationTypes(persistenceUnitName, session, objectFactory, javaTypes, packageName);
}
- private void addSerializationTypes(String persistenceUnitName, Server session, ObjectFactory objectFactory, JavaTypes javaTypes){
+ private void addSerializationTypes(String persistenceUnitName, Server session, ObjectFactory objectFactory, JavaTypes javaTypes, String packageName){
for (ClassDescriptor ormDescriptor : session.getProject().getOrderedDescriptors()) {
@@ -69,7 +69,7 @@
serializationType.getJavaAttributes().getJavaAttribute().add(objectFactory.createXmlElement(xmlElement));
- // serializationType.getJavaAttributes().getJavaAttribute().add(DynamicXMLMetadataSource.createSelfProperty(ormDescriptor.getAlias() + "ListWrapper", objectFactory));
+ serializationType.getJavaAttributes().getJavaAttribute().add(DynamicXMLMetadataSource.createSelfProperty(packageName + "." + ormDescriptor.getAlias() + "ListWrapper", objectFactory));
org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement root = new org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement();
root.setName(ormDescriptor.getAlias() + "ListWrapper");
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
index c141294..060f758 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/DynamicXMLMetadataSource.java
@@ -76,7 +76,7 @@
for (DatabaseMapping ormMapping : classDescriptor.getMappings()) {
javaType.getJavaAttributes().getJavaAttribute().add(createJAXBProperty(ormMapping, objectFactory));
}
- // javaType.getJavaAttributes().getJavaAttribute().add(createSelfProperty(classDescriptor.getJavaClassName(), objectFactory));
+ javaType.getJavaAttributes().getJavaAttribute().add(createSelfProperty(classDescriptor.getJavaClassName(), objectFactory));
// Make them all root elements for now
javaType.setXmlRootElement(new org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement());
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/LinkAdapter.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/LinkAdapter.java
index 80dac13..c11d6d1 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/LinkAdapter.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/LinkAdapter.java
@@ -23,6 +23,7 @@
import org.eclipse.persistence.config.QueryHints;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.dynamic.DynamicEntity;
+import org.eclipse.persistence.exceptions.DynamicException;
import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl;
import org.eclipse.persistence.internal.helper.ConversionManager;
import org.eclipse.persistence.internal.queries.EntityFetchGroup;
@@ -47,14 +48,19 @@
@Override
@SuppressWarnings("rawtypes")
// TODO Composite keys
- public Object unmarshal(String v) throws Exception {
+ public Object unmarshal(String v) throws Exception {
+ if (v.equals("")){
+ return null;
+ }
int lastSlash = v.lastIndexOf('/');
String entityType = v.substring(baseURI.length(), lastSlash);
String entityId = v.substring(lastSlash + 1);
ClassDescriptor descriptor = context.getDescriptor(entityType);
+ DatabaseMapping idMapping = getIdMapping(descriptor);
+ String idField = idMapping.getAttributeName();;
+ Class idType = idMapping.getAttributeClassification();;
Iterator<DatabaseMapping> i = descriptor.getMappings().iterator();
- String idField = null;
- Class idType = null;
+
while (i.hasNext()){
DatabaseMapping mapping = i.next();
if (mapping.isPrimaryKeyMapping()){
@@ -90,10 +96,26 @@
if (null == v) {
return null;
}
- DynamicEntity de = (DynamicEntity) v;
+ DynamicEntityImpl de = (DynamicEntityImpl) v;
+ DatabaseMapping idMapping = getIdMapping(context.getDescriptor(de.getType().getName()));
+ if (idMapping == null){
+ return "";
+ }
+ Object id = de.get(idMapping.getAttributeName());
String href = baseURI + v.getClass().getSimpleName() + "/"
- + de.get("id");
+ + id;
return href;
}
+
+ protected DatabaseMapping getIdMapping(ClassDescriptor descriptor){
+ Iterator<DatabaseMapping> i = descriptor.getMappings().iterator();
+ while (i.hasNext()){
+ DatabaseMapping mapping = i.next();
+ if (mapping.isPrimaryKeyMapping()){
+ return mapping;
+ }
+ }
+ return null;
+ }
}
\ No newline at end of file
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
index dfd5fee..5cf649a 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/util/StreamingOutputMarshaller.java
@@ -15,6 +15,7 @@
import static org.eclipse.persistence.jaxb.JAXBContext.MEDIA_TYPE;
+import java.beans.PropertyChangeListener;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
@@ -32,6 +33,8 @@
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
+import org.eclipse.persistence.dynamic.DynamicEntity;
+import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl;
import org.eclipse.persistence.jpa.rs.PersistenceContext;
/**
@@ -66,6 +69,16 @@
marshaller.setProperty(MEDIA_TYPE, this.mediaType.toString());
marshaller.setProperty(org.eclipse.persistence.jaxb.JAXBContext.INCLUDE_ROOT, false);
marshaller.setAdapter(new LinkAdapter("http://localhost:8080/JPA-RS/auction/entity/", 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);
+ }
+ });
if (result instanceof Collection) {
@SuppressWarnings("unchecked")
Collection<Object> objs = (Collection<Object>) result;
diff --git a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java
index 214f562..0e34a8a 100644
--- a/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java
+++ b/JPA-RS Incubator/JPA-RS/src/org/eclipse/persistence/jpa/rs/websockets/JPARSWebSocket.java
@@ -14,6 +14,7 @@
import static org.eclipse.persistence.jaxb.JAXBContext.MEDIA_TYPE;
+import java.beans.PropertyChangeListener;
import java.io.StringWriter;
import java.util.logging.Logger;
@@ -21,6 +22,8 @@
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;
@@ -102,6 +105,16 @@
marshaller.setProperty(MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(org.eclipse.persistence.jaxb.JAXBContext.INCLUDE_ROOT, false);
marshaller.setAdapter(new LinkAdapter("http://localhost:8080/JPA-RS/auction/entity/", 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);
+ }
+ });
StringWriter stringWriter = new StringWriter();
marshaller.marshal(entity, stringWriter);