Package org.openbel.framework.ws.endpoint

Source Code of org.openbel.framework.ws.endpoint.KamUtilsEndPoint

/**
* Copyright (C) 2012-2013 Selventa, Inc.
*
* This file is part of the OpenBEL Framework.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The OpenBEL Framework is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the OpenBEL Framework. If not, see <http://www.gnu.org/licenses/>.
*
* Additional Terms under LGPL v3:
*
* This license does not authorize you and you are prohibited from using the
* name, trademarks, service marks, logos or similar indicia of Selventa, Inc.,
* or, in the discretion of other licensors or authors of the program, the
* name, trademarks, service marks, logos or similar indicia of such authors or
* licensors, in any marketing or advertising materials relating to your
* distribution of the program or any covered product. This restriction does
* not waive or limit your obligation to keep intact all copyright notices set
* forth in the program as delivered to you.
*
* If you distribute the program in whole or in part, or any modified version
* of the program, and you assume contractual liability to the recipient with
* respect to the program or modified version, then you will indemnify the
* authors and licensors of the program for any liabilities that these
* contractual assumptions directly impose on those licensors and authors.
*/
package org.openbel.framework.ws.endpoint;

import static java.lang.String.format;
import static org.openbel.framework.api.KamCacheService.LoadStatus.LOADING;
import static org.openbel.framework.api.KamUtils.difference;
import static org.openbel.framework.api.KamUtils.intersection;
import static org.openbel.framework.api.KamUtils.newInstance;
import static org.openbel.framework.api.KamUtils.union;
import static org.openbel.framework.common.BELUtilities.getFirstMessage;
import static org.openbel.framework.common.BELUtilities.noItems;
import static org.openbel.framework.common.Strings.KAM_REQUEST_NO_KAM;
import static org.openbel.framework.common.Strings.KAM_REQUEST_NO_KAM_FOR_HANDLE;
import static org.openbel.framework.common.Strings.KAM_REQUEST_NO_KAM_FOR_NAME;
import static org.openbel.framework.common.Strings.KAM_REQUEST_NO_NAME;
import static org.openbel.framework.ws.model.KAMLoadStatus.FAILED;
import static org.openbel.framework.ws.utils.Converter.convert;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.openbel.framework.api.KamCacheService;
import org.openbel.framework.api.KamCacheService.LoadKAMResult;
import org.openbel.framework.api.internal.KAMCatalogDao;
import org.openbel.framework.api.internal.KAMCatalogDao.KamInfo;
import org.openbel.framework.api.KamCacheServiceException;
import org.openbel.framework.ws.core.MissingRequest;
import org.openbel.framework.ws.core.RequestException;
import org.openbel.framework.ws.model.DifferenceKamsRequest;
import org.openbel.framework.ws.model.DifferenceKamsResponse;
import org.openbel.framework.ws.model.GetNewInstanceRequest;
import org.openbel.framework.ws.model.GetNewInstanceResponse;
import org.openbel.framework.ws.model.IntersectKamsRequest;
import org.openbel.framework.ws.model.IntersectKamsResponse;
import org.openbel.framework.ws.model.KAMLoadStatus;
import org.openbel.framework.ws.model.Kam;
import org.openbel.framework.ws.model.KamEdge;
import org.openbel.framework.ws.model.KamHandle;
import org.openbel.framework.ws.model.LoadKamRequest;
import org.openbel.framework.ws.model.LoadKamResponse;
import org.openbel.framework.ws.model.ObjectFactory;
import org.openbel.framework.ws.model.ReleaseKamRequest;
import org.openbel.framework.ws.model.ReleaseKamResponse;
import org.openbel.framework.ws.model.UnionKamsRequest;
import org.openbel.framework.ws.model.UnionKamsResponse;
import org.openbel.framework.ws.service.KamStoreServiceException;
import org.openbel.framework.ws.utils.Converter;
import org.openbel.framework.ws.utils.InvalidIdException;
import org.openbel.framework.ws.utils.ObjectFactorySingleton;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

/**
* TODO Provide documentation
*/
@Endpoint
public class KamUtilsEndPoint extends WebServiceEndpoint {
    private static final String LOAD_KAM_REQUEST = "LoadKamRequest";
    private static final String RELEASE_KAM_REQUEST = "ReleaseKamRequest";
    private static final String GET_NEW_INSTANCE_REQUEST =
            "GetNewInstanceRequest";
    private static final String KAM_UNION_REQUEST = "UnionKamsRequest";
    private static final String KAM_INTERSECTION_REQUEST =
            "IntersectKamsRequest";
    private static final String KAM_DIFFERENCE_REQUEST =
            "DifferenceKamsRequest";
    private static final ObjectFactory OBJECT_FACTORY = ObjectFactorySingleton
            .getInstance();

    @Autowired(required = true)
    private KamCacheService kamCacheService;
    @Autowired
    private KAMCatalogDao kamCatalogDao;

    public KamUtilsEndPoint() {
        super();
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = LOAD_KAM_REQUEST)
    @ResponsePayload
    public LoadKamResponse loadKam(@RequestPayload LoadKamRequest request)
            throws RequestException {

        // validate request
        if (request == null) {
            throw new MissingRequest(LOAD_KAM_REQUEST);
        }

        Kam kam = request.getKam();
        if (kam == null) {
            throw new RequestException(KAM_REQUEST_NO_KAM);
        }
        if (kam.getName() == null) {
            throw new RequestException(KAM_REQUEST_NO_NAME);
        }

        KamInfo kamInfo = null;
        List<KamInfo> catalog;
        try {
            catalog = kamCatalogDao.getCatalog();
        } catch (SQLException e) {
            String msg = getFirstMessage(e);
            LoadKamResponse resp = OBJECT_FACTORY.createLoadKamResponse();
            resp.setLoadStatus(FAILED);
            resp.setMessage(msg);
            return resp;
        }

        for (final KamInfo ki : catalog) {
            if (ki.getName().equals(kam.getName())) {
                kamInfo = ki;
                break;
            }
        }

        if (kamInfo == null) {
            String errorMsg = KAM_REQUEST_NO_KAM_FOR_NAME;
            String msg = format(errorMsg, kam.getName());
            LoadKamResponse resp = OBJECT_FACTORY.createLoadKamResponse();
            resp.setLoadStatus(FAILED);
            resp.setMessage(msg);
            return resp;
        }

        KAMCatalogDao.KamFilter filter;
        try {
            filter = convert(request.getFilter(), kamInfo);
        } catch (InvalidIdException ex) {
            LoadKamResponse resp = OBJECT_FACTORY.createLoadKamResponse();
            resp.setLoadStatus(FAILED);
            resp.setMessage(ex.getMessage());
            return resp;
        }

        LoadKAMResult rslt;
        try {
            rslt = kamCacheService.loadKamWithResult(kamInfo, filter);
        } catch (KamCacheServiceException e) {
            String msg = getFirstMessage(e);
            LoadKamResponse resp = OBJECT_FACTORY.createLoadKamResponse();
            resp.setLoadStatus(FAILED);
            resp.setMessage(msg);
            return resp;
        }

        LoadKamResponse resp = OBJECT_FACTORY.createLoadKamResponse();
        if (rslt.getStatus() == LOADING) {
            resp.setLoadStatus(KAMLoadStatus.IN_PROCESS);
            return resp;
        }
        KamHandle kamHandle = OBJECT_FACTORY.createKamHandle();
        kamHandle.setHandle(rslt.getHandle());
        resp.setHandle(kamHandle);
        resp.setLoadStatus(KAMLoadStatus.COMPLETE);
        return resp;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = RELEASE_KAM_REQUEST)
    @ResponsePayload
    public ReleaseKamResponse releaseKam(
            @RequestPayload ReleaseKamRequest request) throws Exception {

        // validate request
        if (request == null) {
            throw new MissingRequest(RELEASE_KAM_REQUEST);
        }

        // Make sure a Kam was specified in the request
        KamHandle kamHandle = request.getKam();
        if (null == kamHandle) {
            throw new KamStoreServiceException("KamHandle payload is missing");
        }

        // Release the kam
        kamCacheService.releaseKam(kamHandle.getHandle());

        // Set up the response
        ReleaseKamResponse response = OBJECT_FACTORY.createReleaseKamResponse();
        return response;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = GET_NEW_INSTANCE_REQUEST)
    @ResponsePayload
    public
            GetNewInstanceResponse getNewInstance(
                    @RequestPayload GetNewInstanceRequest request)
                    throws Exception {

        // validate request
        if (request == null) {
            throw new MissingRequest(GET_NEW_INSTANCE_REQUEST);
        }

        // Make sure a Kam was specified in the request
        KamHandle kamHandle = request.getHandle();
        if (null == kamHandle) {
            throw new KamStoreServiceException("KamHandle payload is missing");
        }

        // Get the real Kam from the KamCache
        org.openbel.framework.api.Kam objKam =
                kamCacheService.getKam(kamHandle.getHandle());
        if (objKam == null) {
            throw new RequestException(format(KAM_REQUEST_NO_KAM_FOR_HANDLE,
                    kamHandle.getHandle()));
        }

        // Use the KamUtils class to do the work
        org.openbel.framework.api.Kam objNewKamInstance;
        objNewKamInstance = newInstance(objKam);

        // Set up the response
        GetNewInstanceResponse response = OBJECT_FACTORY
                .createGetNewInstanceResponse();
        response.setHandle(cacheDerivedKam(objNewKamInstance));
        return response;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = KAM_UNION_REQUEST)
    @ResponsePayload
    public UnionKamsResponse
            unionKams(@RequestPayload UnionKamsRequest request)
                    throws RequestException {

        // validate request
        if (request == null) {
            throw new MissingRequest(KAM_UNION_REQUEST);
        }

        KamHandle kam1 = request.getKam1();
        if (null == kam1) {
            throw new RequestException("kamHandle for Kam1 payload is missing");
        }

        KamHandle kam2 = request.getKam2();
        List<KamEdge> kamEdges = request.getKamEdges();

        if (kam2 == null && noItems(kamEdges)) {
            final String msg = "Missing kam2 and kamEdges - nothing to do";
            throw new RequestException(msg);
        }

        org.openbel.framework.api.Kam objKam1;
        objKam1 = kamCacheService.getKam(kam1.getHandle());
        if (objKam1 == null) {
            throw new RequestException(format(KAM_REQUEST_NO_KAM_FOR_HANDLE,
                    kam1.getHandle()));
        }

        org.openbel.framework.api.Kam objNewKam = null;
        if (null != kam2) {
            org.openbel.framework.api.Kam objKam2;
            objKam2 = kamCacheService.getKam(kam2.getHandle());
            if (objKam2 == null) {
                throw new RequestException(format(
                        KAM_REQUEST_NO_KAM_FOR_HANDLE, kam2.getHandle()));
            }

            objNewKam = union(objKam1, objKam2);
        } else {
            List<org.openbel.framework.api.Kam.KamEdge> edges =
                    convertEdges(
                            kamEdges, objKam1);
            objNewKam = union(objKam1, edges);
        }

        UnionKamsResponse response = OBJECT_FACTORY.createUnionKamsResponse();
        response.setHandle(cacheDerivedKam(objNewKam));
        return response;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = KAM_INTERSECTION_REQUEST)
    @ResponsePayload
    public
            IntersectKamsResponse intersectKams(
                    @RequestPayload IntersectKamsRequest request)
                    throws RequestException {

        // validate request
        if (request == null) {
            throw new MissingRequest(KAM_INTERSECTION_REQUEST);
        }

        KamHandle kam1 = request.getKam1();
        if (null == kam1) {
            throw new RequestException("kamHandle for Kam1 payload is missing");
        }

        KamHandle kam2 = request.getKam2();
        List<KamEdge> kamEdges = request.getKamEdges();

        if (kam2 == null && noItems(kamEdges)) {
            final String msg = "Missing kam2 and kamEdges - nothing to do";
            throw new RequestException(msg);
        }

        org.openbel.framework.api.Kam objKam1;
        objKam1 = kamCacheService.getKam(kam1.getHandle());
        if (objKam1 == null) {
            throw new RequestException(format(KAM_REQUEST_NO_KAM_FOR_HANDLE,
                    kam1.getHandle()));
        }

        org.openbel.framework.api.Kam objNewKam = null;
        if (null != kam2) {
            // Get the real Kam from the KamCache
            org.openbel.framework.api.Kam objKam2;
            objKam2 = kamCacheService.getKam(kam2.getHandle());
            if (objKam2 == null) {
                throw new RequestException(format(
                        KAM_REQUEST_NO_KAM_FOR_HANDLE, kam2.getHandle()));
            }
            objNewKam = intersection(objKam1, objKam2);
        } else {
            List<org.openbel.framework.api.Kam.KamEdge> edges =
                    convertEdges(
                            kamEdges, objKam1);
            objNewKam = intersection(objKam1, edges);
        }

        IntersectKamsResponse response = OBJECT_FACTORY
                .createIntersectKamsResponse();
        response.setHandle(cacheDerivedKam(objNewKam));
        return response;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = KAM_DIFFERENCE_REQUEST)
    @ResponsePayload
    public DifferenceKamsResponse differenceKams(
            @RequestPayload DifferenceKamsRequest request)
            throws RequestException {

        // validate request
        if (request == null) {
            throw new MissingRequest(KAM_DIFFERENCE_REQUEST);
        }

        KamHandle kam1 = request.getKam1();
        if (null == kam1) {
            throw new RequestException("kamHandle for Kam1 payload is missing");
        }

        KamHandle kam2 = request.getKam2();
        List<KamEdge> kamEdges = request.getKamEdges();

        if (kam2 == null && noItems(kamEdges)) {
            final String msg = "Missing kam2 and kamEdges - nothing to do";
            throw new RequestException(msg);
        }

        org.openbel.framework.api.Kam objKam1;
        objKam1 = kamCacheService.getKam(kam1.getHandle());
        if (objKam1 == null) {
            throw new RequestException(format(KAM_REQUEST_NO_KAM_FOR_HANDLE,
                    kam1.getHandle()));
        }

        org.openbel.framework.api.Kam objNewKam = null;
        if (null != kam2) {
            org.openbel.framework.api.Kam objKam2;
            objKam2 = kamCacheService.getKam(kam2.getHandle());
            if (objKam2 == null) {
                throw new RequestException(format(
                        KAM_REQUEST_NO_KAM_FOR_HANDLE, kam2.getHandle()));
            }
            objNewKam = difference(objKam1, objKam2);
        } else {
            List<org.openbel.framework.api.Kam.KamEdge> edges =
                    convertEdges(
                            kamEdges, objKam1);
            objNewKam = difference(objKam1, edges);
        }

        DifferenceKamsResponse response = OBJECT_FACTORY
                .createDifferenceKamsResponse();
        response.setHandle(cacheDerivedKam(objNewKam));
        return response;
    }

    private KamHandle cacheDerivedKam(
            org.openbel.framework.api.Kam derivedKam) {

        String kamHandleString = kamCacheService.cacheKam(derivedKam
                .getKamInfo().getName(), derivedKam);

        KamHandle kamHandle = OBJECT_FACTORY.createKamHandle();
        kamHandle.setHandle(kamHandleString);

        return kamHandle;
    }

    private List<org.openbel.framework.api.Kam.KamEdge>
            convertEdges(
                    List<KamEdge> kamEdges,
                    org.openbel.framework.api.Kam objKam1)
                    throws RequestException {
        List<org.openbel.framework.api.Kam.KamEdge> edges =
                new ArrayList<org.openbel.framework.api.Kam.KamEdge>();
        for (final KamEdge wke : kamEdges) {
            try {
                org.openbel.framework.api.Kam.KamEdge edge =
                        Converter
                                .convert(wke, objKam1);

                // only add edge if it existed in kam1.
                if (edge != null) {
                    edges.add(edge);
                }
            } catch (InvalidIdException e) {
                throw new RequestException(
                        "KamEdge was not found in Kam1. ", e);
            }
        }
        return edges;
    }

    public void setKamCacheService(KamCacheService kamCacheService) {
        this.kamCacheService = kamCacheService;
    }

    public void setKamCatalogDao(KAMCatalogDao kamCatalogDao) {
        this.kamCatalogDao = kamCatalogDao;
    }
}
TOP

Related Classes of org.openbel.framework.ws.endpoint.KamUtilsEndPoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.