Clover Coverage Report - XWiki Rendering - Parent POM 4.0-SNAPSHOT (Aggregated)
Coverage timestamp: Mon Mar 12 2012 18:03:13 CET
../../../../../../../img/srcFileCovDistChart10.png 0% of files have more coverage
45   159   23   4.5
18   106   0.51   10
10     2.3  
1    
 
  XDOMXMLChainingStreamRenderer       Line # 39 45 0% 23 6 91.8% 0.91780823
 
  (4)
 
1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.rendering.xdomxml.internal.current.renderer;
21   
22    import java.lang.reflect.InvocationHandler;
23    import java.lang.reflect.Method;
24   
25    import org.xml.sax.Attributes;
26    import org.xml.sax.ContentHandler;
27    import org.xml.sax.SAXException;
28    import org.xml.sax.helpers.AttributesImpl;
29    import org.xwiki.rendering.listener.descriptor.ListenerDescriptor;
30    import org.xwiki.rendering.listener.descriptor.ListenerElement;
31    import org.xwiki.rendering.xdomxml.internal.XDOMXMLConstants;
32    import org.xwiki.rendering.xdomxml.internal.current.parameter.ParameterManager;
33   
34    /**
35    * Current version of the XDOM+XML stream based renderer.
36    *
37    * @version $Id: 918986a74038d5d9032537edb5c3e5e838f1b8b4 $
38    */
 
39    public class XDOMXMLChainingStreamRenderer implements InvocationHandler
40    {
41    private ContentHandler contentHandler;
42   
43    private ParameterManager parameterManager;
44   
45    private ListenerDescriptor descriptor;
46   
 
47  4 toggle public XDOMXMLChainingStreamRenderer(ParameterManager parameterManager, ListenerDescriptor descriptor)
48    {
49  4 this.parameterManager = parameterManager;
50  4 this.descriptor = descriptor;
51    }
52   
 
53  112 toggle private String getBlockName(String eventName, String prefix)
54    {
55  112 String blockName = eventName.substring(prefix.length());
56  112 blockName = Character.toLowerCase(blockName.charAt(0)) + blockName.substring(1);
57   
58  112 return blockName;
59    }
60   
 
61  37 toggle private void beginEvent(String eventName, Object[] parameters)
62    {
63  37 String blockName = getBlockName(eventName, "begin");
64   
65  37 startElement(XDOMXMLConstants.ELEM_BLOCK, new String[][] {{XDOMXMLConstants.ATT_BLOCK_NAME, blockName}});
66   
67  37 printParameters(parameters, this.descriptor.getElements().get(blockName));
68    }
69   
 
70  112 toggle private void endEvent()
71    {
72  112 endElement(XDOMXMLConstants.ELEM_BLOCK);
73    }
74   
 
75  75 toggle private void onEvent(String eventName, Object[] parameters)
76    {
77  75 String blockName = getBlockName(eventName, "on");
78   
79  75 startElement(XDOMXMLConstants.ELEM_BLOCK, new String[][] {{XDOMXMLConstants.ATT_BLOCK_NAME, blockName}});
80  75 printParameters(parameters, this.descriptor.getElements().get(blockName));
81  75 endEvent();
82    }
83   
 
84  112 toggle private void printParameters(Object[] parameters, ListenerElement descriptor)
85    {
86  112 if (parameters != null && parameters.length > 0) {
87  180 for (int i = 0; i < parameters.length; ++i) {
88  106 Object value = parameters[i];
89   
90  106 if (value != null) {
91  104 startElement(XDOMXMLConstants.ELEM_PARAMETER, null);
92    } else {
93  2 startElement(XDOMXMLConstants.ELEM_PARAMETER, new String[][] {{XDOMXMLConstants.ATT_PARAMETER_NULL,
94    "true"}});
95    }
96   
97  106 this.parameterManager.serialize(descriptor.getParameters().get(i), parameters[i], this.contentHandler);
98   
99  106 endElement(XDOMXMLConstants.ELEM_PARAMETER);
100    }
101    }
102    }
103   
 
104  218 toggle private void startElement(String elemntName, String[][] parameters)
105    {
106  218 try {
107  218 this.contentHandler.startElement("", elemntName, elemntName, createAttributes(parameters));
108    } catch (SAXException e) {
109  0 throw new RuntimeException("Failed to send sax event", e);
110    }
111    }
112   
 
113  218 toggle private void endElement(String elemntName)
114    {
115  218 try {
116  218 this.contentHandler.endElement("", elemntName, elemntName);
117    } catch (SAXException e) {
118  0 throw new RuntimeException("Failed to send sax event", e);
119    }
120    }
121   
122    /**
123    * Convert provided table into {@link Attributes} to use in xml writer.
124    */
 
125  218 toggle private Attributes createAttributes(String[][] parameters)
126    {
127  218 AttributesImpl attributes = new AttributesImpl();
128   
129  218 if (parameters != null && parameters.length > 0) {
130  114 for (String[] entry : parameters) {
131  114 attributes.addAttribute(null, null, entry[0], null, entry[1]);
132    }
133    }
134   
135  218 return attributes;
136    }
137   
 
138  153 toggle @Override
139    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
140    {
141  153 Object result = null;
142   
143  153 if (method.getName().equals("setContentHandler")) {
144  4 this.contentHandler = (ContentHandler) args[0];
145  149 } else if (method.getName().equals("getContentHandler")) {
146  0 result = this.contentHandler;
147  149 } else if (method.getName().startsWith("begin")) {
148  37 beginEvent(method.getName(), args);
149  112 } else if (method.getName().startsWith("end")) {
150  37 endEvent();
151  75 } else if (method.getName().startsWith("on")) {
152  75 onEvent(method.getName(), args);
153    } else {
154  0 throw new NoSuchMethodException(method.toGenericString());
155    }
156   
157  153 return result;
158    }
159    }