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(a)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(a)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, //