I'm not sure my problems related to this issue, or it is a different one.

I have a problem with the PAX-Web. I've tried to register a Websocket 
service as declrarative, but it is unaccessible from web. I've tried the 
given websocket-jsr356-6.0.3.war and it works fine. As I see the WAR file 
handles differently the org.osgi.service.http.HttpContext. I've tried the 
following scenarios:


**Scenario 1 - OSGi R6 Whiteboard HTTP method**


Creating a ServletContextHelper:

    
    package hu.blackbelt.judo.common.rest.regular;
    
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Properties;
    import org.apache.felix.scr.annotations.Property;
    import org.apache.felix.scr.annotations.Service;
    import org.osgi.service.http.context.ServletContextHelper;
    import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
    
    @Component(immediate = true)
    @Service(ServletContextHelper.class)
    @Properties(value = {
            @Property(name = 
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, value = "chat"),
            @Property(name = 
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, value = "/test")
    })
    public class ChatServletContext extends ServletContextHelper {
    }


And adding the Websocket Endpoint:


    package hu.blackbelt.judo.common.rest.regular;
    
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Properties;
    import org.apache.felix.scr.annotations.Property;
    import org.apache.felix.scr.annotations.Service;
    
    import javax.websocket.EncodeException;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    
    @Component(immediate = true)
    @Service(Object.class)
    @Properties(value = {
            @Property(name = 
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
                    value = "=(" + 
HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=chat)")
    })
    @Slf4j
    public class ChatEndpoint {
    
        public static final String ROOM = "room";
    
        @OnOpen
        public void onOpen(final Session session, @PathParam(ROOM) final String 
room) {
            LOGGER.info("session openend and bound to room: " + room);
            session.getUserProperties().put(ROOM, room);
        }
    
        @OnMessage
        public void onMessage(final Session session, final ChatMessage 
chatMessage) {
            String room = (String) session.getUserProperties().get(ROOM);
            try {
                for (Session s : session.getOpenSessions()) {
                    if (s.isOpen()
                            && room.equals(s.getUserProperties().get(ROOM))) {
                        s.getBasicRemote().sendObject(chatMessage);
                    }
                }
            } catch (IOException | EncodeException e) {
                LOGGER.warn("onMessage failed", e);
            }
        }
    }

The logs show me that the Endpoint is catched. I've debugged and Pax-Web is 
registering it.


The log shows the following line:

2017-05-04 02:36:02,698 | INFO | Thread-70 | WebSocketTracker | 330 - 
org.ops4j.pax.web.pax-web-extender-whiteboard - 6.0.3 | found websocket 
endpoint!!


But the websocket is unaccessible with the following URL: 
ws://localost:8181/test/chat/testroom



**Scenario 2 - Pax-Web properties on registered HttpContext (with JAX-RS it 
works)**


Creating HttpContext instance: (Utilizing the OSGi given Helper abstract 
class):

    package hu.blackbelt.judo.common.rest.regular;
    
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Properties;
    import org.apache.felix.scr.annotations.Property;
    import org.apache.felix.scr.annotations.Service;
    import org.osgi.service.http.HttpContext;
    import org.osgi.service.http.context.ServletContextHelper;
    
    @Component(immediate = true)
    @Service(HttpContext.class)
    @Properties(value = {
            @Property(name = "httpContext.id", value = "chat"),
            @Property(name = "httpContext.path", value = "test")
    })
    public class ChatHttpContext extends ServletContextHelper implements 
HttpContext {
    }


And the Websocket Endpoint:


    package hu.blackbelt.judo.common.rest.regular;
       
    import lombok.extern.slf4j.Slf4j;
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Properties;
    import org.apache.felix.scr.annotations.Property;
    import org.apache.felix.scr.annotations.Service;
    import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
    
    import javax.websocket.EncodeException;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    
    @SuppressWarnings({"checkstyle:missingctor", "checkstyle:illegaltoken"})
    
    @Component(immediate = true)
    @Service(Object.class)
    @Properties(value = {
            @Property(name = "httpContext.id", value = "chat")
    })
    @ServerEndpoint(value = "/chat/{room}", encoders = 
ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
    @Slf4j
    public class ChatEndpoint {
    
        public static final String ROOM = "room";
    
        @OnOpen
        public void onOpen(final Session session, @PathParam(ROOM) final String 
room) {
            LOGGER.info("session openend and bound to room: " + room);
            session.getUserProperties().put(ROOM, room);
        }
    
        @OnMessage
        public void onMessage(final Session session, final ChatMessage 
chatMessage) {
            String room = (String) session.getUserProperties().get(ROOM);
            try {
                for (Session s : session.getOpenSessions()) {
                    if (s.isOpen()
                            && room.equals(s.getUserProperties().get(ROOM))) {
                        s.getBasicRemote().sendObject(chatMessage);
                    }
                }
            } catch (IOException | EncodeException e) {
                LOGGER.warn("onMessage failed", e);
            }
        }
    }

But the websocket is unaccessible with the following URL: 
ws://localost:8181/test/chat/testroom



How can I achive that webcsocket be available? I do not want to repackage 
my bundle as WAB. Is there any way?

-- 
-- 
------------------
OPS4J - http://www.ops4j.org - [email protected]

--- 
You received this message because you are subscribed to the Google Groups 
"OPS4J" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to