Author: michiel
Date: 2009-09-10 14:33:51 +0200 (Thu, 10 Sep 2009)
New Revision: 38559

Modified:
   speeltuin/mihxil/webservice/cxf/src/main/java/demo/spring/HelloWorldImpl.java
   speeltuin/mihxil/webservice/example-webapp/src/main/webapp/index.jspx
Log:
some preparations for meeting tonight

Modified: 
speeltuin/mihxil/webservice/cxf/src/main/java/demo/spring/HelloWorldImpl.java
===================================================================
--- 
speeltuin/mihxil/webservice/cxf/src/main/java/demo/spring/HelloWorldImpl.java   
    2009-09-10 12:17:40 UTC (rev 38558)
+++ 
speeltuin/mihxil/webservice/cxf/src/main/java/demo/spring/HelloWorldImpl.java   
    2009-09-10 12:33:51 UTC (rev 38559)
@@ -3,7 +3,8 @@
 
 @WebService
 public class HelloWorldImpl implements HelloWorld {
-    public String sayHi(String text) {
+
+    public String sayHi(@org.mmbase.util.functions.Type("requiredfield") 
String text) {
         return "Hello " + text;
     }
 }

Modified: speeltuin/mihxil/webservice/example-webapp/src/main/webapp/index.jspx
===================================================================
--- speeltuin/mihxil/webservice/example-webapp/src/main/webapp/index.jspx       
2009-09-10 12:17:40 UTC (rev 38558)
+++ speeltuin/mihxil/webservice/example-webapp/src/main/webapp/index.jspx       
2009-09-10 12:33:51 UTC (rev 38559)
@@ -14,6 +14,8 @@
       <h2>Native, defined via component</h2>
       <p>This is by the way the block that reports all available web-services. 
This way that
       information is available as a web-service too</p>
+
+      <p><a 
href="https://scm.mmbase.org/speeltuin/mihxil/webservice/mmbase/src/main/config/webservices.xml";>Configuration</a></p>
       <ul>
         <li><a href="${mm:link('/ws/list.xml')}">XML</a></li>
         <li><a href="${mm:link('/ws/list.json')}">Json</a></li>
@@ -22,6 +24,7 @@
       </ul>
 
       <h2>Native, defined via function</h2>
+      <p><a 
href="https://scm.mmbase.org/speeltuin/mihxil/webservice/example-webapp/src/main/config/webservices.xml";>Configuration</a></p>
       <ul>
         <li><a href="${mm:link('/ws/password2.xml')}">XML</a></li>
         <li><a href="${mm:link('/ws/password2.json')}">Json</a></li>
@@ -42,6 +45,7 @@
         Btw parameters could receive a name using @Name annotation. (should we 
somehow also support
       the javax.ws annotations for that?)
       </p>
+      <p><a 
href="https://scm.mmbase.org/speeltuin/mihxil/webservice/cxf/src/main/resources/org/mmbase/config/webservices.xml";>Configuration</a></p>
       <ul>
         <li><a href="${mm:link('/ws/sayHi.xml')}">XML</a></li>
         <li><a href="${mm:link('/ws/sayHi.json')}">Json</a></li>
@@ -50,7 +54,149 @@
         <li><a href="${mm:link('/ws/sayHi.txt?World')}">Using an invalid 
argument</a></li>
       </ul>
 
+      <h2>Via an interface</h2>
+      <p><a 
href="https://scm.mmbase.org/speeltuin/mihxil/webservice/mmbase/src/main/java/org/mmbase/webservice/WebService.java";>WebService.java</a></p>
 
+      <p>This is the way I finally ended up using. TODO, make a working 
example here</p>
+
+      <pre><mm:escape><![CDATA[
+public class OrderWebService extends AbstractWebService {
+
+    public static final String NS = "http://api.eo.nl/uis";;
+
+    private final Parameter[] def;
+    private final List<Method> orderInfoSetters = new ArrayList<Method>();
+    private static final Parameter ACQ = new 
PatternParameter(Pattern.compile("p_[0-9]+_acqmethod"), 
DataTypes.getDataType("uis_product_acquisition_method"));
+
+    {
+        Parameter[] d;
+        try {
+            d = BeanFunction.getParameterDefinition(new OrderInfo(), 
orderInfoSetters);
+        } catch (Exception e) {
+            d = new Parameter[0];
+            log.error(e.getMessage(), e);
+
+        }
+        def = Functions.define(new Parameter[] { new Parameter.Wrapper(d),
+                                                 new Parameter("remarks", 
DataTypes.getDataType("uis_remarks")),
+                                                 new 
PatternParameter(Pattern.compile("p_[0-9]+_code"),      
DataTypes.getDataType("uis_product_code")),
+                                                 new 
PatternParameter(Pattern.compile("p_[0-9]+_quantity"),  
DataTypes.getDataType("uis_product_quantity")),
+                                                 ACQ,
+                                                 new 
PatternParameter(Pattern.compile("a_[0-9]+_name"),      
DataTypes.getDataType("uis_attribute_name")),
+                                                 new 
PatternParameter(Pattern.compile("a_[0-9]+_value"),     
DataTypes.getDataType("uis_attribute_value"))
+            }).toArray(Parameter.EMPTY);
+    }
+
+    Pattern NUMERIC = Pattern.compile("(.+)_([0-9]+)_(.+)");
+
+    public void serve(XMLStreamWriter writer, Parameters params) throws 
WebServiceException, XMLStreamException {
+
+        Map<Integer, Map<String, Object>> orders = new TreeMap<Integer, 
Map<String, Object>>();
+        Map<Integer, Map<String, Object>> attributes = new TreeMap<Integer, 
Map<String, Object>>();
+        OrderField of = new OrderField();
+        OrderInfo order = new OrderInfo();
+
+        try {
+            // The straight forward parameter associated with OrderInfo are 
set in the OrderInfo with this:
+            BeanFunction.setParameters(order, params, orderInfoSetters);
+
+
+            // Customized parameters assocaited with RemarkEntry's 
OrderEntry's and AttributeEntry are read now:
+
+            if (params.getString("remarks").length() > 0) {
+                of.add(new RemarkEntry(params.getString("remarks")));
+            }
+
+
+            for (Map.Entry<String, Object> entry : params.toMap().entrySet()) {
+                String param = entry.getKey();
+                Matcher matcher = NUMERIC.matcher(param);
+                if (matcher.matches()) {
+                    log.debug("Found " + param + "=" + 
Casting.toString(entry.getValue()));
+                    int number = Integer.parseInt(matcher.group(2));
+                    Map<String, Object> map;
+                    if (param.startsWith("p_")) {
+                        map = orders.get(number);
+                        if (map == null) map = new HashMap<String, Object>();
+                        orders.put(number, map);
+                    } else {
+                        map = attributes.get(number);
+                        if (map == null) map = new HashMap<String, Object>();
+                        attributes.put(number, map);
+                    }
+                    map.put(matcher.group(1) + "_" + matcher.group(3), 
Casting.toString(entry.getValue()));
+                } else {
+                    log.debug("" + param + " does not mach " + NUMERIC);
+                }
+            }
+        } catch (Exception e) {
+            throw new WebServiceException(e);
+        }
+        if (log.isDebugEnabled()) {
+            log.debug("" + params + " -> orders: " + orders + " attributes: " 
+ attributes);
+        }
+
+        List<String> errors = new ArrayList<String>();
+        try {
+            for (Map.Entry<Integer, Map<String, Object>> entry : 
orders.entrySet()) {
+                Map<String, Object> o = entry.getValue();
+                if (o.get("p_acqmethod") == null) {
+                    //  A bit of a hack, it would be nicer if default values 
were filled in automaticly, somehow.
+                    o.put("p_acqmethod", ACQ.getDefaultValue());
+                }
+                if (o.size() != 3) {
+                    errors.add(entry.getKey() + ":" + o + " does not define an 
order entry (it should have p_code, p_quantity and p_acqmethod");
+                    continue;
+                }
+                of.add(new OrderEntry(Casting.toString(o.get("p_code")), 
Casting.toInteger(o.get("p_quantity")), 
Casting.toString(o.get("p_acqmethod"))));
+            }
+            for (Map.Entry<Integer, Map<String, Object>> entry : 
attributes.entrySet()) {
+                Map<String, Object> att = entry.getValue();
+                if (att.size() != 2) {
+                    errors.add(entry.getKey() + ":" + att + " does not define 
an attribute (it should have a_name and a_value");
+                    continue;
+                }
+                of.add(new AttributeEntry(Casting.toString(att.get("a_name")), 
Casting.toString(att.get("a_value"))));
+            }
+        } catch (Exception e) {
+            throw new WebServiceException(HttpServletResponse.SC_BAD_REQUEST, 
e.getMessage());
+        }
+        if (errors.size() > 0) {
+            throw new WebServiceException(HttpServletResponse.SC_BAD_REQUEST, 
errors.toString());
+        }
+
+
+        boolean result;
+        String orderNumber;
+        try {
+            order.setOrderField(of);
+            result = Order.insertAndFinalizeOrder(order);
+            orderNumber = order.getOrdernumber();
+            ordersLog.info("Created order " + orderNumber);
+        } catch (java.sql.SQLException sq) {
+            throw new WebServiceException(sq);
+        }
+
+        // now  produce XML result
+        writer.setPrefix("m", NS);
+        writer.setDefaultNamespace(NS);
+        writer.writeStartElement(NS,"result");
+        writer.writeAttribute("class", getClass().getName());
+        writer.writeAttribute("success", "" + result);
+        writer.writeNamespace("m", NS);
+        writer.writeDefaultNamespace(NS);
+        writer.writeCharacters(orderNumber);
+        writer.writeEndElement();
+
+    }
+
+    public Parameter[] getParameterDefinition() {
+        return def;
+    }
+]]></mm:escape>
+      </pre>
+
+
       <h2>A protected webservice</h2>
       <ul>
         <li><a href="${mm:link('/ws/testaction.html')}">HTML</a></li>
@@ -61,7 +207,7 @@
         <li><a href="${mm:link('/services/')}">CXF</a></li>
       </ul>
       <hr />
-      <mm:escape escape="link">$URL$</mm:escape>
+      <mm:escape escape="links">$URL$</mm:escape>
 
     </body>
   </mm:content>

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to