Package org.rioproject.monitor.proxy

Source Code of org.rioproject.monitor.proxy.ProvisionMonitorAdminProxy$Verifier

/*
* Copyright to the original author or authors.
*
* 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.rioproject.monitor.proxy;

import com.sun.jini.proxy.ConstrainableProxyUtil;
import net.jini.core.constraint.MethodConstraints;
import net.jini.core.constraint.RemoteMethodControl;
import net.jini.id.Uuid;
import net.jini.security.TrustVerifier;
import net.jini.security.proxytrust.ProxyTrustIterator;
import net.jini.security.proxytrust.SingletonProxyTrustIterator;
import net.jini.security.proxytrust.TrustEquivalence;
import org.rioproject.deploy.DeploymentResult;
import org.rioproject.deploy.ServiceProvisionListener;
import org.rioproject.monitor.ProvisionMonitor.PeerInfo;
import org.rioproject.monitor.ProvisionMonitorAdmin;
import org.rioproject.opstring.OperationalString;
import org.rioproject.opstring.OperationalStringException;
import org.rioproject.opstring.OperationalStringManager;
import org.rioproject.proxy.admin.ServiceAdminProxy;
import org.rioproject.system.ComputeResourceUtilization;
import org.rioproject.system.ResourceCapability;

import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.rmi.RemoteException;

/**
* A <code>ProvisionMonitorAdminProxy</code> is a proxy for the
* ProvisionMonitorAdmin server. This is the object passed to clients of the
* ProvisionMonitorAdmin.
*
* @author Dennis Reedy
*/
public class ProvisionMonitorAdminProxy extends ServiceAdminProxy implements ProvisionMonitorAdmin, Serializable {
    private static final long serialVersionUID = 2L;
    final ProvisionMonitorAdmin monitorAdminProxy;

    /**
     * Creates a ProvisionMonitorAdmin proxy, returning an instance that implements
     * RemoteMethodControl if the server does too.
     *
     * @param serviceAdmin The ProvisionMonitorAdmin server
     * @param id The Uuid of the ProvisionMonitorAdmin
     */
    public static ProvisionMonitorAdminProxy getInstance(final ProvisionMonitorAdmin serviceAdmin, final Uuid id) {
       
        if(serviceAdmin instanceof RemoteMethodControl) {
            return new ConstrainableProvisionMonitorAdminProxy(serviceAdmin, id, null);
        } else {
            return(new ProvisionMonitorAdminProxy(serviceAdmin, id));
        }
    }

    /*
     * Private constructor
     */
    private ProvisionMonitorAdminProxy(final ProvisionMonitorAdmin serviceAdmin, final Uuid uuid) {
        super(serviceAdmin, uuid);
        this.monitorAdminProxy = serviceAdmin;
    }

    /**
     * A subclass of ProvisionMonitorAdminProxy that implements RemoteMethodControl.
     */
    final static class ConstrainableProvisionMonitorAdminProxy
        extends ProvisionMonitorAdminProxy implements RemoteMethodControl {
        private static final long serialVersionUID = 2L;       
       
        /* Creates an instance of this class. */
        private ConstrainableProvisionMonitorAdminProxy(final ProvisionMonitorAdmin serviceAdmin,
                                                        final Uuid id,
                                                        final MethodConstraints constraints) {
            super(constrainServer(serviceAdmin, constraints), id);
        }

        /*
          * Returns a copy of the server proxy with the specified client
          * constraints and methods mapping.
          */
        private static ProvisionMonitorAdmin constrainServer(final ProvisionMonitorAdmin serviceAdmin,
                                                             final MethodConstraints constraints) {
            Method[] methods = ProvisionMonitorAdmin.class.getMethods();
            Method[] methodMapping = new java.lang.reflect.Method[methods.length*2];
            for(int i=0; i<methodMapping.length; i++)
                methodMapping[i] = methods[i/2];
            MethodConstraints methodConstraints = ConstrainableProxyUtil.translateConstraints(constraints, methodMapping);
            return (ProvisionMonitorAdmin)((RemoteMethodControl)serviceAdmin).setConstraints(methodConstraints);
        }

        /** @see net.jini.core.constraint.RemoteMethodControl#setConstraints  */
        public RemoteMethodControl setConstraints(final MethodConstraints constraints) {
            return(new ConstrainableProvisionMonitorAdminProxy((ProvisionMonitorAdmin)serviceAdmin, uuid, constraints));
        }
       
        /** @see RemoteMethodControl#getConstraints */
        public MethodConstraints getConstraints() {
            return ((RemoteMethodControl)monitorAdminProxy).getConstraints();
        }

        /* Note that the superclass's hashCode method is OK as is. */
        /* Note that the superclass's equals method is OK as is. */

        /*
         * Returns a proxy trust iterator that is used in
         * <code>ProxyTrustVerifier</code> to retrieve this object's
         * trust verifier.
         */
        @SuppressWarnings("unused")
        private ProxyTrustIterator getProxyTrustIterator() {
            return(new SingletonProxyTrustIterator(monitorAdminProxy));
        }

        private void writeObject(ObjectOutputStream out) throws IOException {
            out.writeObject(this);
        }

        /*
         * Verify that the server implements RemoteMethodControl
         */
        private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException {
            /* Note that basic validation of the fields of this class was
             * already performed in the readObject() method of this class'
             * super class.
             */
            s.defaultReadObject();
            // Verify that the server implements RemoteMethodControl
            if(!(serviceAdmin instanceof RemoteMethodControl)) {
                throw new InvalidObjectException("ConstrainableProvisionMonitorAdminProxy.readObject "+
                                                 "failure : serviceAdmin does not implement constrainable functionality");
            }
        }
    }


    /* -------- Implement ProvisionMonitorAdmin methods -------- */
           
    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final URL opStringURL) throws OperationalStringException, RemoteException {
        return deploy(opStringURL, null);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final URL opStringURL, final ServiceProvisionListener listener)
    throws OperationalStringException, RemoteException {
        return monitorAdminProxy.deploy(opStringURL, listener);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final String location) throws OperationalStringException,RemoteException {
        return deploy(location, null);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final String location, final ServiceProvisionListener listener)
        throws OperationalStringException, RemoteException {
        return monitorAdminProxy.deploy(location, listener);
    }
   
    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final OperationalString opString) throws OperationalStringException, RemoteException {
        return deploy(opString, null);
    }
   
    /**
     * @see org.rioproject.deploy.DeployAdmin#deploy
     */
    public DeploymentResult deploy(final OperationalString opString, final ServiceProvisionListener listener)
    throws OperationalStringException, RemoteException {
        return monitorAdminProxy.deploy(opString, listener);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#undeploy
     */
    public boolean undeploy(final String opStringName) throws OperationalStringException, RemoteException {
        return monitorAdminProxy.undeploy(opStringName);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#hasDeployed
     */
    public boolean hasDeployed(final String opStringName) throws RemoteException {
        return monitorAdminProxy.hasDeployed(opStringName);
    }

    /**
     * @see org.rioproject.deploy.DeployAdmin#getOperationalStringManagers
     */
    public OperationalStringManager[] getOperationalStringManagers() throws RemoteException {
        return monitorAdminProxy.getOperationalStringManagers();
    }
   
    /* (non-Javadoc)
     * @see org.rioproject.deploy.DeployAdmin#getOperationalStringManager
     */
    public OperationalStringManager getOperationalStringManager(final String name) throws OperationalStringException,
                                                                                          RemoteException {
        return monitorAdminProxy.getOperationalStringManager(name);
    }

    /* (non-Javadoc)
     * @see org.rioproject.monitor.ProvisionMonitorAdmin#getBackupInfo
     */
    public PeerInfo[] getBackupInfo() throws RemoteException {       
        return monitorAdminProxy.getBackupInfo();
    }

    @Override
    public ResourceCapability getResourceCapability() throws RemoteException {
        return monitorAdminProxy.getResourceCapability();
    }

    @Override
    public ComputeResourceUtilization getComputeResourceUtilization() throws RemoteException {
        return monitorAdminProxy.getComputeResourceUtilization();
    }

    /**
     * A trust verifier for secure smart proxies.
     */
    public final static class Verifier implements TrustVerifier, Serializable {
        private static final long serialVersionUID = 1L;
        private final RemoteMethodControl serverProxy;

        /**
         * Create the verifier, throwing UnsupportedOperationException if the
         * server proxy does not implement both RemoteMethodControl and
         * TrustEquivalence.
         */
        public Verifier(final Object serverProxy) {
            if (serverProxy instanceof RemoteMethodControl && serverProxy instanceof TrustEquivalence) {
                this.serverProxy = (RemoteMethodControl) serverProxy;
            } else {
                throw new UnsupportedOperationException();
            }
        }

        /**
         * Implement TrustVerifier
         */
        public boolean isTrustedObject(final Object obj, final TrustVerifier.Context ctx) throws RemoteException {
            if (obj == null || ctx == null) {
                throw new IllegalArgumentException();
            } else if (!(obj instanceof ConstrainableProvisionMonitorAdminProxy)) {
                return false;
            }
            RemoteMethodControl otherServerProxy =
                (RemoteMethodControl)((ConstrainableProvisionMonitorAdminProxy)obj).monitorAdminProxy;
            MethodConstraints mc = otherServerProxy.getConstraints();
            TrustEquivalence trusted = (TrustEquivalence) serverProxy.setConstraints(mc);
            return(trusted.checkTrustEquivalence(otherServerProxy));
        }
    }
}
TOP

Related Classes of org.rioproject.monitor.proxy.ProvisionMonitorAdminProxy$Verifier

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.