Clover coverage report - SOJO - 1.0.0
Coverage timestamp: Mo Mai 4 2009 16:26:33 CEST
file stats: LOC: 245   Methods: 11
NCLOC: 206   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
XmlRpcContentHandler.java 100% 100% 100% 100%
coverage
 1    /*
 2    * Copyright 2002-2005 the original author or authors.
 3    *
 4    * Licensed under the Apache License, Version 2.0 (the "License");
 5    * you may not use this file except in compliance with the License.
 6    * You may obtain a copy of the License at
 7    *
 8    * http://www.apache.org/licenses/LICENSE-2.0
 9    *
 10    * Unless required by applicable law or agreed to in writing, software
 11    * distributed under the License is distributed on an "AS IS" BASIS,
 12    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13    * See the License for the specific language governing permissions and
 14    * limitations under the License.
 15    */
 16    package net.sf.sojo.interchange.xmlrpc;
 17   
 18    import java.math.BigDecimal;
 19    import java.math.BigInteger;
 20    import java.text.ParseException;
 21    import java.text.SimpleDateFormat;
 22    import java.util.ArrayList;
 23    import java.util.Calendar;
 24    import java.util.Date;
 25    import java.util.HashMap;
 26    import java.util.Iterator;
 27    import java.util.List;
 28    import java.util.Map;
 29    import java.util.Stack;
 30    import java.util.Map.Entry;
 31   
 32    import net.sf.sojo.core.NonCriticalExceptionHandler;
 33   
 34    import org.xml.sax.Attributes;
 35    import org.xml.sax.SAXException;
 36    import org.xml.sax.helpers.DefaultHandler;
 37   
 38    public class XmlRpcContentHandler extends DefaultHandler {
 39   
 40    private String value = null;
 41    private List params = new ArrayList();
 42    private Stack stack = new Stack();
 43    private boolean returnValueAsList = true;
 44    private boolean isFault = false;
 45    private String methodName = null;
 46   
 47    private static final Map validTags = new HashMap ();
 48    {
 49  57 validTags.put("fault", "");
 50  57 validTags.put("data", "");
 51  57 validTags.put("param", "");
 52  57 validTags.put("params", "");
 53  57 validTags.put("value", "");
 54  57 validTags.put("member", "");
 55  57 validTags.put("methodCall", "");
 56  57 validTags.put("methodResponse", "");
 57    };
 58   
 59  57 public void startDocument() throws SAXException {
 60  57 stack.clear();
 61  57 isFault = false;
 62  57 methodName = null;
 63    }
 64   
 65  51 public void endDocument() throws SAXException { }
 66   
 67  2367 public void startElement(String pvUri, String pvLocalName, String pvName, Attributes pvAttributes) throws SAXException {
 68  2367 if ("params".equals(pvName)) {
 69  51 params.clear();
 70    }
 71  2316 else if ("array".equals(pvName)) {
 72  15 stack.push(new ArrayList());
 73    }
 74  2301 else if ("struct".equals(pvName)) {
 75  93 stack.push(new HashMap());
 76    }
 77  2208 else if ("fault".equals(pvName)) {
 78  4 isFault = true;
 79    }
 80    }
 81   
 82  1119 private void addValue(String pvName, Object pvValue) {
 83    if (stack.size() > 0) {
 84    Object lvCurrentStackObj = stack.peek();
 85    if (lvCurrentStackObj instanceof List) {
 86    ((List) lvCurrentStackObj).add(pvValue);
 87    }
 88    else if (lvCurrentStackObj instanceof Map) {
 89    Map lvMap = (Map) lvCurrentStackObj;
 90    lvMap.put(pvName, pvValue);
 91    if ("key".equals(pvName)) {
 92    Iterator it = lvMap.entrySet().iterator();
 93    while (it.hasNext()) {
 94    Map.Entry lvEntry = (Entry) it.next();
 95    if (lvEntry.getValue() == null) {
 96    lvEntry.setValue(pvValue);
 97    }
 98    }
 99    }
 100    lvMap.remove("key");
 101    }
 102    else {
 103    if (NonCriticalExceptionHandler.isNonCriticalExceptionHandlerEnabled()) {
 104    NonCriticalExceptionHandler.handleException(XmlRpcContentHandler.class, "Not supported Object in Stack: " + lvCurrentStackObj);
 105    }
 106    }
 107    }
 108    else {
 109    params.add(pvValue);
 110    }
 111    }
 112   
 113  2355 public void endElement(String pvUri, String pvLocalName, String pvName) throws SAXException {
 114   
 115  2355 Object currentValue = null;
 116   
 117  2355 if ("string".equals(pvName) || ("value".equals(pvName) && value != null)) {
 118  372 value = value.replaceAll("&lt;", "<");
 119  372 value = value.replaceAll("&gt;", ">");
 120  372 currentValue = value;
 121  372 addValue("key", currentValue);
 122    }
 123  1983 else if ("i4".equals(pvName) || "int".equals(pvName)) {
 124  60 currentValue = Integer.valueOf(value);
 125  60 addValue("key", currentValue);
 126    }
 127  1923 else if ("boolean".equals(pvName)) {
 128  59 if ("1".equals(value)) {
 129  11 currentValue = Boolean.TRUE;
 130    }
 131  48 else if ("0".equals(value)) {
 132  47 currentValue = Boolean.FALSE;
 133    }
 134    else {
 135  1 throw new XmlRpcException("The value: " + value + " is not a valid boolean value.");
 136    }
 137  58 addValue("key", currentValue);
 138    }
 139  1864 else if ("double".equals(pvName)) {
 140  9 try {
 141  9 currentValue = Double.valueOf(value);
 142  8 addValue("key", currentValue);
 143    } catch (NumberFormatException e) {
 144  1 throw new XmlRpcException("The value: " + value + " is not a valid double value.");
 145    }
 146   
 147    }
 148  1855 else if ("dateTime.iso8601".equals(pvName)) {
 149  6 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMDD'T'HH:mm:ss");
 150  6 try {
 151  6 currentValue = sdf.parse(value);
 152  5 addValue("key", currentValue);
 153    } catch (ParseException e) {
 154  1 throw new XmlRpcException("The value: " + value + " is not a valid date value.");
 155    }
 156    }
 157  1849 else if ("array".equals(pvName)) {
 158  15 Object lvCurrentStackObj = stack.pop();
 159  15 addValue("key", lvCurrentStackObj);
 160    }
 161  1834 else if ("struct".equals(pvName)) {
 162  93 Object lvCurrentStackObj = stack.pop();
 163  93 addValue("key", lvCurrentStackObj);
 164    }
 165   
 166   
 167    // ----------------- Apache XML-RPC Extensions -----------------
 168  1741 else if ("ex:i1".equals(pvName)) {
 169  1 currentValue = Byte.valueOf(value);
 170  1 addValue("key", currentValue);
 171    }
 172  1740 else if ("ex:i2".equals(pvName)) {
 173  1 currentValue = Short.valueOf(value);
 174  1 addValue("key", currentValue);
 175    }
 176  1739 else if ("ex:i8".equals(pvName)) {
 177  1 currentValue = Long.valueOf(value);
 178  1 addValue("key", currentValue);
 179    }
 180  1738 else if ("ex:float".equals(pvName)) {
 181  2 currentValue = Float.valueOf(value);
 182  2 addValue("key", currentValue);
 183    }
 184  1736 else if ("ex:bigdecimal".equals(pvName)) {
 185  1 currentValue = new BigDecimal(value);
 186  1 addValue("key", currentValue);
 187    }
 188  1735 else if ("ex:biginteger".equals(pvName)) {
 189  1 currentValue = new BigInteger(value);
 190  1 addValue("key", currentValue);
 191    }
 192  1734 else if ("ex:dateTime".equals(pvName)) {
 193  2 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMDD'T'HH:mm:ss.SSS");
 194  2 try {
 195  2 currentValue = sdf.parse(value);
 196  1 Calendar lvCalendar = Calendar.getInstance();
 197  1 lvCalendar.setTime( (Date) currentValue);
 198  1 currentValue = lvCalendar;
 199  1 addValue("key", currentValue);
 200    } catch (ParseException e) {
 201  1 throw new XmlRpcException("The value: " + value + " is not a valid date value.");
 202    }
 203    }
 204  1732 else if ("ex:nil".equals(pvName)) {
 205  1 currentValue = null;
 206  1 addValue("key", currentValue);
 207    }
 208  1731 else if ("methodName".equals(pvName)) {
 209  1 methodName = value;
 210    }
 211  1730 else if ("name".equals(pvName)) {
 212  499 addValue(value, null);
 213    }
 214   
 215   
 216  1231 else if (validTags.containsKey(pvName) == false)
 217    {
 218  1 throw new XmlRpcException("The Tag: " + pvName + " is not supported");
 219    }
 220   
 221  2350 value = null;
 222    }
 223   
 224  1019 public void characters(char[] pvCh, int pvStart, int pvLength) throws SAXException {
 225  1019 String lvOldValue = "";
 226  1019 if (value != null) {
 227  3 lvOldValue = value;
 228    }
 229  1019 value = lvOldValue + new String(pvCh, pvStart, pvLength);
 230    }
 231   
 232  51 public Object getResults() {
 233  51 if (getReturnValueAsList() == false && params.size() == 1) {
 234  50 return params.get(0);
 235    } else {
 236  1 return params;
 237    }
 238    }
 239  51 public String getMethodName() { return methodName; }
 240  51 public boolean isFault() { return isFault; }
 241   
 242  57 public void setReturnValueAsList(boolean pvReturnValueAsList) { returnValueAsList = pvReturnValueAsList; }
 243  51 public boolean getReturnValueAsList() { return returnValueAsList; }
 244   
 245    }