Search in sources :

Example 11 with ApplicationPath

use of javax.ws.rs.ApplicationPath in project component-runtime by Talend.

the class WebSocketBroadcastSetup method contextInitialized.

@Override
public void contextInitialized(final ServletContextEvent sce) {
    final ServerContainer container = ServerContainer.class.cast(sce.getServletContext().getAttribute(ServerContainer.class.getName()));
    final JAXRSServiceFactoryBean factory = JAXRSServiceFactoryBean.class.cast(bus.getExtension(ServerRegistry.class).getServers().iterator().next().getEndpoint().get(JAXRSServiceFactoryBean.class.getName()));
    final String appBase = StreamSupport.stream(Spliterators.spliteratorUnknownSize(applications.iterator(), Spliterator.IMMUTABLE), false).filter(a -> a.getClass().isAnnotationPresent(ApplicationPath.class)).map(a -> a.getClass().getAnnotation(ApplicationPath.class)).map(ApplicationPath::value).findFirst().map(s -> !s.startsWith("/") ? "/" + s : s).orElse("/api/v1");
    final String version = appBase.replaceFirst("/api", "");
    final DestinationRegistry registry;
    try {
        final HTTPTransportFactory transportFactory = HTTPTransportFactory.class.cast(bus.getExtension(DestinationFactoryManager.class).getDestinationFactory("http://cxf.apache.org/transports/http" + "/configuration"));
        registry = transportFactory.getRegistry();
    } catch (final BusException e) {
        throw new IllegalStateException(e);
    }
    final ServletContext servletContext = sce.getServletContext();
    final WebSocketRegistry webSocketRegistry = new WebSocketRegistry(registry);
    final ServletController controller = new ServletController(webSocketRegistry, new ServletConfig() {

        @Override
        public String getServletName() {
            return "Talend Component Kit Websocket Transport";
        }

        @Override
        public ServletContext getServletContext() {
            return servletContext;
        }

        @Override
        public String getInitParameter(final String s) {
            return null;
        }

        @Override
        public Enumeration<String> getInitParameterNames() {
            return emptyEnumeration();
        }
    }, new ServiceListGeneratorServlet(registry, bus));
    webSocketRegistry.controller = controller;
    Stream.concat(factory.getClassResourceInfo().stream().flatMap(cri -> cri.getMethodDispatcher().getOperationResourceInfos().stream()).map(ori -> {
        final String uri = ori.getClassResourceInfo().getURITemplate().getValue() + ori.getURITemplate().getValue();
        return ServerEndpointConfig.Builder.create(Endpoint.class, "/websocket" + version + "/" + String.valueOf(ori.getHttpMethod()).toLowerCase(ENGLISH) + uri).configurator(new ServerEndpointConfig.Configurator() {

            @Override
            public <T> T getEndpointInstance(final Class<T> clazz) throws InstantiationException {
                final Map<String, List<String>> headers = new HashMap<>();
                if (!ori.getProduceTypes().isEmpty()) {
                    headers.put(HttpHeaders.CONTENT_TYPE, singletonList(ori.getProduceTypes().iterator().next().toString()));
                }
                if (!ori.getConsumeTypes().isEmpty()) {
                    headers.put(HttpHeaders.ACCEPT, singletonList(ori.getConsumeTypes().iterator().next().toString()));
                }
                return (T) new JAXRSEndpoint(appBase, controller, servletContext, ori.getHttpMethod(), uri, headers);
            }
        }).build();
    }), Stream.of(ServerEndpointConfig.Builder.create(Endpoint.class, "/websocket" + version + "/bus").configurator(new ServerEndpointConfig.Configurator() {

        @Override
        public <T> T getEndpointInstance(final Class<T> clazz) throws InstantiationException {
            return (T) new JAXRSEndpoint(appBase, controller, servletContext, "GET", "/", emptyMap());
        }
    }).build())).sorted(Comparator.comparing(ServerEndpointConfig::getPath)).peek(e -> log.info("Deploying WebSocket(path={})", e.getPath())).forEach(config -> {
        try {
            container.addEndpoint(config);
        } catch (final DeploymentException e) {
            throw new IllegalStateException(e);
        }
    });
}
Also used : Enumeration(java.util.Enumeration) Collections.singletonList(java.util.Collections.singletonList) Endpoint(javax.websocket.Endpoint) Map(java.util.Map) AbstractDestination(org.apache.cxf.transport.AbstractDestination) ENGLISH(java.util.Locale.ENGLISH) Instance(javax.enterprise.inject.Instance) PrintWriter(java.io.PrintWriter) RequestDispatcher(javax.servlet.RequestDispatcher) Set(java.util.Set) FastHttpDateFormat(org.apache.tomcat.util.http.FastHttpDateFormat) StandardCharsets(java.nio.charset.StandardCharsets) WebListener(javax.servlet.annotation.WebListener) Slf4j(lombok.extern.slf4j.Slf4j) Stream(java.util.stream.Stream) MessageObserver(org.apache.cxf.transport.MessageObserver) DestinationFactoryManager(org.apache.cxf.transport.DestinationFactoryManager) QName(javax.xml.namespace.QName) ServerRegistry(org.apache.cxf.endpoint.ServerRegistry) HTTPSession(org.apache.cxf.transport.http.HTTPSession) ByteArrayOutputStream(java.io.ByteArrayOutputStream) CloseReason(javax.websocket.CloseReason) SimpleDateFormat(java.text.SimpleDateFormat) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) AsyncContext(javax.servlet.AsyncContext) HttpServletRequest(javax.servlet.http.HttpServletRequest) LogUtils(org.apache.cxf.common.logging.LogUtils) WriteListener(javax.servlet.WriteListener) ContinuationProviderFactory(org.apache.cxf.transport.http.ContinuationProviderFactory) StreamSupport(java.util.stream.StreamSupport) EndpointInfo(org.apache.cxf.service.model.EndpointInfo) ServiceListGeneratorServlet(org.apache.cxf.transport.servlet.servicelist.ServiceListGeneratorServlet) IOException(java.io.IOException) InputStreamReader(java.io.InputStreamReader) TreeMap(java.util.TreeMap) Dependent(javax.enterprise.context.Dependent) ServletContext(javax.servlet.ServletContext) DestinationRegistry(org.apache.cxf.transport.http.DestinationRegistry) BufferedReader(java.io.BufferedReader) HTTPTransportFactory(org.apache.cxf.transport.http.HTTPTransportFactory) Conduit(org.apache.cxf.transport.Conduit) ServletException(javax.servlet.ServletException) Spliterators(java.util.Spliterators) Application(javax.ws.rs.core.Application) ByteBuffer(java.nio.ByteBuffer) Collections.singleton(java.util.Collections.singleton) Locale(java.util.Locale) ServletContextListener(javax.servlet.ServletContextListener) ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) HttpSession(javax.servlet.http.HttpSession) ServletConfig(javax.servlet.ServletConfig) Session(javax.websocket.Session) Collections.emptyList(java.util.Collections.emptyList) HTTPServerPolicy(org.apache.cxf.transports.http.configuration.HTTPServerPolicy) Collection(java.util.Collection) BusException(org.apache.cxf.BusException) ExchangeImpl(org.apache.cxf.message.ExchangeImpl) Collections.enumeration(java.util.Collections.enumeration) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) Collections.emptyEnumeration(java.util.Collections.emptyEnumeration) List(java.util.List) Principal(java.security.Principal) HttpHeaders(javax.ws.rs.core.HttpHeaders) ServletContextEvent(javax.servlet.ServletContextEvent) ServletResponse(javax.servlet.ServletResponse) ServerContainer(javax.websocket.server.ServerContainer) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Spliterator(java.util.Spliterator) JAXRSServiceFactoryBean(org.apache.cxf.jaxrs.JAXRSServiceFactoryBean) Bus(org.apache.cxf.Bus) MessageImpl(org.apache.cxf.message.MessageImpl) ServletDestination(org.apache.cxf.transport.servlet.ServletDestination) EndpointReferenceType(org.apache.cxf.ws.addressing.EndpointReferenceType) ServletInputStream(javax.servlet.ServletInputStream) HashMap(java.util.HashMap) DeploymentException(javax.websocket.DeploymentException) Inject(javax.inject.Inject) HttpUpgradeHandler(javax.servlet.http.HttpUpgradeHandler) Continuation(org.apache.cxf.continuations.Continuation) AbstractHTTPDestination(org.apache.cxf.transport.http.AbstractHTTPDestination) ConnectionSecurityProvider(org.talend.sdk.component.server.front.security.ConnectionSecurityProvider) ServletOutputStream(javax.servlet.ServletOutputStream) Cookie(javax.servlet.http.Cookie) OutputStream(java.io.OutputStream) Collections.emptyMap(java.util.Collections.emptyMap) ContinuationProvider(org.apache.cxf.continuations.ContinuationProvider) ServletRequest(javax.servlet.ServletRequest) RemoteEndpoint(javax.websocket.RemoteEndpoint) Collections.emptySet(java.util.Collections.emptySet) ContinuationCallback(org.apache.cxf.continuations.ContinuationCallback) Message(org.apache.cxf.message.Message) EndpointConfig(javax.websocket.EndpointConfig) HttpServletResponse(javax.servlet.http.HttpServletResponse) ApplicationPath(javax.ws.rs.ApplicationPath) Part(javax.servlet.http.Part) ReadListener(javax.servlet.ReadListener) Data(lombok.Data) DispatcherType(javax.servlet.DispatcherType) Comparator(java.util.Comparator) InputStream(java.io.InputStream) ServletController(org.apache.cxf.transport.servlet.ServletController) HashMap(java.util.HashMap) ApplicationPath(javax.ws.rs.ApplicationPath) JAXRSServiceFactoryBean(org.apache.cxf.jaxrs.JAXRSServiceFactoryBean) Endpoint(javax.websocket.Endpoint) RemoteEndpoint(javax.websocket.RemoteEndpoint) ServletContext(javax.servlet.ServletContext) Collections.singletonList(java.util.Collections.singletonList) ArrayList(java.util.ArrayList) Collections.emptyList(java.util.Collections.emptyList) List(java.util.List) BusException(org.apache.cxf.BusException) ServerContainer(javax.websocket.server.ServerContainer) DestinationRegistry(org.apache.cxf.transport.http.DestinationRegistry) Enumeration(java.util.Enumeration) Collections.emptyEnumeration(java.util.Collections.emptyEnumeration) ServerEndpointConfig(javax.websocket.server.ServerEndpointConfig) HTTPTransportFactory(org.apache.cxf.transport.http.HTTPTransportFactory) ServletConfig(javax.servlet.ServletConfig) ServiceListGeneratorServlet(org.apache.cxf.transport.servlet.servicelist.ServiceListGeneratorServlet) DeploymentException(javax.websocket.DeploymentException) ServletController(org.apache.cxf.transport.servlet.ServletController)

Example 12 with ApplicationPath

use of javax.ws.rs.ApplicationPath in project swagger-core by swagger-api.

the class Reader method resolveApplicationPath.

protected String resolveApplicationPath() {
    if (application != null) {
        Class<?> applicationToScan = this.application.getClass();
        ApplicationPath applicationPath;
        // search up in the hierarchy until we find one with the annotation, this is needed because for example Weld proxies will not have the annotation and the right class will be the superClass
        while ((applicationPath = applicationToScan.getAnnotation(ApplicationPath.class)) == null && !applicationToScan.getSuperclass().equals(Application.class)) {
            applicationToScan = applicationToScan.getSuperclass();
        }
        if (applicationPath != null) {
            if (StringUtils.isNotBlank(applicationPath.value())) {
                return applicationPath.value();
            }
        }
        // look for inner application, e.g. ResourceConfig
        try {
            Application innerApp = application;
            Method m = application.getClass().getMethod("getApplication");
            while (m != null) {
                Application retrievedApp = (Application) m.invoke(innerApp);
                if (retrievedApp == null) {
                    break;
                }
                if (retrievedApp.getClass().equals(innerApp.getClass())) {
                    break;
                }
                innerApp = retrievedApp;
                applicationPath = innerApp.getClass().getAnnotation(ApplicationPath.class);
                if (applicationPath != null) {
                    if (StringUtils.isNotBlank(applicationPath.value())) {
                        return applicationPath.value();
                    }
                }
                m = innerApp.getClass().getMethod("getApplication");
            }
        } catch (NoSuchMethodException e) {
        // no inner application found
        } catch (Exception e) {
        // no inner application found
        }
    }
    return "";
}
Also used : Method(java.lang.reflect.Method) AnnotatedMethod(com.fasterxml.jackson.databind.introspect.AnnotatedMethod) ApplicationPath(javax.ws.rs.ApplicationPath) Application(javax.ws.rs.core.Application)

Example 13 with ApplicationPath

use of javax.ws.rs.ApplicationPath in project swagger-core by swagger-api.

the class Reader method read.

/**
 * Scans a set of classes for both ReaderListeners and OpenAPI annotations. All found listeners will
 * be instantiated before any of the classes are scanned for OpenAPI annotations - so they can be invoked
 * accordingly.
 *
 * @param classes a set of classes to scan
 * @return the generated OpenAPI definition
 */
public OpenAPI read(Set<Class<?>> classes) {
    Set<Class<?>> sortedClasses = new TreeSet<>((class1, class2) -> {
        if (class1.equals(class2)) {
            return 0;
        } else if (class1.isAssignableFrom(class2)) {
            return -1;
        } else if (class2.isAssignableFrom(class1)) {
            return 1;
        }
        return class1.getName().compareTo(class2.getName());
    });
    sortedClasses.addAll(classes);
    Map<Class<?>, ReaderListener> listeners = new HashMap<>();
    String appPath = "";
    for (Class<?> cls : sortedClasses) {
        if (ReaderListener.class.isAssignableFrom(cls) && !listeners.containsKey(cls)) {
            try {
                listeners.put(cls, (ReaderListener) cls.newInstance());
            } catch (Exception e) {
                LOGGER.error("Failed to create ReaderListener", e);
            }
        }
        if (config != null && Boolean.TRUE.equals(config.isAlwaysResolveAppPath())) {
            if (Application.class.isAssignableFrom(cls)) {
                ApplicationPath appPathAnnotation = ReflectionUtils.getAnnotation(cls, ApplicationPath.class);
                if (appPathAnnotation != null) {
                    appPath = appPathAnnotation.value();
                }
            }
        }
    }
    for (ReaderListener listener : listeners.values()) {
        try {
            listener.beforeScan(this, openAPI);
        } catch (Exception e) {
            LOGGER.error("Unexpected error invoking beforeScan listener [" + listener.getClass().getName() + "]", e);
        }
    }
    String appPathRuntime = resolveApplicationPath();
    if (StringUtils.isNotBlank(appPathRuntime)) {
        appPath = appPathRuntime;
    }
    for (Class<?> cls : sortedClasses) {
        read(cls, appPath, null, false, null, null, new LinkedHashSet<String>(), new ArrayList<Parameter>(), new HashSet<Class<?>>());
    }
    for (ReaderListener listener : listeners.values()) {
        try {
            listener.afterScan(this, openAPI);
        } catch (Exception e) {
            LOGGER.error("Unexpected error invoking afterScan listener [" + listener.getClass().getName() + "]", e);
        }
    }
    return openAPI;
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ApplicationPath(javax.ws.rs.ApplicationPath) TreeSet(java.util.TreeSet) Parameter(io.swagger.v3.oas.models.parameters.Parameter) AnnotatedParameter(com.fasterxml.jackson.databind.introspect.AnnotatedParameter)

Aggregations

ApplicationPath (javax.ws.rs.ApplicationPath)13 HashMap (java.util.HashMap)6 Map (java.util.Map)5 ArrayList (java.util.ArrayList)4 Collection (java.util.Collection)3 Application (javax.ws.rs.core.Application)3 Parameter (io.swagger.v3.oas.models.parameters.Parameter)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 List (java.util.List)2 Set (java.util.Set)2 ServletException (javax.servlet.ServletException)2 ServletRegistration (javax.servlet.ServletRegistration)2 MultivaluedMap (javax.ws.rs.core.MultivaluedMap)2 Feature (org.apache.cxf.feature.Feature)2 JAXRSServerFactoryBean (org.apache.cxf.jaxrs.JAXRSServerFactoryBean)2 ElementClass (org.apache.cxf.jaxrs.ext.xml.ElementClass)2 PerRequestResourceProvider (org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider)2 ResourceProvider (org.apache.cxf.jaxrs.lifecycle.ResourceProvider)2 SingletonResourceProvider (org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider)2 ResourceConfig (org.glassfish.jersey.server.ResourceConfig)2