WsdmOperationsPerspectiveAction.java
001 /*
002  *
003  * Licensed to the Apache Software Foundation (ASF) under one
004  * or more contributor license agreements.  See the NOTICE file
005  * distributed with this work for additional information
006  * regarding copyright ownership.  The ASF licenses this file
007  * to you under the Apache License, Version 2.0 (the
008  * "License"); you may not use this file except in compliance
009  * with the License.  You may obtain a copy of the License at
010  *
011  *   http://www.apache.org/licenses/LICENSE-2.0
012  *
013  * Unless required by applicable law or agreed to in writing,
014  * software distributed under the License is distributed on an
015  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016  * KIND, either express or implied.  See the License for the
017  * specific language governing permissions and limitations
018  * under the License.
019  *
020  */
021 package org.apache.qpid.management.web.action;
022 
023 import java.io.IOException;
024 import java.lang.management.ManagementFactory;
025 import java.net.URI;
026 import java.util.HashMap;
027 import java.util.Hashtable;
028 import java.util.Map;
029 import java.util.Properties;
030 import java.util.Map.Entry;
031 
032 import javax.management.MBeanAttributeInfo;
033 import javax.management.MBeanInfo;
034 import javax.management.MBeanServer;
035 import javax.management.ObjectName;
036 import javax.servlet.RequestDispatcher;
037 import javax.servlet.ServletException;
038 import javax.servlet.http.HttpServlet;
039 import javax.servlet.http.HttpServletRequest;
040 import javax.servlet.http.HttpServletResponse;
041 import javax.xml.namespace.QName;
042 
043 import org.apache.muse.core.proxy.ProxyHandler;
044 import org.apache.muse.core.proxy.ReflectionProxyHandler;
045 import org.apache.muse.ws.addressing.EndpointReference;
046 import org.apache.qpid.management.Names;
047 import org.w3c.dom.Element;
048 
049 /**
050  * This controller is responsible to retirve operations metadata from a WS-Resource.
051  * That metadat will be forwarded and used by the corresponding view page. 
052  
053  * TODO : This is not really showing WS metadata. Insted JMX metadata is used here.
054  
055  @author Andrea Gazzarini
056  *
057  */
058 public class WsdmOperationsPerspectiveAction extends HttpServlet
059 {
060   private static final long serialVersionUID = -2411413147821629363L;
061   
062   private ProxyHandler proxyHandler;
063   
064   interface JavaToHtmlAdapter 
065   {
066     String toHtml(Object javaObject);
067   }
068   
069   private URI resourceUri;
070   
071   private JavaToHtmlAdapter mapAdapter = new JavaToHtmlAdapter()
072   {
073     @SuppressWarnings("unchecked")
074     public String toHtml(Object javaObject)
075     {
076       Map<String,Object> value = (Map<String, Object>javaObject;
077 
078       if (value == null || value.isEmpty())
079       {
080         return "(empty)";
081       }
082       
083       StringBuilder builder = new StringBuilder();
084       builder.append("<ul>");
085       for (Entry<String, Object> entry : value.entrySet())
086       {
087         builder
088           .append("<li>")
089           .append(entry.getKey())
090           .append(" = ")
091           .append(entry.getValue());
092       }
093       builder.append("</ul>");
094       return builder.toString();
095     }
096   };
097   
098   private Map<String, JavaToHtmlAdapter> adapters = new HashMap<String, JavaToHtmlAdapter>();
099   
100   @Override
101   public void init() throws ServletException
102   {
103     adapters.put(Map.class.getName(), mapAdapter);
104     adapters.put(HashMap.class.getName(),mapAdapter);
105     adapters.put(Properties.class.getName(),mapAdapter);
106     adapters.put(Hashtable.class.getName(),mapAdapter);
107     
108     proxyHandler  = new ReflectionProxyHandler();
109     proxyHandler.setAction("http://schemas.xmlsoap.org/ws/2004/09/mex/GetMetadata");
110     proxyHandler.setRequestName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""GetMetadata", Names.PREFIX));
111     proxyHandler.setRequestParameterNames(new QName[]{new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""Dialect", Names.PREFIX)});
112     proxyHandler.setResponseName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""Metadata", Names.PREFIX));
113     proxyHandler.setReturnType(Element[].class);
114   }
115   
116   @SuppressWarnings("unchecked")
117   @Override
118   protected void service(HttpServletRequest request, HttpServletResponse responsethrows ServletException, IOException
119   {
120     try 
121     {
122       String resourceId = request.getParameter("resourceId");
123       ObjectName objectName = new ObjectName(resourceId);
124       String wsdmResourceId = objectName.getKeyProperty(Names.OBJECT_ID);
125       
126       EndpointReference resourceEndpointReference = new EndpointReference(getURI(request));
127       resourceEndpointReference.addParameter(
128           Names.RESOURCE_ID_QNAME, 
129           wsdmResourceId);
130       
131 //      WsResourceClient resourceClient = new WsResourceClient(resourceEndpointReference);
132 //      Element wsdl = ((Element[])resourceClient.invoke(proxyHandler,WSDL_DIALECT))[0];
133 //      Element rmd = ((Element[])resourceClient.invoke(proxyHandler,RMD_DIALECT))[0];
134             
135       String [] keyProperties = objectName.getKeyPropertyListString().split(",");
136       MBeanServer server = ManagementFactory.getPlatformMBeanServer();
137       
138       MBeanInfo metadata = server.getMBeanInfo(objectName);
139       
140       Map<String, String> attributes = getAttributes(server, objectName,metadata.getAttributes());
141       
142       request.setAttribute("resourceId", resourceId);
143       request.setAttribute("metadata",metadata);
144       request.setAttribute("nameAttributes",keyProperties);
145       request.setAttribute("attributes",attributes);
146       
147       RequestDispatcher dispatcher = request.getRequestDispatcher("/wsdm_operations_perspective.jsp");
148       dispatcher.forward(request,response);
149     catch(Exception exception)
150     {
151       request.setAttribute("errorMessage","Unable to detect the exact cause Please look at the reported stack trace below.");
152       request.setAttribute("exception",exception);
153       RequestDispatcher dispatcher = request.getRequestDispatcher("/error_page.jsp");
154       dispatcher.forward(request,response);      
155     }
156   }
157 
158   private URI getURI(HttpServletRequest request)
159   {
160     if (resourceUri == null)
161     {
162       StringBuilder builder = new StringBuilder();
163       builder
164         .append(request.getProtocol())
165         .append("//")
166         .append(request.getServerName())
167         .append(":")
168         .append(request.getServerPort())
169         .append("/qman/services/QManWsResource");
170       resourceUri = URI.create(builder.toString());
171     }
172     return resourceUri;
173   }
174 
175   private Map<String, String> getAttributes(MBeanServer server, ObjectName name, MBeanAttributeInfo [] metadatathrows Exception
176   {
177     Map<String,String> result = new HashMap<String, String>(metadata.length);
178     for (MBeanAttributeInfo attribute : metadata)
179     {
180       Object value = server.getAttribute(name, attribute.getName());
181       result.put(attribute.getName(),getAdaptedValue(attribute.getType(), value));
182     }
183     return result;
184   }
185   
186   private String getAdaptedValue(String type, Object value
187   {
188     JavaToHtmlAdapter adapter = adapters.get(type);
189     return (adapter != null? adapter.toHtml(value: String.valueOf(value);
190   }
191 }