/* Generated by Together */
package multimonster.transporter;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.RemoveException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import multimonster.common.FormatId;
import multimonster.common.MMThread;
import multimonster.common.ProtocolId;
import multimonster.common.Proxy;
import multimonster.common.media.MOIdentifier;
import multimonster.common.pipe.Pipe;
import multimonster.common.plugin.PlugInIdentifier;
import multimonster.common.plugin.PlugInInformation;
import multimonster.common.setting.Setting;
import multimonster.common.util.EjbCreator;
import multimonster.common.util.EjbHomeGetter;
import multimonster.converter.exceptions.ConverterException;
import multimonster.converter.interfaces.ConverterImpl;
import multimonster.converter.interfaces.ConverterImplHome;
import multimonster.transporter.exceptions.TransporterException;
import org.apache.log4j.Logger;
/**
*
* Transfers data with a protocol to the MediaProxy.
*
* @author J�rg Meier
*
* @ejb.bean name = "TransporterImpl"
* display-name = "TransporterFacade SessionBean"
* description = "The Facade of the Transporter-Package of MultiMonster"
* view-type = "remote"
* jndi-name = "multimonster/transporter/TransporterFacade"
*/
public class TransporterImplBean implements TransporterFacade, SessionBean {
private SessionContext ctx;
private Logger log;
private Context context;
private ConverterImplHome converterHome;
public void setSessionContext(SessionContext context) throws RemoteException, EJBException {
ctx = context;
}
public void ejbActivate() throws EJBException {
}
public void ejbPassivate() throws EJBException {
}
public void ejbRemove() throws EJBException {
}
/**
* @ejb.create-method
*
* @throws CreateException
* @throws EJBException
*/
public void ejbCreate() throws CreateException, EJBException {
log = Logger.getLogger(this.getClass());
try {
context = new InitialContext();
converterHome = EjbHomeGetter.getConverterHome(context);
} catch (NamingException e) {
log.error(this.getClass().getName() + " Couldn't get referenced EJB-Home-Interfaces.");
}
}
/**
* @ejb.interface-method view-type = "remote"
*
* Starts data output by returning a Pipe which serves the data
* with a protocol.
*
*/
public Pipe output(MOIdentifier mOId, FormatId fId, ProtocolId protocolId) throws TransporterException {
log.debug("output()");
return startTransporter(mOId, fId, protocolId, false);
}
/**
* @ejb.interface-method view-type = "remote"
*/
public Pipe input(MOIdentifier mOId, ProtocolId protocolId) throws TransporterException {
log.debug("input() called.");
return startTransporter(mOId, null, protocolId, true);
}
private Pipe startTransporter(MOIdentifier mOId, FormatId fId, ProtocolId protocolId, boolean isInput) throws TransporterException {
Pipe pipeToProxy = null;
Pipe pipeFromConverter = null;
String errorText = "";
ConverterImpl converter = null;
TransporterPlugInFactory transporterFactory = null;
TransporterPlugin transporter = null;
// parameter checks
if (mOId == null) {
errorText = "mOId was null - aborting.";
log.error(errorText);
throw new TransporterException(errorText);
} else if (fId == null) {
log.debug("FormatID is null - can only do input.");
} else if (protocolId == null) {
errorText = "protocol was null - aborting.";
log.error(errorText);
throw new TransporterException(errorText);
} else {
//log.debug("parameter ok.");
}
// get PlugIn for protocol
transporterFactory = TransporterPlugInFactory.getInstance();
if (transporterFactory == null){
errorText = "Couldn't get TransporterFactory";
log.error(errorText);
throw new TransporterException(errorText);
}
try {
transporter = transporterFactory.getTransporter(protocolId, isInput);
} catch (TransporterException e1) {
errorText = "TransporterFactory couldn't get PlugIn: " +e1.getMessage();
log.error(errorText);
throw new TransporterException(errorText);
}
// create Pipe to Proxy
pipeToProxy = new Pipe();
if (pipeToProxy == null) {
errorText = "Couldn't create Pipe to Proxy.";
log.error(errorText);
throw new TransporterException(errorText);
}
// start deeper layers by asking the converter for a data-pipe
try {
converter = EjbCreator.createConverter(converterHome, context);
} catch (Exception e) {
errorText = "Couldn't get controller: " +e.getMessage();
log.error(errorText);
throw new TransporterException(errorText);
}
try {
// call converter to get data pipe
if (isInput) {
//create pipe where Transporter has to insert data for converter
pipeFromConverter = new Pipe();
if (pipeFromConverter == null) {
errorText = "Couldn't create Pipe to Converter.";
log.error(errorText);
throw new TransporterException(errorText);
}
converter.addMediaObject(mOId, pipeFromConverter);
} else {
pipeFromConverter = converter.getMediaInstance(mOId, fId);
}
converter.remove();
} catch (RemoteException e) {
errorText = "Error calling converter: " +e.getMessage();
log.error(errorText);
throw new TransporterException(errorText);
} catch (RemoveException e) {
errorText = "Error removing converter: " +e.getMessage();
log.error(errorText);
throw new TransporterException(errorText);
} catch (ConverterException e) {
errorText = "Got error from converter: " +e.getMessage();
log.error(errorText);
throw new TransporterException(errorText);
}
if (pipeFromConverter == null){
errorText = "Got no pipe from converter.";
log.error(errorText);
throw new TransporterException(errorText);
}
// give both Pipes to Transporter-PlugIn
transporter.setPipes(pipeToProxy, pipeFromConverter);
// start transporting...
MMThread transporterThread = new MMThread(transporter);
transporterThread.start();
//log.debug("Transporter started.");
return pipeToProxy;
}
/**
* @ejb.interface-method view-type = "remote"
*/
public boolean registerProxy(Proxy proxy) {
return false;
}
/**
* @ejb.interface-method view-type = "remote"
*/
public boolean releaseProxy(Proxy proxy) {
return false;
}
/* (non-Javadoc)
* @see multimonster.common.SettingListener#changeSetting(multimonster.common.Setting[])
*/
/**
* @ejb.interface-method view-type = "remote"
*/
public void changeSetting(Setting[] setting) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see multimonster.common.Pluggable#addPlugIn(multimonster.common.PlugInInformation)
*/
/**
* @ejb.interface-method view-type = "remote"
*/
public void addPlugIn(PlugInInformation plugInInformation) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see multimonster.common.Pluggable#releasePlugIn(multimonster.common.PlugInIdentifier)
*/
/**
* @ejb.interface-method view-type = "remote"
*/
public void releasePlugIn(PlugInIdentifier plugInId) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see multimonster.common.Pluggable#removePlugIn(multimonster.common.PlugInIdentifier)
*/
/**
* @ejb.interface-method view-type = "remote"
*/
public void removePlugIn(PlugInIdentifier plugInId) {
// TODO Auto-generated method stub
}
}