modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/jaxb/WebServiceMapAdapter.java | 51 ++++++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java | 2 2 files changed, 53 insertions(+)
New commits: commit 48930bae6ee5f95142f76aafd9da7f684f8c9a43 Merge: c45a4ed 769949f Author: Filip Drabek fdrabek@dhcp-lab-136.englab.brq.redhat.com Date: Mon Mar 28 23:29:48 2011 +0200
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit c45a4ed71306601af814364822149e20277bb4e7 Author: Filip Drabek fdrabek@dhcp-lab-136.englab.brq.redhat.com Date: Mon Mar 28 23:28:26 2011 +0200
JAXB adapter for Map<Integer,String>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/jaxb/WebServiceMapAdapter.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/jaxb/WebServiceMapAdapter.java new file mode 100644 index 0000000..004576e --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/jaxb/WebServiceMapAdapter.java @@ -0,0 +1,51 @@ +package org.rhq.enterprise.server.jaxb; + +import java.util.HashMap; +import java.util.Map; + +import javax.jws.WebResult; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.XmlAdapter; + +import org.rhq.enterprise.server.system.ServerVersion; + +/** See the javadoc for the XmlAdapter itself for a more complete explanation, but simply + * put the adapter maps types that JAXB has difficulty serializing(Ex. Map<Integer,String>) + * to java types that JAXB can actually serialize. From a JAXB perspective think of the + * problematic types as opaque to JAXB and the map to type in a marshal as the serializable + * type. + * + * @author Simeon Pinder + * @author Filip Drabek + * + */ +@XmlType(namespace = ServerVersion.namespace) +public class WebServiceMapAdapter extends XmlAdapter<Object[], Map<Integer, String>> { + + @WebResult(targetNamespace = ServerVersion.namespace) + public Object[] marshal(Map<Integer, String> opaque) throws Exception { + Object[] bag = null; + if (opaque != null) { + int i = 0; + bag = new Object[2 * opaque.size()]; + for (Map.Entry<Integer, String> mapEntry : opaque.entrySet()) { + bag[i++] = mapEntry.getKey(); + bag[i++] = mapEntry.getValue(); + } + } else { + bag = new Object[0]; + } + return bag; + } + + @WebResult(targetNamespace = ServerVersion.namespace) + public Map<Integer, String> unmarshal(Object[] marshallable) throws Exception { + Map<Integer, String> map = new HashMap<Integer, String>(); + if (marshallable != null) { + for (int i = 0; i < marshallable.length; i += 2) { + map.put((Integer) marshallable[i], (String) marshallable[i + 1]); + } + } + return map; + } +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java index 9d1c269..0fcc193 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java @@ -35,6 +35,7 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceAncestryFormat; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.server.jaxb.WebServiceMapAdapter; import org.rhq.enterprise.server.jaxb.adapter.ResourceListAdapter; import org.rhq.enterprise.server.system.ServerVersion;
@@ -153,6 +154,7 @@ public interface ResourceManagerRemote { * @return A Map of ResourceIds to FormattedAncestryStrings, one entry for each unique, valid, resourceId passed in. */ @WebMethod + @XmlJavaTypeAdapter(value = WebServiceMapAdapter.class) Map<Integer, String> getResourcesAncestry( // @WebParam(name = "subject") Subject subject, // @WebParam(name = "resourceIds") Integer[] resourceIds, //