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 response) throws 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 [] metadata) throws 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 }
|