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