/* * 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.deploy; import com.sun.jini.proxy.MarshalledWrapper; import net.jini.id.Uuid; import net.jini.io.MarshalledInstance; import org.rioproject.opstring.ServiceBeanConfig; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; /** * This class indicates an instance of an instantiated ServiceBean * * @author Dennis Reedy */ public class ServiceBeanInstance implements Serializable { @SuppressWarnings("unused") static final long serialVersionUID = 1L; /** * Unique identifier for the ServiceBean */ private Uuid sbID; /** * The Unique identifier of the ServiceBeanInstantiator */ private Uuid instantiatorID; /** * MarshalledInstance representation of the Object used to communicate * to the ServiceBean */ private MarshalledInstance mi; /** * Object used to communicate to the ServiceBean */ private transient Object service; /** * ServiceBeanConfig object for the ServiceBean */ private ServiceBeanConfig sbConfig; /** * The name of the compute resource the service is executing on */ private String hostName; /** * The IP address of the compute resource the service is executing on */ private String hostAddress; /** * Whether to verify codebase integrity. */ private transient boolean verifyCodebaseIntegrity; /** * Create a ServiceBeanInstance * * @param identifier Unique identifier for the service * @param mi MarshalledInstance of the service's proxy * @param sbConfig ServiceBeanConfig object for the service * @param hostName The hostName the service is executing on * @param instantiatorID The Unique identifier of the * <tt>ServiceBeanInstantiator</tt> that instantiated the service */ public ServiceBeanInstance(Uuid identifier, MarshalledInstance mi, ServiceBeanConfig sbConfig, /* Optional */ String hostName, String hostAddress, Uuid instantiatorID) { if(identifier==null) throw new IllegalArgumentException("identifier is null"); if(mi==null) throw new IllegalArgumentException("mi is null"); if(sbConfig==null) throw new IllegalArgumentException("sbConfig is null"); sbID = identifier; this.mi = mi; this.sbConfig = sbConfig; this.hostName = hostName; this.hostAddress = hostAddress; this.instantiatorID = instantiatorID; } /** * Get the unique identifier for the ServiceBean * * @return Unique identifier for the ServiceBean */ public Uuid getServiceBeanID() { return(sbID); } /** * Get the unique identifier for the ServiceBeanInstantiator * * @return Unique identifier for the ServiceBeanInstantiator */ public Uuid getServiceBeanInstantiatorID() { return(instantiatorID); } /** * Get the MarshalledInstance * * @return The MarshalledInstance for the service proxy */ public MarshalledInstance getMarshalledInstance() { return(mi); } /** * Get the object used to communicate to the ServiceBean * * @return Object used to communicate to the ServiceBean * * @throws ClassNotFoundException If the class cannot be found when loading * the service proxy * @throws IOException As a result of de-marshalling the service proxy */ public Object getService() throws IOException, ClassNotFoundException { if(service==null) service = mi.get(verifyCodebaseIntegrity); return(service); } /** * Set the ServiceBeanConfig for the ServiceBean * * @param sbConfig The ServiceBeanConfig for the ServiceBean */ public void setServiceBeanConfig(ServiceBeanConfig sbConfig) { if(sbConfig==null) throw new IllegalArgumentException("sbConfig is null"); this.sbConfig = sbConfig; } /** * Get the ServiceBeanConfig for the ServiceBean * * @return The ServiceBeanConfig for the ServiceBean */ public ServiceBeanConfig getServiceBeanConfig() { return(sbConfig); } /** * Get the host name of the compute resource the service is executing on * * @return The host name of of the compute resource the service is * executing on. This value may be null */ public String getHostName() { return hostName; } /** * Get the IP address of the compute resource the service is executing on * * @return The IP address of of the compute resource the service is * executing on. This value may be null */ public String getHostAddress() { return(hostAddress); } /** * Override hashCode to be the hash of the service identifier */ public int hashCode() { return(sbID.hashCode()); } /** * A ServiceBeanInstance is equal to another ServiceBeanInstance if the * service identifier properties are equal */ public boolean equals(Object obj) { if(this == obj) return(true); if(!(obj instanceof ServiceBeanInstance)) return(false); ServiceBeanInstance other = (ServiceBeanInstance)obj; return(sbID.equals(other.sbID)); } public String toString() { String serviceClassName; try { getService(); serviceClassName = service.getClass().getName(); } catch (Exception e) { serviceClassName = "unknown : system error"; } String instanceID = "<null>"; if(sbConfig!=null) { Long id = sbConfig.getInstanceID(); if(id!=null) instanceID = id.toString(); } return("Instance=["+instanceID+"] "+ "Proxy=["+serviceClassName+"] "+ "ID=["+sbID.toString()+"] "+ "HostAddress=["+(hostAddress==null?"null":hostAddress)+"]"); } /* Set transient fields. */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); verifyCodebaseIntegrity = MarshalledWrapper.integrityEnforced(in); } }