/* * Copyright 2004-2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ package com.sun.enterprise.webservice.monitoring.global; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.ejb.EJBException; import java.rmi.RemoteException; import java.util.*; import com.sun.enterprise.webservice.monitoring.WebServiceEngine; import com.sun.enterprise.webservice.monitoring.WebServiceEngineFactory; import com.sun.enterprise.webservice.monitoring.Endpoint; import com.sun.enterprise.webservice.monitoring.TransportInfo; import com.sun.enterprise.webservice.monitoring.GlobalMessageListener; import com.sun.xml.rpc.spi.runtime.MessageContext; /** * Implementation of the global monitoring web service. * * @author Jerome Dochez */ public class WebServiceEngineImpl implements SessionBean, GlobalMessageListener { SessionContext sc; LinkedList<InvocationTraceImpl> traces = new LinkedList<InvocationTraceImpl>(); Map<String, InvocationTraceImpl> current = new HashMap<String, InvocationTraceImpl>(); GlobalMessageListener parent = null; public WebServiceEngineImpl() { } /** Creates a new instance of SimpleServerImpl */ public void ejbCreate() throws RemoteException { System.out.println("In WebServiceEngineImpl::ejbCreate !!"); WebServiceEngineFactory factory = WebServiceEngineFactory.getInstance(); com.sun.enterprise.webservice.monitoring.WebServiceEngine engine = factory.getEngine(); parent = engine.getGlobalMessageListener(); engine.setGlobalMessageListener(this); } public void setSessionContext(SessionContext sc) { this.sc = sc; } public void ejbRemove() throws RemoteException { System.out.println("In WebServiceEngineImpl::ejbRemove"); WebServiceEngineFactory factory = WebServiceEngineFactory.getInstance(); com.sun.enterprise.webservice.monitoring.WebServiceEngine engine = factory.getEngine(); engine.setGlobalMessageListener(parent); } public void ejbActivate() { System.out.println("In WebServiceEngineImpl::ejbActivate"); } public void ejbPassivate() { System.out.println("In WebServiceEngineImpl::ejbPassivate"); } // Implementation of the WebServiceEngine Interface public EndpointInfo getEndpoint(String selector) throws RemoteException { return null; } public int getEndpointsCount() throws RemoteException { WebServiceEngineFactory factory = WebServiceEngineFactory.getInstance(); com.sun.enterprise.webservice.monitoring.WebServiceEngine engine = factory.getEngine(); java.util.Iterator iterator = engine.getEndpoints(); int count = 0; while (iterator.hasNext()) { count++; iterator.next(); } return count; } public String getEndpointsSelector(int i) throws RemoteException { WebServiceEngineFactory factory = WebServiceEngineFactory.getInstance(); com.sun.enterprise.webservice.monitoring.WebServiceEngine engine = factory.getEngine(); java.util.Iterator iterator = engine.getEndpoints(); Endpoint endpoint; while (i!=0 && iterator.hasNext()) { i--; iterator.next(); } if (iterator.hasNext()) { endpoint = (Endpoint) iterator.next(); return endpoint.getEndpointSelector(); } else return null; } public int getTraceCount() throws RemoteException { return traces.size(); } public InvocationTrace getTrace(int i) throws RemoteException { return traces.get(i); } /** * Callback when a web service request entered the web service container * and before any system processing is done. * @param endpoint is the endpoint the web service request is targeted to * @return a message ID to trace the request in the subsequent callbacks * or null if this invocation should not be traced further. */ public String preProcessRequest(Endpoint endpoint) { String mid = null; InvocationTraceImpl newTrace = new InvocationTraceImpl(); if (parent!=null) { mid = parent.preProcessRequest(endpoint); } if ("WebServiceEnginePort".equals(endpoint.getDescriptor().getWsdlPort().getLocalPart())) { // i don't trace myself ;-) return mid; } System.out.println("Tracing " +endpoint.getDescriptor().getWsdlPort().getLocalPart()); if (mid==null) { mid = String.valueOf(newTrace.hashCode()); } EndpointInfo info = new EndpointInfo(); info.setEndpointType(endpoint.getEndpointType().toString()); info.setEndpointSelector(endpoint.getEndpointSelector()); newTrace.setEndpointInfo(info); current.put(mid, newTrace); return mid; } /** * Callback when a web service request is about the be delivered to the * Web Service Implementation Bean. * @param mid message ID returned by preProcessRequest call * @param trace the jaxrpc message trace, transport dependent */ public void processRequest(String mid, MessageContext ctx, TransportInfo info) { InvocationTraceImpl trace = current.get(mid); if (trace!=null) { trace.setRequest(ctx); trace.setRequestTI(info); } else { System.out.println("Unknown mid in request " + mid); } } /** * Callback when a web service response was returned by the Web Service * Implementation Bean * @param mid message ID returned by the preProcessRequest call * @param trace jaxrpc message trace, transport dependent. */ public void processResponse(String mid, MessageContext ctx) { if (parent!=null) { parent.processResponse(mid, ctx); } InvocationTraceImpl trace = current.get(mid); if (trace!=null) { trace.setResponse(ctx); } else { System.out.println("Unknown mid in response" + mid); } } /** * Callback when a web service response has finished being processed * by the container and was sent back to the client * @param mid returned by the preProcessRequest call * @param info the response transport dependent information */ public void postProcessResponse(String mid, TransportInfo info) { if (parent!=null) { parent.postProcessResponse(mid, info); } InvocationTraceImpl trace = current.get(mid); if (trace!=null) { trace.setResponseTI(info); current.remove(mid); if (traces.size()>10) { traces.removeFirst(); } traces.addLast(trace); } else { System.out.println("Unknown mid in post response" + mid); } } }