FileDocCategorySizeDatePackage
WSTCPAdapterRegistryImpl.javaAPI DocExample7694Tue May 29 16:57:12 BST 2007com.sun.xml.ws.transport.tcp.server.glassfish

WSTCPAdapterRegistryImpl

public final class WSTCPAdapterRegistryImpl extends Object implements com.sun.xml.ws.transport.tcp.server.WSTCPAdapterRegistry
author
Alexey Stashok

Fields Summary
private static final Logger
logger
final Map
registry
Registry holds correspondents between service name and adapter
private static final WSTCPAdapterRegistryImpl
instance
Constructors Summary
private WSTCPAdapterRegistryImpl()

    
      
Methods Summary
private com.sun.xml.ws.transport.tcp.server.TCPAdaptercreateWSAdapter(WSEndpointDescriptor wsEndpointDescriptor)

        Adapter adapter;
        if (wsEndpointDescriptor.isEJB()) {
            final EjbRuntimeEndpointInfo ejbEndPtInfo = (EjbRuntimeEndpointInfo) WebServiceEjbEndpointRegistry.getRegistry().
                    getEjbWebServiceEndpoint(wsEndpointDescriptor.getURI(), "POST", null);
            adapter = (Adapter) ejbEndPtInfo.prepareInvocation(true);
        } else {
            final String uri = wsEndpointDescriptor.getURI();
            adapter = JAXWSAdapterRegistry.getInstance().getAdapter(wsEndpointDescriptor.getContextRoot(), uri, uri);
        }
        
//@TODO implement checkAdapterSupportsTCP
//        checkAdapterSupportsTCP(adapter);
        final TCPAdapter tcpAdapter = new TCP109Adapter(wsEndpointDescriptor.getWSServiceName().toString(),
                wsEndpointDescriptor.getContextRoot(),
                wsEndpointDescriptor.getUrlPattern(),
                adapter.getEndpoint(),
                new ServletFakeArtifactSet(wsEndpointDescriptor.getRequestURL(), wsEndpointDescriptor.getUrlPattern()),
                wsEndpointDescriptor.isEJB());
        
        return tcpAdapter;
    
public voiddeleteTargetFor(java.lang.String path)

        logger.log(Level.FINE, "WSTCPAdapterRegistryImpl. DeRegister adapter for {0}", path);
        registry.remove(path);
    
public static com.sun.xml.ws.transport.tcp.server.glassfish.WSTCPAdapterRegistryImplgetInstance()

        return instance;
    
public com.sun.xml.ws.transport.tcp.server.TCPAdaptergetTarget(com.sun.xml.ws.transport.tcp.util.WSTCPURI requestURI)

        // path should have format like "/context-root/url-pattern", where context-root and url-pattern could be /xxxx/yyyy/zzzz
        
        WSEndpointDescriptor wsEndpointDescriptor = null;
        String contextRoot = "/";
        String urlPattern = "/";
        // check if URI path is not empty
        if (requestURI.path.length() > 0 && !requestURI.path.equals("/")) {
            
            // Try to check for most common situation "/context-root/url-pattern"
            int nextSlashIndex = requestURI.path.indexOf('/", 1);
            if (nextSlashIndex != -1) {
                contextRoot = requestURI.path.substring(0, nextSlashIndex);
                urlPattern = requestURI.path.substring(nextSlashIndex, requestURI.path.length());
                wsEndpointDescriptor = AppServWSRegistry.getInstance().get(contextRoot, urlPattern);
            }
            
            if (wsEndpointDescriptor == null) {
                // Try to combine different context-root and url-pattern from given path
                nextSlashIndex = -1;
                do {
                    nextSlashIndex = requestURI.path.indexOf('/", nextSlashIndex + 1);
                    int delim = nextSlashIndex != -1 ? nextSlashIndex : requestURI.path.length();
                    contextRoot = delim > 0 ? requestURI.path.substring(0, delim) : "/";
                    urlPattern = delim < requestURI.path.length() ? requestURI.path.substring(delim, requestURI.path.length()) : "/";
                    wsEndpointDescriptor = AppServWSRegistry.getInstance().get(contextRoot, urlPattern);
                } while (nextSlashIndex != -1 && wsEndpointDescriptor == null);
            }
        } else {
            wsEndpointDescriptor = AppServWSRegistry.getInstance().get(contextRoot, urlPattern);
        }
        
        if (wsEndpointDescriptor != null) {
            TCPAdapter adapter = registry.get(requestURI.path);
            if (adapter == null) {
                try {
                    adapter = createWSAdapter(wsEndpointDescriptor);
                    registry.put(requestURI.path, adapter);
                    logger.log(Level.FINE, "WSTCPAdapterRegistryImpl. Register adapter. Path: {0}", requestURI.path);
                } catch (Exception e) {
                    // This common exception is thrown from ejbEndPtInfo.prepareInvocation(true)
                    logger.log(Level.SEVERE, "WSTCPAdapterRegistryImpl. " +
                            MessagesMessages.WSTCP_0008_ERROR_TCP_ADAPTER_CREATE(
                            wsEndpointDescriptor.getWSServiceName()), e);
                }
            }
            return adapter;
        }
        
        return null;