Petr Dolezal created OLINGO-282:
-----------------------------------

             Summary: Service root might not be determined correctly when 
@ApplicationPath is applied
                 Key: OLINGO-282
                 URL: https://issues.apache.org/jira/browse/OLINGO-282
             Project: Olingo
          Issue Type: Question
          Components: odata2-core
    Affects Versions: V2 1.3.0
         Environment: Jetty web container embedded in Equinox OSGi container, 
using CXF 3.0.0.milestone2 as JAX-RS implementation
            Reporter: Petr Dolezal
            Priority: Minor


Service root is not determined correctly when the appropriate ODataApplication 
is annotated with @ApplicationPath annotation. I'm not entirely sure if it is a 
bug in Olingo or in CXF which is used in my environment as the JAX-RS 
implementation.

Anyway, the result of this situation is that the generated links to entities 
are not correct; let's have our case as the example:
- the servlet runs at http://www.my-company.example/restful/
- the ODataApplication is annotated with @ApplicationPath("/sessioning")
- our entity set is accessible at 
http://www.my-company.example/restful/sessioning/Sessions, hence a particular 
entity 'id' is available at 
http://www.my-company.example/restful/sessioning/Sessions('id')
- however, the result contains: 
{"__metadata":{"id":"http://www.my-company.example/restful/Sessions('id')","uri":"http://www.my-company.example/restful/Sessions('id')"...

Note the difference in the paths, the "uri" and "id" fields omit the 
"/sessioning" part which is the part provided via the annotation. The same 
omission occurs in the metadata for the service (service root is also 
truncated).

Due to our not-so-often environment (Jetty embedded in OSGi) we had to use the 
annotation and employ yet other settings to make CXF work at all (more details 
can be found in this dicussion: [ 
http://mail-archives.apache.org/mod_mbox/cxf-users/201404.mbox/%3c75ae60817a4e3d45a321599e7562b4b716f94...@defthw99ez1msx.ww931.my-it-solutions.net%3E
 ]). 

To recap, here are some of the important parts of our sources:
// Our ODataApplication class
@ApplicationPath("/sessioning")
public class SessionODataApplication extends AbstractODataApplication {
    ...
}

// Our ODataSingleProcessor
public final class SessionODataSingleProcessor extends ODataSingleProcessor {
    ...
    public ODataResponse readEntity(GetEntityUriInfo uriInfo, String 
contentType) throws ODataException {
        ...
        final URI serviceRoot = getContext().getPathInfo().getServiceRoot(); // 
Here we get the path without the "/sessioning" part
        final EntityProviderWriteProperties writer = 
EntityProviderWriteProperties.serviceRoot(serviceRoot).build();
        return EntityProvider.writeEntry(contentType, entitySet, data, writer);
    }
    ...
}

// Our web.xml
<web-app … >
    ....
    <servlet>
        <servlet-name>ODataServicesHostServlet</servlet-name>
        
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>

        <init-param>
            <!-- CXF extension: multiple JAX-RS applications for a servlet -->
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>
                
net.atos.dirx.access.net.rest.services.authz.RequestODataApplication,
                
net.atos.dirx.access.net.rest.services.session.SessionODataApplication
            </param-value>
        </init-param>
        
        <init-param>
            <!--
                CXF specific: force using @ApplicationPath, necessary with 
                multiple applications (otherwise mapping is used only, and
                it must be unique)
            -->
            <param-name>jaxrs.application.address.ignore</param-name>
            <param-value>false</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>ODataServicesHostServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

// For completeness, system property 
org.apache.cxf.osgi.http.transport.disable=true

According to me the most suspicious point is RestUtil.buildODataPathInfo(), but 
I'm not sure how exactly the JAX-RS application can learn the base URI and how 
the service root should be determined according to the all specifications. 
While CXF manages the routing to the right application now, it might not 
provide entirely correct information of the base URI for the JAX-RS application 
- there is still an open ticket for CXF related to the mapping problem [ 
https://issues.apache.org/jira/browse/CXF-5702 ]. Could it be the cause?




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to