blob: a4be9ff0afea4c924f971549165aa6ec6ae0bd08 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.etch.bindings.java.support;
import org.apache.etch.bindings.java.msg.Message;
import org.apache.etch.bindings.java.msg.Type;
import org.apache.etch.bindings.java.msg.ValueFactory;
import org.apache.etch.util.core.io.Transport;
import org.apache.etch.util.core.io.Transport.WaitDown;
import org.apache.etch.util.core.io.Transport.WaitUp;
/**
* Base class for call to message translators.
*/
public class RemoteBase
{
/**
* Constructs the RemoteBase.
*
* @param svc the delivery service used to send messages.
* @param vf the value factory used to create messages and encode/decode types.
*/
public RemoteBase( DeliveryService svc, ValueFactory vf )
{
_svc = svc;
_vf = vf;
}
private final DeliveryService _svc;
private final ValueFactory _vf;
@Override
public String toString()
{
return String.format( "%s/%s", getClass().getName(), _svc );
}
/**
* Constructs a new message to send using {@link #_send(Message)} or
* {@link #_begincall(Message)};
* @param type the type of the message.
* @return a new message
*/
public final Message _newMessage( Type type )
{
return new Message( type, _vf );
}
/**
* Sends the message to the recipient, but does not wait for any response.
*
* @param msg the message to send
* @throws Exception if there is a problem sending
*/
public void _send( Message msg ) throws Exception
{
_svc.transportMessage( null, msg );
}
/**
* Sends the message which begins a call sequence.
*
* @param msg the message to send.
* @return a mailbox which can be used to read the response, using
* {@link #_endcall(Mailbox, Type)}.
*/
public Mailbox _begincall( Message msg )
{
try
{
return _svc.begincall( msg );
}
catch ( RuntimeException e )
{
throw e;
}
catch ( Exception e )
{
throw new RuntimeException( e );
}
}
/**
* Finishes a call sequence by waiting for the response message.
*
* @param mb a mailbox which will be used to read the response, returned by
* {@link #_begincall(Message)}.
* @param responseType the type of the expected response.
* @return the value of the response field if it isn't an exception.
* @throws Exception if there is a problem sending or a timeout waiting or
* if the result value was an exception.
*/
public Object _endcall( Mailbox mb, Type responseType ) throws Exception
{
return _svc.endcall( mb, responseType );
}
/**
* Gets a configuration or operational value from the source. The
* request is passed down the chain of sources until some source
* recognizes the query, whereupon it returns the requested value.
*
* @param query an object representing a query, which could be as
* simple as a string, integer, or enum, or more complex such as
* a class with instance variables for query terms.
*
* @return the requested value, or null if not defined.
*
* @throws UnsupportedOperationException if the query is not recognized
* by any source (which is to say, if the last source in the source
* chain does not recognize it, it should throw this exception).
*
* @throws Exception
*/
public Object _transportQuery( Object query ) throws Exception
{
return _svc.transportQuery( query );
}
/**
* Sets a configuration or operational value in the source. The
* request is passed down the chain of sources until some source
* recognizes the control, whereupon it stores the specified value
* and returns.
*
* @param control an object representing a control, which could be as
* simple as a string, integer, or enum, or more complex such as
* a class with instance variables for control terms.
*
* @param value the value to set.
*
* @throws IllegalArgumentException if the value is not the right
* type or if the value is inappropriate.
*
* @throws UnsupportedOperationException if the control is not recognized
* by any source (which is to say, if the last source in the source
* chain does not recognize it, it should throw this exception).
*
* @throws Exception
*/
public void _transportControl( Object control, Object value ) throws Exception
{
_svc.transportControl( control, value );
}
/**
* Notifies the chain of sources of the specified event. Unlike query
* and control operations above, events are always passed down to the
* bottom to allow all sources to notice them.
*
* @param event a class which represents the event, possibly with
* parameters. The simplest event could be a string, integer,
* or enum, but any class instance will do (as long as some source
* in the chain expects it).
*
* @throws Exception
*/
public void _transportNotify( Object event ) throws Exception
{
_svc.transportNotify( event );
}
////////////////////////////
// Convenience operations //
////////////////////////////
/**
* Starts the transport.
* @throws Exception
* @see #_transportControl(Object, Object)
* @see Transport#START
*/
public void _start() throws Exception
{
_transportControl( Transport.START, null );
}
/**
* Waits for the transport to come up.
* @param maxDelay max delay in milliseconds.
* @throws Exception
* @see #_transportQuery(Object)
* @see WaitUp
*/
public void _waitUp( int maxDelay ) throws Exception
{
_transportQuery( new WaitUp( maxDelay ) );
}
/**
* Starts the transport and waits for it to come up.
* @param maxDelay max delay in milliseconds.
* @throws Exception
* @see #_start()
* @see #_waitUp(int)
*/
public void _startAndWaitUp( int maxDelay ) throws Exception
{
_start();
_waitUp( maxDelay );
}
/**
* Stops the transport.
* @throws Exception
* @see #_transportControl(Object, Object)
* @see Transport#STOP
*/
public void _stop() throws Exception
{
_transportControl( Transport.STOP, null );
}
/**
* Waits for the transport to go down.
* @param maxDelay max delay in milliseconds.
* @throws Exception
* @see #_transportQuery(Object)
* @see WaitDown
*/
public void _waitDown( int maxDelay ) throws Exception
{
_transportQuery( new WaitDown( maxDelay ) );
}
/**
* Stops the transport and waits for it to go down.
* @param maxDelay max delay in milliseconds.
* @throws Exception
* @see #_start()
* @see #_waitDown(int)
*/
public void _stopAndWaitDown( int maxDelay ) throws Exception
{
_stop();
_waitDown( maxDelay );
}
}