WsdmPropertiesPerspectiveAction.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.muse.ws.resource.remote.WsResourceClient;
047 import org.apache.qpid.management.Names;
048 import org.w3c.dom.Element;
049 
050 public class WsdmPropertiesPerspectiveAction extends HttpServlet
051 {
052   private static final long serialVersionUID = -2411413147821629363L;
053   private static final Object [] WSDL_DIALECT = new Object[]{"http://schemas.xmlsoap.org/wsdl/"};
054   private static final Object [] RMD_DIALECT = new Object[]{"http://docs.oasis-open.org/wsrf/rmd-1"};
055   
056   private ProxyHandler proxyHandler;
057   
058   interface JavaToHtmlAdapter 
059   {
060     String toHtml(Object javaObject);
061   }
062   
063   private URI resourceUri;
064   
065   private JavaToHtmlAdapter mapAdapter = new JavaToHtmlAdapter()
066   {
067     @SuppressWarnings("unchecked")
068     public String toHtml(Object javaObject)
069     {
070       Map<String,Object> value = (Map<String, Object>javaObject;
071 
072       if (value == null || value.isEmpty())
073       {
074         return "(empty)";
075       }
076       
077       StringBuilder builder = new StringBuilder();
078       builder.append("<ul>");
079       for (Entry<String, Object> entry : value.entrySet())
080       {
081         builder
082           .append("<li>")
083           .append(entry.getKey())
084           .append(" = ")
085           .append(entry.getValue());
086       }
087       builder.append("</ul>");
088       return builder.toString();
089     }
090   };
091   
092   private Map<String, JavaToHtmlAdapter> adapters = new HashMap<String, JavaToHtmlAdapter>();
093   
094   @Override
095   public void init() throws ServletException
096   {
097     adapters.put(Map.class.getName(), mapAdapter);
098     adapters.put(HashMap.class.getName(),mapAdapter);
099     adapters.put(Properties.class.getName(),mapAdapter);
100     adapters.put(Hashtable.class.getName(),mapAdapter);
101     
102     proxyHandler  = new ReflectionProxyHandler();
103     proxyHandler.setAction("http://schemas.xmlsoap.org/ws/2004/09/mex/GetMetadata");
104     proxyHandler.setRequestName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""GetMetadata", Names.PREFIX));
105     proxyHandler.setRequestParameterNames(new QName[]{new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""Dialect", Names.PREFIX)});
106     proxyHandler.setResponseName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex""Metadata", Names.PREFIX));
107     proxyHandler.setReturnType(Element[].class);
108   }
109   
110   @SuppressWarnings("unchecked")
111   @Override
112   protected void service(HttpServletRequest request, HttpServletResponse responsethrows ServletException, IOException
113   {
114     try 
115     {
116       String resourceId = request.getParameter("resourceId");
117       ObjectName objectName = new ObjectName(resourceId);
118       
119       String wsresourceid = objectName.getKeyProperty(Names.OBJECT_ID);
120       
121       EndpointReference resourceEndpointReference = new EndpointReference(getURI(request));
122       resourceEndpointReference.addParameter(
123           Names.RESOURCE_ID_QNAME, 
124           wsresourceid);
125       
126 //      WsResourceClient resourceClient = new WsResourceClient(resourceEndpointReference);
127 //      Element wsdl = ((Element[])resourceClient.invoke(proxyHandler,WSDL_DIALECT))[0];
128 //      Element rmd = ((Element[])resourceClient.invoke(proxyHandler,RMD_DIALECT))[0];
129             
130       String [] keyProperties = objectName.getKeyPropertyListString().split(",");
131       
132       
133       MBeanServer server = ManagementFactory.getPlatformMBeanServer();
134       
135       MBeanInfo metadata = server.getMBeanInfo(objectName);
136       
137       Map<String, String> attributes = getAttributes(server, objectName,metadata.getAttributes());
138       
139       request.setAttribute("resourceId", resourceId);
140       request.setAttribute("metadata",metadata);
141       request.setAttribute("nameAttributes",keyProperties);
142       request.setAttribute("attributes",attributes);
143       
144       RequestDispatcher dispatcher = request.getRequestDispatcher("/wsdm_properties_perspective.jsp");
145       dispatcher.forward(request,response);
146     catch(Exception exception)
147     {
148       request.setAttribute("errorMessage","Unable to detect the exact cause Please look at the reported stack trace below.");
149       request.setAttribute("exception",exception);
150       RequestDispatcher dispatcher = request.getRequestDispatcher("/error_page.jsp");
151       dispatcher.forward(request,response);      
152     }
153   }
154 
155   private URI getURI(HttpServletRequest request)
156   {
157     if (resourceUri == null)
158     {
159       StringBuilder builder = new StringBuilder();
160       builder
161         .append(request.getProtocol())
162         .append("//")
163         .append(request.getServerName())
164         .append(":")
165         .append(request.getServerPort())
166         .append("/qman/services/QManWsResource");
167       resourceUri = URI.create(builder.toString());
168     }
169     return resourceUri;
170   }
171 
172   private Map<String, String> getAttributes(MBeanServer server, ObjectName name, MBeanAttributeInfo [] metadatathrows Exception
173   {
174     Map<String,String> result = new HashMap<String, String>(metadata.length);
175     for (MBeanAttributeInfo attribute : metadata)
176     {
177       Object value = server.getAttribute(name, attribute.getName());
178       result.put(attribute.getName(),getAdaptedValue(attribute.getType(), value));
179     }
180     return result;
181   }
182   
183   private String getAdaptedValue(String type, Object value
184   {
185     JavaToHtmlAdapter adapter = adapters.get(type);
186     return (adapter != null? adapter.toHtml(value: String.valueOf(value);
187   }
188 }