Search in sources :

Example 1 with ODataHttpHandler

use of org.apache.olingo.server.api.ODataHttpHandler in project teiid by teiid.

the class TestODataSQLBuilder method setup.

private BaseState setup(String ddl, String url, String method, ServletInputStream stream, BaseState state) throws Exception {
    Client client = Mockito.mock(Client.class);
    DDLHolder model = new DDLHolder("PM1", ddl);
    TransformationMetadata metadata = RealMetadataFactory.fromDDL("vdb", model);
    MetadataStore store = metadata.getMetadataStore();
    // TranslationUtility utility = new TranslationUtility(metadata);
    OData odata = OData4Impl.newInstance();
    org.teiid.metadata.Schema teiidSchema = store.getSchema("PM1");
    CsdlSchema schema = ODataSchemaBuilder.buildMetadata("vdb", teiidSchema);
    TeiidEdmProvider edmProvider = new TeiidEdmProvider("baseuri", schema, "x");
    ServiceMetadata serviceMetadata = odata.createServiceMetadata(edmProvider, Collections.<EdmxReference>emptyList());
    ODataHttpHandler handler = odata.createHandler(serviceMetadata);
    Hashtable<String, String> headers = new Hashtable<String, String>();
    headers.put("Content-Type", "application/json");
    Mockito.stub(client.getMetadataStore()).toReturn(store);
    Mockito.stub(client.executeCount(Mockito.any(Query.class), Mockito.anyListOf(SQLParameter.class))).toReturn(new CountResponse() {

        @Override
        public int getCount() {
            return 10;
        }
    });
    HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
    Mockito.stub(request.getHeaderNames()).toReturn(headers.keys());
    Mockito.stub(request.getHeaders("Content-Type")).toReturn(headers.elements());
    Mockito.stub(request.getMethod()).toReturn(method);
    String requestURL = url;
    String queryString = "";
    int idx = url.indexOf("?");
    if (idx != -1) {
        requestURL = url.substring(0, idx);
        queryString = url.substring(idx + 1);
    }
    Mockito.stub(request.getRequestURL()).toReturn(new StringBuffer(requestURL));
    Mockito.stub(request.getQueryString()).toReturn(queryString);
    Mockito.stub(request.getServletPath()).toReturn("");
    Mockito.stub(request.getContextPath()).toReturn("/odata4/vdb/PM1");
    Mockito.stub(request.getInputStream()).toReturn(stream);
    final StringBuffer sb = new StringBuffer();
    ServletOutputStream out = new ServletOutputStream() {

        @Override
        public void write(int b) throws IOException {
            sb.append((char) b);
        }

        @Override
        public boolean isReady() {
            return true;
        }

        @Override
        public void setWriteListener(WriteListener writeListener) {
        }
    };
    HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
    Mockito.stub(response.getOutputStream()).toReturn(out);
    try {
        TeiidServiceHandler tsh = new TeiidServiceHandler("PM1");
        tsh.setPrepared(false);
        TeiidServiceHandler.setClient(client);
        handler.register(tsh);
        handler.process(request, response);
    } finally {
        TeiidServiceHandler.setClient(null);
    }
    ArgumentCaptor<Integer> statusCapture = ArgumentCaptor.forClass(Integer.class);
    Mockito.verify(response).setStatus(statusCapture.capture());
    state.client = client;
    state.response = sb.toString();
    state.status = statusCapture.getValue();
    return state;
}
Also used : Query(org.teiid.query.sql.lang.Query) ServletOutputStream(javax.servlet.ServletOutputStream) CsdlSchema(org.apache.olingo.commons.api.edm.provider.CsdlSchema) HttpServletRequest(javax.servlet.http.HttpServletRequest) TeiidEdmProvider(org.teiid.olingo.service.TeiidEdmProvider) DDLHolder(org.teiid.query.unittest.RealMetadataFactory.DDLHolder) Client(org.teiid.odata.api.Client) WriteListener(javax.servlet.WriteListener) OData(org.apache.olingo.server.api.OData) TransformationMetadata(org.teiid.query.metadata.TransformationMetadata) Hashtable(java.util.Hashtable) SQLParameter(org.teiid.odata.api.SQLParameter) CountResponse(org.teiid.odata.api.CountResponse) HttpServletResponse(javax.servlet.http.HttpServletResponse) ODataHttpHandler(org.apache.olingo.server.api.ODataHttpHandler) MetadataStore(org.teiid.metadata.MetadataStore) TeiidServiceHandler(org.teiid.olingo.service.TeiidServiceHandler) ServiceMetadata(org.apache.olingo.server.api.ServiceMetadata)

Example 2 with ODataHttpHandler

use of org.apache.olingo.server.api.ODataHttpHandler in project teiid by teiid.

the class ODataFilter method internalDoFilter.

public void internalDoFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, TeiidProcessingException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String proxyURI = this.proxyBaseURI;
    if (proxyURI != null) {
        httpRequest = new ProxyHttpServletRequest(httpRequest, proxyURI);
    }
    VDBKey key = null;
    String vdbName = null;
    String version = null;
    String modelName = null;
    String uri = ((HttpServletRequest) request).getRequestURI().toString();
    String fullURL = ((HttpServletRequest) request).getRequestURL().toString();
    if (uri.startsWith("/odata4/static/") || uri.startsWith("/odata4/keycloak/")) {
        // $NON-NLS-1$ //$NON-NLS-2$
        chain.doFilter(httpRequest, response);
        return;
    }
    String contextPath = httpRequest.getContextPath();
    String baseURI = fullURL.substring(0, fullURL.indexOf(contextPath));
    int endIdx = uri.indexOf('/', contextPath.length() + 1);
    int beginIdx = contextPath.length() + 1;
    if (contextPath.equals("/odata4")) {
        // $NON-NLS-1$
        if (endIdx == -1) {
            throw new TeiidProcessingException(ODataPlugin.Event.TEIID16020, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16020));
        }
        // $NON-NLS-1$
        baseURI = baseURI + "/odata4";
        vdbName = uri.substring(beginIdx, endIdx);
        int modelIdx = uri.indexOf('/', endIdx + 1);
        if (modelIdx == -1) {
            modelName = uri.substring(endIdx + 1).trim();
            if (modelName.isEmpty()) {
                throw new TeiidProcessingException(ODataPlugin.Event.TEIID16019, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16019));
            }
        } else {
            modelName = uri.substring(endIdx + 1, modelIdx);
        }
        // $NON-NLS-1$ //$NON-NLS-2$
        contextPath = contextPath + "/" + vdbName + "/" + modelName;
        vdbName = vdbName.trim();
        if (vdbName.isEmpty()) {
            throw new TeiidProcessingException(ODataPlugin.Event.TEIID16008, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16008));
        }
    } else {
        if (this.initProperties.getProperty("vdb-name") == null) {
            // $NON-NLS-1$
            throw new TeiidProcessingException(ODataPlugin.Event.TEIID16018, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16018));
        }
        // $NON-NLS-1$
        vdbName = this.initProperties.getProperty("vdb-name");
        // $NON-NLS-1$
        version = this.initProperties.getProperty("vdb-version");
        if (endIdx == -1) {
            modelName = uri.substring(beginIdx).trim();
            if (modelName.isEmpty()) {
                throw new TeiidProcessingException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16021));
            }
        } else {
            modelName = uri.substring(beginIdx, endIdx);
        }
        // $NON-NLS-1$
        contextPath = contextPath + "/" + modelName;
    }
    ContextAwareHttpSerlvetRequest contextAwareRequest = new ContextAwareHttpSerlvetRequest(httpRequest);
    contextAwareRequest.setContextPath(contextPath);
    httpRequest = contextAwareRequest;
    key = new VDBKey(vdbName, version);
    if (key.isAtMost()) {
        if (key.getVersion() != null) {
            throw new TeiidProcessingException(ODataPlugin.Event.TEIID16044, ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16044, key));
        }
        // $NON-NLS-1$ //legacy behavior, default to version 1
        key = new VDBKey(vdbName, "1");
    }
    SoftReference<OlingoBridge> ref = this.contextMap.get(key);
    OlingoBridge context = null;
    if (ref != null) {
        context = ref.get();
    }
    if (context == null) {
        context = new OlingoBridge();
        ref = new SoftReference<OlingoBridge>(context);
        this.contextMap.put(key, ref);
    }
    Client client = buildClient(key.getName(), key.getVersion(), this.initProperties);
    try {
        Connection connection = client.open();
        registerVDBListener(client, connection);
        ODataHttpHandler handler = context.getHandler(baseURI, client, modelName);
        httpRequest.setAttribute(ODataHttpHandler.class.getName(), handler);
        httpRequest.setAttribute(Client.class.getName(), client);
        chain.doFilter(httpRequest, response);
    } catch (SQLException e) {
        throw new TeiidProcessingException(e);
    } finally {
        try {
            client.close();
        } catch (SQLException e) {
        // ignore
        }
    }
}
Also used : SQLException(java.sql.SQLException) Connection(java.sql.Connection) LocalServerConnection(org.teiid.transport.LocalServerConnection) OlingoBridge(org.teiid.olingo.service.OlingoBridge) ODataHttpHandler(org.apache.olingo.server.api.ODataHttpHandler) TeiidProcessingException(org.teiid.core.TeiidProcessingException) HttpServletRequest(javax.servlet.http.HttpServletRequest) VDBKey(org.teiid.vdb.runtime.VDBKey) Client(org.teiid.odata.api.Client) LocalClient(org.teiid.olingo.service.LocalClient)

Example 3 with ODataHttpHandler

use of org.apache.olingo.server.api.ODataHttpHandler in project teiid by teiid.

the class ODataServlet method service.

@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
    ODataHttpHandler handler = (ODataHttpHandler) request.getAttribute(ODataHttpHandler.class.getName());
    Client client = (Client) request.getAttribute(Client.class.getName());
    try {
        TeiidServiceHandler.setClient(client);
        handler.process(request, response);
    } finally {
        TeiidServiceHandler.setClient(null);
    }
}
Also used : Client(org.teiid.odata.api.Client) ODataHttpHandler(org.apache.olingo.server.api.ODataHttpHandler)

Example 4 with ODataHttpHandler

use of org.apache.olingo.server.api.ODataHttpHandler in project cxf by apache.

the class JaxrsODataService method service.

@GET
@Path("{id:.*}")
public Response service(@Context HttpServletRequest req, @Context HttpServletResponse resp) {
    String requestMapping = req.getContextPath() + req.getServletPath() + "/DemoService.svc";
    req.setAttribute("requestMapping", requestMapping);
    // create odata handler and configure it with EdmProvider and Processor
    OData odata = OData.newInstance();
    ServiceMetadata edm = odata.createServiceMetadata(new DemoEdmProvider(), new ArrayList<EdmxReference>());
    ODataHttpHandler handler = odata.createHandler(edm);
    handler.register(new DemoEntityCollectionProcessor());
    // let the handler do the work
    handler.process(req, resp);
    return Response.ok().build();
}
Also used : OData(org.apache.olingo.server.api.OData) ServiceMetadata(org.apache.olingo.server.api.ServiceMetadata) EdmxReference(org.apache.olingo.commons.api.edmx.EdmxReference) ODataHttpHandler(org.apache.olingo.server.api.ODataHttpHandler) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET)

Example 5 with ODataHttpHandler

use of org.apache.olingo.server.api.ODataHttpHandler in project teiid by teiid.

the class OlingoBridge method getHandler.

public ODataHttpHandler getHandler(String baseUri, Client client, String schemaName) throws ServletException {
    if (this.handlers.get(schemaName) == null) {
        org.teiid.metadata.Schema teiidSchema = client.getMetadataStore().getSchema(schemaName);
        if (teiidSchema == null || !isVisible(client.getVDB(), teiidSchema)) {
            throw new ServletException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16022));
        }
        try {
            OData odata = OData4Impl.newInstance();
            VDBMetaData vdb = client.getVDB();
            CsdlSchema schema = ODataSchemaBuilder.buildMetadata(vdb.getFullName(), teiidSchema);
            TeiidEdmProvider edmProvider = new TeiidEdmProvider(baseUri, schema, client.getProperty(Client.INVALID_CHARACTER_REPLACEMENT));
            ServiceMetadata metadata = odata.createServiceMetadata(edmProvider, edmProvider.getReferences());
            ODataHttpHandler handler = odata.createHandler(metadata);
            handler.register(new TeiidServiceHandler(schemaName));
            this.handlers.put(schemaName, handler);
        } catch (XMLStreamException e) {
            throw new ServletException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16054));
        } catch (ODataException e) {
            throw new ServletException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID16054));
        }
    }
    return this.handlers.get(schemaName);
}
Also used : OData(org.apache.olingo.server.api.OData) CsdlSchema(org.apache.olingo.commons.api.edm.provider.CsdlSchema) ODataHttpHandler(org.apache.olingo.server.api.ODataHttpHandler) ServletException(javax.servlet.ServletException) ODataException(org.apache.olingo.commons.api.ex.ODataException) XMLStreamException(javax.xml.stream.XMLStreamException) VDBMetaData(org.teiid.adminapi.impl.VDBMetaData) ServiceMetadata(org.apache.olingo.server.api.ServiceMetadata)

Aggregations

ODataHttpHandler (org.apache.olingo.server.api.ODataHttpHandler)5 OData (org.apache.olingo.server.api.OData)3 ServiceMetadata (org.apache.olingo.server.api.ServiceMetadata)3 Client (org.teiid.odata.api.Client)3 HttpServletRequest (javax.servlet.http.HttpServletRequest)2 CsdlSchema (org.apache.olingo.commons.api.edm.provider.CsdlSchema)2 Connection (java.sql.Connection)1 SQLException (java.sql.SQLException)1 Hashtable (java.util.Hashtable)1 ServletException (javax.servlet.ServletException)1 ServletOutputStream (javax.servlet.ServletOutputStream)1 WriteListener (javax.servlet.WriteListener)1 HttpServletResponse (javax.servlet.http.HttpServletResponse)1 GET (javax.ws.rs.GET)1 Path (javax.ws.rs.Path)1 XMLStreamException (javax.xml.stream.XMLStreamException)1 EdmxReference (org.apache.olingo.commons.api.edmx.EdmxReference)1 ODataException (org.apache.olingo.commons.api.ex.ODataException)1 VDBMetaData (org.teiid.adminapi.impl.VDBMetaData)1 TeiidProcessingException (org.teiid.core.TeiidProcessingException)1