package org.cagrid.dorian.soapclient; import java.io.StringWriter; import java.lang.reflect.Field; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.namespace.QName; import org.cagrid.dorian.DorianResourceProperties; import org.oasis_open.docs.wsrf._2004._06.wsrf_ws_resourceproperties_1_2_draft_01.GetResourcePropertyResponse; public class GetDorianResourceProperties extends DorianClientBase { private final Collection<ResourcePropertyDescriptor> resourcePropertyDescriptors; private final JAXBContext jaxbCtxt; private GetDorianResourceProperties(String url, Collection<ResourcePropertyDescriptor> resourcePropertyDescriptors) throws Exception { super(url); this.resourcePropertyDescriptors = resourcePropertyDescriptors; int n = resourcePropertyDescriptors.size(); Class<?>[] klasses = new Class<?>[n]; int i = 0; for (ResourcePropertyDescriptor resourcePropertyDescriptor : resourcePropertyDescriptors) { klasses[i++] = resourcePropertyDescriptor.resourcePropertyClass; } jaxbCtxt = JAXBContext.newInstance(klasses); } public static void main(String[] args) throws Exception { Collection<ResourcePropertyDescriptor> resourcePropertyDescriptors = getResourcePropertyDescriptors(DorianResourceProperties.class); GetDorianResourceProperties me = new GetDorianResourceProperties( LOCALS_URL, resourcePropertyDescriptors); me.getProperties(); QName badQName = new QName("bad", "name"); try { me.getProperty(badQName); } catch (Exception e) { System.out.println(badQName + " incurred " + e); } } private static Collection<ResourcePropertyDescriptor> getResourcePropertyDescriptors( Class<?> klass) { Collection<ResourcePropertyDescriptor> resourcePropertyDescriptors = new LinkedHashSet<ResourcePropertyDescriptor>(); for (; (klass != null) && (klass != Object.class); klass = klass .getSuperclass()) { getResourcePropertyDescriptors(klass, resourcePropertyDescriptors); } return resourcePropertyDescriptors; } private static void getResourcePropertyDescriptors(Class<?> klass, Collection<ResourcePropertyDescriptor> resourcePropertyDescriptors) { for (Field field : klass.getDeclaredFields()) { XmlElement xmlElement = field.getAnnotation(XmlElement.class); if (xmlElement == null) continue; Class<?> resourcePropertyClass = field.getType(); String resourcePropertyNamespace = xmlElement.namespace(); String resourcePropertyName = xmlElement.name(); QName resourcePropertyQName = new QName(resourcePropertyNamespace, resourcePropertyName); ResourcePropertyDescriptor resourcePropertyDescriptor = new ResourcePropertyDescriptor( resourcePropertyClass, resourcePropertyQName); resourcePropertyDescriptors.add(resourcePropertyDescriptor); } } private void getProperties() throws Exception { for (ResourcePropertyDescriptor resourcePropertyDescriptor : resourcePropertyDescriptors) { getProperty(resourcePropertyDescriptor.resourcePropertyQName); } } private void getProperty(QName propertyQName) throws Exception { GetResourcePropertyResponse getResourcePropertyResponse = dorian .getResourceProperty(propertyQName); List<Object> values = getResourcePropertyResponse.getAny(); System.out.println(); System.out.println(propertyQName); for (Object value : values) { if (value instanceof JAXBElement) { JAXBElement<?> jaxb = (JAXBElement<?>) value; Marshaller marshaller = jaxbCtxt.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter sw = new StringWriter(); marshaller.marshal(jaxb, sw); String xml = sw.toString(); System.out.println(xml); } else { System.out.println(value); } } } static class ResourcePropertyDescriptor { public final Class<?> resourcePropertyClass; public final QName resourcePropertyQName; public ResourcePropertyDescriptor(Class<?> resourcePropertyClass, QName resourcePropertyQName) { this.resourcePropertyClass = resourcePropertyClass; this.resourcePropertyQName = resourcePropertyQName; } @Override public boolean equals(Object obj) { if (!(obj instanceof ResourcePropertyDescriptor)) return false; ResourcePropertyDescriptor that = (ResourcePropertyDescriptor) obj; if (resourcePropertyClass != that.resourcePropertyClass) return false; return resourcePropertyQName.equals(that.resourcePropertyQName); } @Override public int hashCode() { return 31 * resourcePropertyClass.hashCode() + resourcePropertyQName.hashCode(); } @Override public String toString() { return resourcePropertyQName + " [" + resourcePropertyClass.getName() + "]"; } } }