CorbaSender.java
package gov.usgs.earthquake.eidsutil;
import com.isti.quakewatch.server.qw_feeder.QWFeeder;
import com.isti.quakewatch.server.qw_feeder.QWFeederHelper;
import org.omg.CORBA.ORB;
//import org.omg.CORBA.Object;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManager;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
/**
* A <code>CorbaSender</code> is essentially a client-side wrapper for the
* <code>QWFeeder</code> IDL file specified by ISTI. This class is designed to
* provide simplified CORBA interaction with a QWServer (EIDS) machine. All the
* varied methods of sending messages are provided, however they are wrapped
* into a single method, namely, <code>sendMessage</code>. See the method
* documentation for details.
*
* @since 0.0.1
* @author <a href="mailto:emartinez@usgs.gov">Eric Martinez</a>
*/
public class CorbaSender {
//---------------------------------------------------------------------------
// Member Variables
//---------------------------------------------------------------------------
/** This is the URL used to obtain the underlying QWFeeder object. */
private String url = null;
/**
* This is the underlying <code>QWFeeder</code> used to send the messages to
* the server. The interface specification can be found in the
* <code>QWFeeder.idl</code> file from ISTI.
*/
private QWFeeder feeder = null;
private ORB orb = null;
private POA poa = null;
private POAManager poaManager = null;
private org.omg.CORBA.Object object = null;
//---------------------------------------------------------------------------
// Constructors
//---------------------------------------------------------------------------
/**
* Initializes the <code>CorbaSender</code> such that it is ready to send a
* message to the specified <code>host</code> over the specified
* <code>port</code>. This uses the <code>QWFeeder</code> idl specified by
* ISTI as the underlying feeder. After instantiating a
* <code>CorbaSender</code> through this constructor, the instance is 100%
* ready to use. One downside is one cannot reuse that instance to send
* messages to another host; for such a feature one must instantiate a new
* object.
*
* @param host The host machine (ip or cname) to which you want to send the
* messages using this <code>CorbaSender</code>.
* @param port The port number to send messages to on the host.
*
* @throws InvalidName If the RootPOA is not aware of the type of object we
* request from it.
* @throws AdapterInactive If the poaManager is not active.
*/
public CorbaSender(String host, String port)
throws InvalidName, AdapterInactive {
// Create the corbaloc url
url = "corbaloc:iiop:1.2@" + host + ":" + port + "/QWFeeder";
// Initialize the ORB
orb = ORB.init((new String[0]), null);
// Get the Root POA
poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
// Activate the POAManager
poaManager = poa.the_POAManager();
poaManager.activate();
// Get the generic object reference from the orb
object = orb.string_to_object(url);
// Narrow the generic object down to our a QWFeeder
feeder = QWFeederHelper.narrow(object);
} // END: constructor CorbaSender
/** Cleanup */
public void destroy() {
try { feeder._release(); } catch (Exception ex) { /* ignore */ }
try { object._release(); } catch (Exception ex) { /* ignore */ }
try { orb.shutdown(true); } catch (Exception ex) { /* ignore */ }
try { orb.destroy(); } catch (Exception ex) { /* ignore */ }
feeder = null;
object = null;
poaManager = null;
poa = null;
orb = null;
}
/**
* Retrieve a QWFeeder object associated with this CorbaSender.
*
* First checks if the object is "non_existent", and if so re-narrows the object.
* @return QWFeeder object, or null if unable to narrow.
*/
protected QWFeeder getFeeder() {
if (feeder != null) {
try {
if (feeder._non_existent()) {
feeder = null;
object = null;
}
} catch (org.omg.CORBA.OBJECT_NOT_EXIST e) {
// feeder._non_existent throws the OBJECT_NOT_EXIST exception
// instead of returning true...
feeder = null;
object = null;
}
}
if (feeder == null) {
//recreate the object, must string_to_object AND narrow
object = orb.string_to_object(url);
feeder = QWFeederHelper.narrow(object);
}
return feeder;
}
//---------------------------------------------------------------------------
// Static Methods
//---------------------------------------------------------------------------
/* None at this time. */
//---------------------------------------------------------------------------
// Public Methods
//---------------------------------------------------------------------------
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param message The data event message string.
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String message) {
return getFeeder().sendMessage(message);
}
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param domain The domain name to use.
* @param type The type name to use.
* @param message The data event message string.
*
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String domain, String type, String message) {
return getFeeder().sendDomainTypeMessage(domain, type, message);
}
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param domain The domain name to use.
* @param type The type name to use.
* @param name The event name to use.
* @param message The data event message string.
*
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String domain, String type, String name,
String message) {
return getFeeder().sendDomainTypeNameMessage(domain, type, name, message);
}
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param message The data event message string.
* @param feederSourceHost The data-source host string for the message.
* @param feederSrcHostMsgId the message-ID number from the data source
* (positive value incremented after each message).
*
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String message, String feederSourceHost,
long feederSrcHostMsgId) {
return getFeeder().sendSourcedMsg(message, feederSourceHost,
feederSrcHostMsgId);
}
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param domain The domain name to use.
* @param type The type name to use.
* @param message The data event message string.
* @param feederSourceHost The data-source host string for the message.
* @param feederSrcHostMsgId The message-ID number from the data source
* (positive value incremented after each message).
*
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String domain, String type, String message,
String feederSourceHost, long feederSrcHostMsgId) {
return getFeeder().sendSourcedDomainTypeMsg(domain, type, message,
feederSourceHost, feederSrcHostMsgId);
}
/**
* Sends a data event message. If the event data does not begin with a
* “DataMessage” XML element then the data will be surrounded
* with one. The “sendSourced...” methods are preferred because
* the feeder-source host name and message number are used for improved
* message tracking.
*
* @param domain The domain name to use.
* @param type The type name to use.
* @param name The event name to use.
* @param message The data event message string.
* @param feederSourceHost The data-source host string for the message.
* @param feederSrcHostMsgId The message-ID number from the data source
* (positive value incremented after each message).
*
* @return <code>true</code> after the message has been successfully stored
* and processed; <code>false</code> if an error occurred.
*/
public boolean sendMessage(String domain, String type, String name,
String message, String feederSourceHost, long feederSrcHostMsgId) {
return getFeeder().sendSourcedDomainTypeNameMsg(domain, type, name, message,
feederSourceHost, feederSrcHostMsgId);
}
//---------------------------------------------------------------------------
// Private Methods
//---------------------------------------------------------------------------
/* None at this time. */
} // END: class CorbaSender