Coverage Report - org.apache.tapestry.contrib.ajax.XTileService
 
Classes in this File Line Coverage Branch Coverage Complexity
XTileService
0%
0/55
0%
0/12
2
 
 1  
 // Copyright 2004, 2005 The Apache Software Foundation
 2  
 //
 3  
 // Licensed under the Apache License, Version 2.0 (the "License");
 4  
 // you may not use this file except in compliance with the License.
 5  
 // You may obtain a copy of the License at
 6  
 //
 7  
 //     http://www.apache.org/licenses/LICENSE-2.0
 8  
 //
 9  
 // Unless required by applicable law or agreed to in writing, software
 10  
 // distributed under the License is distributed on an "AS IS" BASIS,
 11  
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12  
 // See the License for the specific language governing permissions and
 13  
 // limitations under the License.
 14  
 
 15  
 package org.apache.tapestry.contrib.ajax;
 16  
 
 17  
 import java.io.IOException;
 18  
 import java.io.OutputStream;
 19  
 import java.io.StringWriter;
 20  
 import java.util.HashMap;
 21  
 import java.util.Map;
 22  
 
 23  
 import javax.xml.parsers.DocumentBuilder;
 24  
 import javax.xml.parsers.DocumentBuilderFactory;
 25  
 import javax.xml.transform.OutputKeys;
 26  
 import javax.xml.transform.Transformer;
 27  
 import javax.xml.transform.TransformerFactory;
 28  
 import javax.xml.transform.dom.DOMSource;
 29  
 import javax.xml.transform.stream.StreamResult;
 30  
 
 31  
 import org.apache.hivemind.ApplicationRuntimeException;
 32  
 import org.apache.hivemind.util.Defense;
 33  
 import org.apache.tapestry.IComponent;
 34  
 import org.apache.tapestry.IPage;
 35  
 import org.apache.tapestry.IRequestCycle;
 36  
 import org.apache.tapestry.engine.IEngineService;
 37  
 import org.apache.tapestry.engine.ILink;
 38  
 import org.apache.tapestry.error.RequestExceptionReporter;
 39  
 import org.apache.tapestry.services.LinkFactory;
 40  
 import org.apache.tapestry.services.ServiceConstants;
 41  
 import org.apache.tapestry.util.ContentType;
 42  
 import org.apache.tapestry.web.WebResponse;
 43  
 import org.w3c.dom.Document;
 44  
 import org.w3c.dom.Node;
 45  
 
 46  
 /**
 47  
  * @author mindbridge
 48  
  * @author Paul Green
 49  
  * @since 4.0
 50  
  */
 51  0
 public class XTileService implements IEngineService
 52  
 {
 53  
     public static final String SERVICE_NAME = "xtile";
 54  
 
 55  
     private RequestExceptionReporter _exceptionReporter;
 56  
 
 57  
     private WebResponse _response;
 58  
 
 59  
     private LinkFactory _linkFactory;
 60  
 
 61  
     public String getName()
 62  
     {
 63  0
         return SERVICE_NAME;
 64  
     }
 65  
 
 66  
     public ILink getLink(boolean post, Object parameter)
 67  
     {
 68  0
         Defense.isAssignable(parameter, IComponent.class, "parameter");
 69  
 
 70  0
         IComponent component = (IComponent) parameter;
 71  
 
 72  0
         Map parameters = new HashMap();
 73  0
         parameters.put(ServiceConstants.PAGE, component.getPage().getPageName());
 74  0
         parameters.put(ServiceConstants.COMPONENT, component.getIdPath());
 75  
 
 76  0
         return _linkFactory.constructLink(this, false, parameters, true);
 77  
     }
 78  
 
 79  
     public void service(IRequestCycle cycle) throws IOException
 80  
     {
 81  0
         String pageName = cycle.getParameter(ServiceConstants.PAGE);
 82  0
         String componentId = cycle.getParameter(ServiceConstants.COMPONENT);
 83  
 
 84  0
         IPage componentPage = cycle.getPage(pageName);
 85  0
         IComponent component = componentPage.getNestedComponent(componentId);
 86  
 
 87  0
         if (!(component instanceof IXTile))
 88  0
             throw new ApplicationRuntimeException("Incorrect component type: was "
 89  
                     + component.getClass() + " but must be " + IXTile.class, component, null, null);
 90  
 
 91  0
         IXTile xtile = (IXTile) component;
 92  
 
 93  0
         String[] params = cycle.getParameters(ServiceConstants.PARAMETER);
 94  0
         cycle.setListenerParameters(params);
 95  
 
 96  0
         xtile.trigger(cycle);
 97  
 
 98  
         // do not squeeze on output either
 99  0
         Object[] args = cycle.getListenerParameters();
 100  0
         String strArgs = generateOutputString(args);
 101  0
         if (strArgs != null)
 102  
         {
 103  0
             OutputStream output = _response.getOutputStream(new ContentType("text/xml"));
 104  0
             output.write(strArgs.getBytes("utf-8"));
 105  
         }
 106  0
     }
 107  
 
 108  
     protected String generateOutputString(Object[] args)
 109  
     {
 110  
         try
 111  
         {
 112  0
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 113  0
             dbf.setValidating(false);
 114  0
             DocumentBuilder db = dbf.newDocumentBuilder();
 115  0
             Document doc = db.newDocument();
 116  
 
 117  0
             Node rootNode = doc.createElement("data");
 118  0
             doc.appendChild(rootNode);
 119  
 
 120  0
             if (args != null)
 121  
             {
 122  0
                 for (int i = 0; i < args.length; i++)
 123  
                 {
 124  0
                     Object value = args[i];
 125  
 
 126  0
                     Node spNode = doc.createElement("sp");
 127  0
                     rootNode.appendChild(spNode);
 128  
 
 129  0
                     Node valueNode = doc.createTextNode(value.toString());
 130  0
                     spNode.appendChild(valueNode);
 131  
                 }
 132  
             }
 133  
 
 134  0
             TransformerFactory trf = TransformerFactory.newInstance();
 135  0
             Transformer tr = trf.newTransformer();
 136  0
             tr.setOutputProperty(OutputKeys.INDENT, "yes");
 137  
 
 138  0
             DOMSource domSrc = new DOMSource(doc);
 139  0
             StringWriter writer = new StringWriter();
 140  0
             StreamResult res = new StreamResult(writer);
 141  0
             tr.transform(domSrc, res);
 142  0
             writer.close();
 143  
 
 144  0
             return writer.toString();
 145  
         }
 146  0
         catch (Exception e)
 147  
         {
 148  0
             _exceptionReporter.reportRequestException("Cannot generate XML", e);
 149  0
             return null;
 150  
         }
 151  
     }
 152  
 
 153  
     public void setExceptionReporter(RequestExceptionReporter exceptionReporter)
 154  
     {
 155  0
         _exceptionReporter = exceptionReporter;
 156  0
     }
 157  
 
 158  
     public void setResponse(WebResponse response)
 159  
     {
 160  0
         _response = response;
 161  0
     }
 162  
 
 163  
     public void setLinkFactory(LinkFactory linkFactory)
 164  
     {
 165  0
         _linkFactory = linkFactory;
 166  0
     }
 167  
 
 168  
 }