Package org.nimbustools.ctxbroker.service

Source Code of org.nimbustools.ctxbroker.service.ContextBrokerServiceImpl

/*
* Copyright 1999-2008 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/

package org.nimbustools.ctxbroker.service;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.axis.message.addressing.EndpointReferenceType;

import org.nimbustools.ctxbroker.generated.gt4_0.types.VoidType;
import org.nimbustools.ctxbroker.generated.gt4_0.types.RetrieveResponse_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.InjectData_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.ErrorExitingSend_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.OkExitingSend_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.InjectData_TypeData;
import org.nimbustools.ctxbroker.generated.gt4_0.types.IdentitiesResponse_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.IdentitiesSend_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.CreateContextResponse_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.types.CreateContext_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.description.IdentityProvides_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.description.Requires_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.description.BrokerContactType;
import org.nimbustools.ctxbroker.generated.gt4_0.description.AgentDescription_Type;
import org.nimbustools.ctxbroker.generated.gt4_0.broker.NimbusContextualizationFault;
import org.nimbustools.ctxbroker.BrokerConstants;
import org.nimbustools.ctxbroker.ContextBrokerException;

import org.globus.wsrf.Constants;
import org.globus.wsrf.ResourceContext;
import org.globus.wsrf.security.SecurityManager;
import org.nimbustools.ctxbroker.rest.RestHttp;

import javax.naming.InitialContext;
import java.io.File;

public class ContextBrokerServiceImpl implements ContextBrokerService {

    // -------------------------------------------------------------------------
    // STATIC VARIABLES
    // -------------------------------------------------------------------------
   
    private static final Log logger =
        LogFactory.getLog(ContextBrokerServiceImpl.class.getName());

    public static final String CONTEXTUALIZATION_HOME =
                        Constants.JNDI_SERVICES_BASE_NAME +
                                BrokerConstants.CTX_BROKER_PATH + "/home";

    public static final String REST_HTTP =
                        Constants.JNDI_SERVICES_BASE_NAME +
                                BrokerConstants.CTX_BROKER_PATH + "/rest";


    // -------------------------------------------------------------------------
    // INSTANCE VARIABLES
    // -------------------------------------------------------------------------

    private final ContextBrokerHome home;
    private final RestHttp restHttp;

   
    // -------------------------------------------------------------------------
    // CONSTRUCTOR
    // -------------------------------------------------------------------------

    public ContextBrokerServiceImpl() throws Exception {
        this.home = discoverHome();
        this.restHttp = discoverRestHttp();
    }

    protected static ContextBrokerHome discoverHome() throws Exception {

        InitialContext ctx = null;
        try {
            ctx = new InitialContext();

            final ContextBrokerHome home =
                    (ContextBrokerHome) ctx.lookup(CONTEXTUALIZATION_HOME);

            if (home == null) {
                throw new Exception("null from JNDI for ContextBrokerHome (?)");
            }

            return home;

        } finally {
            if (ctx != null) {
                ctx.close();
            }
        }
    }

    protected static RestHttp discoverRestHttp() throws Exception {

        InitialContext ctx = null;
        try {
            ctx = new InitialContext();

            final RestHttp rest =
                    (RestHttp) ctx.lookup(REST_HTTP);

            if (rest == null) {
                throw new Exception("null from JNDI for RestHttp (?)");
            }

            return rest;

        } finally {
            if (ctx != null) {
                ctx.close();
            }
        }
    }
   

    // -------------------------------------------------------------------------
    // implements ContextBrokerService
    // -------------------------------------------------------------------------

    public CreateContextResponse_Type create(CreateContext_Type create)
            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();
        logger.info("WS-CTX-CREATE invoked by " + caller);

        if (caller == null || caller.trim().length() == 0) {
            throw ContextFault.makeCtxFault(
                    "WS-CTX-CREATE caller is empty (?)", null);
        }

        boolean expectInjections = false;
        if (create != null && create.isExpectInjections()) {
            expectInjections = true;
        }
       
        try {
            final EndpointReferenceType ref =
                    this.home.createNewResource(caller, expectInjections);
            final String id = this.home.getResourceKey(ref).toString();

            final CreateContextResponse_Type resp =
                    new CreateContextResponse_Type();
            resp.setContextEPR(ref);
            resp.setContact(
                    new BrokerContactType(this.home.getBrokerURL(), id,
                                          this.home.getContextSecret(ref)));

            return resp;
           
        } catch (ContextBrokerException e) {
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }
    }

    public VoidType injectdata(InjectData_Type sent)
            throws NimbusContextualizationFault {

        if (sent == null) {
            throw ContextFault.makeCtxFault("sent empty input", null);
        }

        final InjectData_TypeData[] datas = sent.getData();
        if (datas == null || datas.length == 0) {
            throw ContextFault.makeCtxFault("sent empty input", null);
        }

        final String caller = SecurityManager.getManager().getCaller();
        logger.info("WS-CTX-INJECT-DATA invoked by " + caller);

        if (caller == null || caller.trim().length() == 0) {
            logger.trace("WS-CTX-INJECT-DATA caller is empty", null);
        }

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        // Dirty, but lets us have one resource with one policy (bootstrap
        // credential still gets access to retrieve).
        if (caller == null || !caller.equals(resource.getCreatorDN())) {
            logger.info("WS-CTX-INJECT-DATA unauthorized " +
                        "-- invoked by " + caller);
            throw ContextFault.makeCtxFault("unauthorized", null);
        }

        for (InjectData_TypeData data : datas) {
            try {
                resource.injectData(data.getName(), data.get_value());
            } catch (ContextBrokerException e) {
                if (logger.isDebugEnabled()) {
                    logger.error(e.getMessage(), e);
                } else {
                    logger.error(e.getMessage());
                }
                throw ContextFault.makeCtxFault(e.getMessage(), null);
            }
        }
        return new VoidType();
    }

    public VoidType errorExiting(ErrorExitingSend_Type sent)
            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();

        IdentityProvides_Type[] identities;
        Integer id = null;
        StringBuffer buf;

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        buf = new StringBuffer();
        buf.append("WS-CTX-ERROR-EXITING invoked by '")
           .append(caller)
           .append("' (");
        if (sent != null) {
            identities = sent.getIdentity();
            if (identities == null) {
                buf.append("identities is null");
            } else {
                id = this.getID(resource, identities, null);
                if (id != null) {
                    buf.append("identities map to #")
                       .append(id);
                } else {
                    buf.append("identities don't map to a known ID");
                }
            }
        } else {
            buf.append("sent envelope is null");
        }
        buf.append(")");
        logger.error(buf.toString());

        if (sent == null) {
            throw ContextFault.makeCtxFault("empty input", null);
        }

        if (id == null) {
            throw ContextFault.makeCtxFault(
                    "cannot resolve WS-CTX-ERROR-EXITING caller", null);
        }

        try {
            resource.errorExit(id, sent.getErrorcode(), sent.getMessage());
        } catch (ContextBrokerException e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }
        return new VoidType();
    }

    public VoidType okExiting(OkExitingSend_Type sent)
            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();

        IdentityProvides_Type[] identities;
        Integer id = null;
        StringBuffer buf = null;

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        // this is debug level because it would be overwhelming in anything
        // but test situations
        if (logger.isDebugEnabled()) {
            buf = new StringBuffer();
            buf.append("WS-CTX-OK-EXITING invoked by '")
               .append(caller)
               .append("' (");
            if (sent != null) {
                identities = sent.getIdentity();
                if (identities == null) {
                    buf.append("identities is null");
                } else {
                    id = this.getID(resource, identities, null);
                    if (id != null) {
                        buf.append("identities map to #")
                           .append(id);
                    } else {
                        buf.append("identities don't map to a known ID");
                    }
                }
            } else {
                buf.append("sent envelope is null");
            }
            buf.append(")");
            logger.debug(buf.toString());
        }

        if (sent == null) {
            throw ContextFault.makeCtxFault("empty input", null);
        }

        if (buf == null) {
            identities = sent.getIdentity();
            id = this.getID(resource, identities, null);
        }

        if (id == null) {
            throw ContextFault.makeCtxFault(
                    "cannot resolve WS-CTX-OK-EXITING caller", null);
        }

        try {
            resource.okExit(id);
        } catch (ContextBrokerException e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }
        return new VoidType();
    }

    public VoidType noMoreInjections(VoidType none)

            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();
        logger.info("WS-NO-MORE-INJECTIONS invoked by " + caller);

        if (caller == null || caller.trim().length() == 0) {
            logger.trace("WS-NO-MORE-INJECTIONS caller is empty", null);
        }

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        // Dirty, but lets us have one resource with one policy (bootstrap
        // credential still gets access to retrieve).
        //
        // Caller can be null so that an internal service thread can lock
        // if need be.
        if (caller != null && !caller.equals(resource.getCreatorDN())) {
            logger.info("WS-NO-MORE-INJECTIONS unauthorized " +
                        "-- invoked by " + caller);
            throw ContextFault.makeCtxFault("unauthorized", null);
        }

        try {
            resource.noMoreInjections();
        } catch (ContextBrokerException e) {
            throw ContextFault.makeCtxFault(e.getMessage(), e);
        }
       
        return new VoidType();
    }

    public RetrieveResponse_Type retrieve(AgentDescription_Type sent)

            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();

        IdentityProvides_Type[] identities = null;
        Integer id = null;
        StringBuffer buf = null;

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        // this is debug level because it would be overwhelming in anything
        // but test situations
        if (logger.isDebugEnabled()) {
            buf = new StringBuffer();
            buf.append("WS-CTX-RETRIEVE invoked by '")
               .append(caller)
               .append("' (");
            if (sent != null) {
                identities = sent.getIdentity();
                if (identities == null) {
                    buf.append("identities is null");
                } else {
                    id = this.getID(resource, identities, sent);
                    if (id != null) {
                        buf.append("identities map to #")
                           .append(id);
                    } else {
                        buf.append("identities don't map to a known ID");
                    }
                }
            } else {
                buf.append("sent envelope is null");
            }
            buf.append(")");
            logger.debug(buf.toString());
        }

        if (sent == null) {
            throw ContextFault.makeCtxFault("empty input", null);
        }

        if (buf == null) {
            identities = sent.getIdentity();
            id = this.getID(resource, identities, sent);
        }

        if (id == null) {
            throw ContextFault.makeCtxFault(
                    "broker cannot resolve this caller's identity", null);
        }

        final Requires_Type requires;
        try {
            requires = resource.retrieve(id);
        } catch (ContextBrokerException e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        final RetrieveResponse_Type response = new RetrieveResponse_Type();

        // For now we take requires being null to mean node is not complete.
        // If resource is not locked we are also currently not answering.
        // i.e., no partial answers.  Also for now.

        if (requires == null) {
            //requires = new Requires_Type();
            //requires.setIdentity(null);
            //requires.setRole(null);
            response.setComplete(false);
        } else {
            response.setComplete(true);
        }

        response.setNoMoreInjections(resource.isNoMoreInjections());
        response.setRequires(requires);

        return response;
    }

    public IdentitiesResponse_Type identities(IdentitiesSend_Type sent)
            throws NimbusContextualizationFault {

        final String caller = SecurityManager.getManager().getCaller();

        final ContextBrokerResource resource;
        try {
            resource = getResource();
        } catch (Exception e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }

        boolean all = false;
        String host = null;
        String ip = null;
        if (sent != null) {
            if (sent.getAll() != null) {
                all = sent.getAll();
            }
            host = sent.getHost();
            ip = sent.getIp();
        }

        StringBuffer buf;
       
        buf = new StringBuffer();
        buf.append("WS-CTX-IDENTITIES invoked by '")
           .append(caller)
           .append("' (");
        if (sent != null) {
            buf.append("all: ")
               .append(all)
               .append(", host: '")
               .append(host)
               .append("', ip: '")
               .append(ip)
               .append("'");
        } else {
            buf.append("sent envelope is null");
        }
        buf.append(")");
        logger.info(buf.toString());

        final IdentitiesResponse_Type response = new IdentitiesResponse_Type();
        try {
            if (all) {
                response.setNode(resource.identityQueryAll());
            } else if (host != null) {
                response.setNode(resource.identityQueryHost(host));
            } else if (ip != null) {
                response.setNode(resource.identityQueryIP(ip));
            } else {
                throw ContextFault.makeCtxFault("nothing queried?", null);
            }
        } catch (ContextBrokerException e) {
            if (logger.isDebugEnabled()) {
                logger.error(e.getMessage(), e);
            } else {
                logger.error(e.getMessage());
            }
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }
       
        return response;
    }
   

    // -------------------------------------------------------------------------
    // OTHER
    // -------------------------------------------------------------------------

    private Integer getID(ContextBrokerResource resource,
                          IdentityProvides_Type[] identities,
                          AgentDescription_Type sent)
            throws NimbusContextualizationFault {

        // every single query from an agent must contain identities
        if (identities == null || identities.length == 0) {
            logger.error("Caller did not send identities.");
            return null;
        }

        try {
            return this.home.getID(resource, identities, sent);
        } catch (ContextBrokerException e) {
            logger.error(e.getMessage(), e);
            throw ContextFault.makeCtxFault(e.getMessage(), null);
        }
    }

    private static ContextBrokerResource getResource()
            throws Exception {
       
        try {
            final ResourceContext context =
                    ResourceContext.getResourceContext();
            return (ContextBrokerResource)context.getResource();
        } catch (Exception e) {
            final String err = "could not find that context";
            logger.error(err, e);
            throw new Exception(err, e);
        }
    }
}
TOP

Related Classes of org.nimbustools.ctxbroker.service.ContextBrokerServiceImpl

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.