| | 74 | == Using !XmlRpcBeans in you API == |
| | 75 | |
| | 76 | What are !XmlRpcBeans?? |
| | 77 | |
| | 78 | Sometimes parameter conversion is a straight-forward task which can be handed over to the XML-RPC runtime system. |
| | 79 | When a java class fulfills certain conditions (roughly, being a java bean with compatible types) it can be turned into a !XmlRpcBean |
| | 80 | by annotating it with the @!XmlRpcBean annotation. It then can be used in every XML-RPC call without restriction.[[BR]] |
| | 81 | |
| | 82 | A !XmlRpcBean must have |
| | 83 | |
| | 84 | - a public constructor taking no arguments |
| | 85 | |
| | 86 | - like a java bean: for each property which is supposed to be transported over XML-RPC there has to exist a public getter and setter method |
| | 87 | |
| | 88 | - each property type has to be a XML-RPC compliant type, that is it has to have one of the follwoing properties: |
| | 89 | - it is a standard XML-RPC type |
| | 90 | - it is annotated with a @!XmlRpc annotation and defines proper conversion methods |
| | 91 | - a conversion mapping for that type is put at the !XmlRpcBean (which then acts as an API itself) |
| | 92 | - it is an !XmlRpcBean (that is, !XmlRpcBeans can be nested) |
| | 93 | - it is a Collection or Map containing a type which is XML-RPC compliant and is annotated with the @Contains annotation |
| | 94 | |
| | 95 | |
| | 96 | Technically, an !XmlRpcBean is converted into a XML-RPC STRUCT. The field names of the tranfered map are the property names derived from the bean class. |
| | 97 | |
| | 98 | |
| | 99 | Lets look at an example !XmlRpcBean (note that this bean also defines a converter mapping for type ''URL''): |
| | 100 | {{{ |
| | 101 | @XmlRpcBean |
| | 102 | @ConverterMappings( @Mapping(type=URL.class,converter=URLConverter.class) ) |
| | 103 | public class CoffeeBean |
| | 104 | { |
| | 105 | public URL getOrigin() |
| | 106 | { |
| | 107 | return mOrigin; |
| | 108 | } |
| | 109 | public void setOrigin( URL origin ) |
| | 110 | { |
| | 111 | mOrigin = origin; |
| | 112 | } |
| | 113 | public String getType() |
| | 114 | { |
| | 115 | return mType; |
| | 116 | } |
| | 117 | public void setType( String type ) |
| | 118 | { |
| | 119 | mType = type; |
| | 120 | } |
| | 121 | |
| | 122 | public String toString() |
| | 123 | { |
| | 124 | return( "CoffeeBean(" + getType() + ") comming from '" + getOrigin() + "'" ); |
| | 125 | } |
| | 126 | private String mType; |
| | 127 | private URL mOrigin; |
| | 128 | } |
| | 129 | }}} |
| | 130 | |
| | 131 | == Client side == |
| | 132 | |
| | 133 | Again, the client has no restrictions using the bean class: |
| | 134 | {{{ |
| | 135 | public interface Api |
| | 136 | { |
| | 137 | @Contains(CoffeeBean.class) |
| | 138 | Collection<CoffeeBean> getAllBeans(); |
| | 139 | } |
| | 140 | |
| | 141 | ---- |
| | 142 | |
| | 143 | Api remote_api = XmlRpc.createClient( Api.class, "handlerId", host, port ); |
| | 144 | |
| | 145 | Collection<CoffeeBean> beans = remote_api.getAllBeans(); |
| | 146 | |
| | 147 | for( CoffeeBeans b: beans ) |
| | 148 | { |
| | 149 | System.out.println( "Bean of type " + b.getType() + " comes from " + b.getOrigin() ); |
| | 150 | } |
| | 151 | ... |
| | 152 | }}} |
| | 153 | |
| | 154 | See also [http://delight.opendfki.de/wiki/ExampleUsingOwnConceteTypes#UsingowntypesinCollectionsandMaps How to use own types in Collections an Maps]. |
| | 155 | |
| | 156 | Examples in source code: [http://delight.opendfki.de/repos/trunk/XmlRpcDelight/src/examples/de/dfki/util/xmlrpc/examples/external_types/] |