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);