1 package org.apache.beehive.wsm.axis.handlers; 2 3 20 21 import java.io.File ; 22 import java.io.FilenameFilter ; 23 24 import java.util.ArrayList ; 25 import java.util.HashMap ; 26 import java.util.HashSet ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import java.util.Map ; 30 31 32 33 import javax.xml.namespace.QName ; 34 import javax.xml.rpc.handler.HandlerInfo ; 35 36 import org.apache.axis.AxisFault; 37 import org.apache.axis.Constants; 38 import org.apache.axis.MessageContext; 39 import org.apache.axis.client.Call; 40 import org.apache.axis.components.logger.LogFactory; 41 import org.apache.axis.constants.Use; 42 import org.apache.axis.description.ServiceDesc; 43 import org.apache.axis.handlers.BasicHandler; 44 import org.apache.axis.handlers.HandlerInfoChainFactory; 45 import org.apache.axis.handlers.soap.SOAPService; 46 import org.apache.axis.providers.java.RPCProvider; 47 import org.apache.axis.utils.ClassUtils; 48 49 50 import org.apache.beehive.wsm.axis.AxisHook; 51 import org.apache.beehive.wsm.axis.ControlProvider; 52 import org.apache.beehive.wsm.model.BeehiveWsSOAPMessageHandlerInfo; 53 import org.apache.beehive.wsm.model.BeehiveWsTypeMetadata; 54 import org.apache.beehive.wsm.model.jsr181.Jsr181ObjectModelStore; 55 import org.w3c.dom.Element ; 56 57 import org.apache.log4j.Logger; 58 70 public class AnnotatedWebServiceDeploymentHandler extends BasicHandler { 71 72 protected static Logger logger = Logger.getLogger(AnnotatedWebServiceDeploymentHandler.class); 73 74 protected Map <String , SOAPService> soapServices = new HashMap <String , SOAPService>(); 75 76 80 public void invoke(MessageContext mc) throws AxisFault { 81 82 try { 83 SOAPService ss = getSOAPService(getWebServiceClass(mc)); 84 if (null != ss) { 85 ss.setEngine(mc.getAxisEngine()); 86 mc.setService(ss); 87 92 mc.setProperty(Call.SEND_TYPE_ATTR, new Boolean (Use.ENCODED 93 .equals(ss.getUse()))); 94 95 mc.removeProperty(Constants.MC_REALPATH); 97 } 98 } catch (Exception e) { 99 throw AxisFault.makeFault(e); 100 } 101 } 102 103 107 public void generateWSDL(MessageContext mc) throws AxisFault { 108 invoke(mc); 109 } 110 111 116 protected SOAPService getSOAPService(Class clazz) throws Exception { 117 SOAPService ss = null; 118 if (null != clazz) { 119 ss = soapServices.get(clazz.getName()); 120 if (null == ss) { 121 ss = createSOAPService(Jsr181ObjectModelStore.load(clazz), 122 clazz); 123 } 124 } 125 return ss; 126 } 127 128 134 protected SOAPService createSOAPService(BeehiveWsTypeMetadata wsm, Class cls) 135 throws Exception { 136 137 SOAPService ss = null; 138 if (null != wsm) { 139 146 ss = new SOAPService(null, new ControlProvider(), null); 148 149 HandlerInfoChainFactory jaxrpcChain; 151 if (null != (jaxrpcChain = getJaxRPCHandlerChainFactory(wsm))) { 152 ss.setOption(Constants.ATTR_HANDLERINFOCHAIN, jaxrpcChain); 153 } 154 ss.setName(wsm.getWsName()); 155 ss.setOption(RPCProvider.OPTION_CLASSNAME, cls.getName()); 156 157 String scope = (String ) getOption(RPCProvider.OPTION_SCOPE); 160 if (null == scope) { 161 scope = "Request"; 162 } 163 ss.setOption(RPCProvider.OPTION_SCOPE, scope); 164 ServiceDesc sd = AxisHook.createServiceDesc(wsm, cls.getClassLoader()); 165 ss.setServiceDescription(sd); 166 List allowedMethodNames = sd.getAllowedMethods(); 167 Iterator allowIt = allowedMethodNames.iterator(); 168 StringBuffer sb = new StringBuffer (); 169 boolean firstPass = true; 170 while (allowIt.hasNext()) { 171 if (firstPass) { 172 sb.append(' '); 173 firstPass = false; 174 } 175 sb.append(((String ) allowIt.next())); 176 } 177 ss.setOption(RPCProvider.OPTION_ALLOWEDMETHODS, sb.toString()); 178 ss.setOption(RPCProvider.OPTION_WSDL_PORTTYPE, wsm.getWsName()); 179 ss.setOption(RPCProvider.OPTION_WSDL_SERVICEPORT, wsm.getWsName()); 180 ss.setOption(RPCProvider.OPTION_WSDL_SERVICEELEMENT, wsm 181 .getWsServiceName()); 182 ss.setOption(RPCProvider.OPTION_WSDL_TARGETNAMESPACE, wsm 183 .getWsTargetNamespace()); 184 ss.setStyle(sd.getStyle()); 185 ss.setUse(sd.getUse()); 186 soapServices.put(cls.getName(), ss); 187 } 188 return ss; 189 } 190 191 protected HandlerInfoChainFactory getJaxRPCHandlerChainFactory( 192 BeehiveWsTypeMetadata wsm) throws ClassNotFoundException { 193 HandlerInfoChainFactory res = null; 194 List < ? extends BeehiveWsSOAPMessageHandlerInfo> handlers = wsm 195 .getSoapHandlers(); 196 if (handlers.size() > 0) { ArrayList <HandlerInfo > infoList = new ArrayList <HandlerInfo >(); 198 HashSet <String > roles = new HashSet <String >(); 199 200 for (BeehiveWsSOAPMessageHandlerInfo handler : handlers) { 201 Class handlerClass = ClassUtils.forName(handler.getClassName()); 202 QName [] handlerHeaders = handler.getHeaders().toArray( 203 new QName [0]); 204 infoList.add(new HandlerInfo (handlerClass, (Map ) handler 205 .getParameterMap(), handlerHeaders)); 206 roles.addAll(handler.getRoles()); 207 } 208 res = new HandlerInfoChainFactory(infoList); 209 String [] roleArray = roles.toArray(new String [0]); 210 res.setRoles(roleArray); 211 } 212 return res; 213 } 214 215 220 protected Class getWebServiceClass(MessageContext mc) throws Exception { 221 if (null == mc) { 223 throw new IllegalArgumentException ("message context not set"); 224 } 225 226 String relativePath = mc.getStrProp(Constants.MC_RELATIVE_PATH); 228 if (null == relativePath) { 229 throw new Exception ( 230 "relative path not set properly in message context"); 231 } 232 233 final String JWS_EXTENSION = ".jws"; 235 236 244 245 if (! relativePath.startsWith("/")) { 246 throw new Exception ("invalid relative path: " + relativePath); 247 } 248 String className = null; 249 if (relativePath.endsWith(JWS_EXTENSION)) { 250 className = relativePath.substring(1, relativePath.length() - JWS_EXTENSION.length()).replaceAll("/", "."); 251 } 252 else { 253 className = relativePath.substring(1, relativePath.length()).replaceAll("/", "."); 254 } 255 256 if (logger.isDebugEnabled()) { 258 logger.debug("trying to load web service class: " + className); 259 } 260 Class clazz = Jsr181ObjectModelStore.loadWebServiceClass(className); 261 if (null == clazz) { 262 if (logger.isDebugEnabled()) { 263 logger.debug("failed to load web service class: " + className); 264 } 265 } 266 267 return clazz; 268 } 269 } 270 | Popular Tags |