package mett.producer; //import java.util.ArrayList; //import javax.management.MBeanServer; //import javax.management.MBeanServerFactory; //import javax.management.ObjectName; import java.rmi.RemoteException; import java.util.StringTokenizer; import javax.ejb.CreateException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; //import multimonster.converter.ConverterImplBean; //import multimonster.converter.exceptions.ConverterException; import multimonster.common.AuthData; import multimonster.common.ConnectionAddress; import multimonster.common.Format; import multimonster.common.FormatId; import multimonster.common.OutputOption; import multimonster.common.Protocol; import multimonster.common.ProtocolId; import multimonster.common.SearchCriteria; import multimonster.common.SearchResult; import multimonster.common.UserIdentifier; import multimonster.common.media.MOIdentifier; import multimonster.common.media.MediaObject; import multimonster.controller.exceptions.ControllerException; import multimonster.controller.exceptions.InvalidAuthDataException; import multimonster.controller.interfaces.ControllerImpl; import multimonster.controller.interfaces.ControllerImplHome; import multimonster.converter.interfaces.ConverterImplHome; import multimonster.mediaproxy.interfaces.MediaProxyImplHome; import org.apache.log4j.Logger; /** * This class is an adapter pattern realised for the Multimonster ControllerImplBean. * It authenticates the request, searches for a given key and returns an URI to the * found media which can be streamed by the consumer. * * @author elitau * */ public class MonsterAdapter { /** * ATTRIBUTES */ private static Logger log = Logger.getLogger(MonsterWebService.class); private ControllerImplHome monsterControllerHome; private MediaProxyImplHome proxyHome; private ControllerImpl monsterController = null; private String loginName = "ede"; private String loginPassword = "ede"; private Format format = null; private Protocol protocol = null; /** * Constructor * Instatiates the ConverterImplBean and authenticate the user. */ public MonsterAdapter(){ // initialize if (monsterControllerHome == null) { instantiateControllerHome(); } try { // wenn kein controller da, dann erzeugen und in Session ablegen: if (monsterController == null) { getMonsterControllerInstance(); } if (authenticate()){ log.info("Authentication successfull"); } else{ log.error("Could not authenticate!"); } } catch (RemoteException e) { log.error("Error calling Controller: " + e.getMessage()); } } /** * PUBLIC */ public String getMedia(String key, Object metadata_Metadata) { MediaObject mediaObject = null; String mediaURI = null; try { log.info("Searching media for key: " + key); mediaObject = searchMedia(key); if (mediaObject != null) { mediaURI = prepareMediaOutput(mediaObject, null); } else { mediaURI = "Nothing found"; } } catch (RemoteException e) { log.error("Error while getting Media"); e.printStackTrace(); } return mediaURI; } /** * PRIVATE */ /** * Searches with the given key for MediaObjects. Returns a MediaObject if found, else returns null; * * @param String key - The search criteria * @return {@link MediaObject} The first MedioObject that fits the search key. */ private MediaObject searchMedia(String key) throws RemoteException { SearchResult[] result = null; SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setTitle(key); try { log.info("Searching for: " + searchCriteria.getTitle()); result = monsterController.search(searchCriteria); log.info("Found: " + result.length + " results."); } catch (ControllerException e) { log.error("Error during searchMedia()"); e.printStackTrace(); } if (result.length > 0) { return result[0].getMediaObject(); } else{ return null; } } /** * Authenticates and prepares the MediaOpbject for access. * Returns an URI to the prepared MediaObject for direct streaming/downloading. * * @param mediaObject * @return URI to the given MediaObject */ private String prepareMediaOutput(MediaObject mediaObject, Object metadata) { OutputOption[] outputOptions = null; String uri = null; ConnectionAddress addr = null; OutputOption oo = null; MOIdentifier mOId = mediaObject.getMOId(); String mediaTitle = mediaObject.getMetaData().getTitle(); try { log.info("Getting OutputOptions for: " + mediaTitle); outputOptions = monsterController.getOutputOptions(mOId); if (outputOptions.length == 0) { return "No OutputOptions for " + mediaTitle + " found"; } log.info("Possible OutputOptions("+outputOptions.length+"): " + formatOutputOptions(outputOptions)); oo = outputOptions[0]; addr = monsterController.prepareOutput(mOId, oo); uri = addr.getUrl().toString(); } catch (ControllerException e) { log.error("Controller Exception while getting MediaObejt Identifier:"); e.printStackTrace(); } catch (RemoteException e) { log.error("Remote Exception while getting MediaObejt Identifier:"); e.printStackTrace(); } return uri; } private boolean authenticate() throws RemoteException{ // TODO: Do not import AuthData UserIdentifier uid = new UserIdentifier(loginName); Boolean loggedIn = false; try { log.info("Trying to log in"); loggedIn = monsterController.login(new AuthData(uid, (loginPassword))); } catch (InvalidAuthDataException e) { log.error("Could not login with: \nName: "+loginName + "Pass: " + loginPassword); e.printStackTrace(); } catch (ControllerException e) { log.error("ControllerException with: "); e.printStackTrace(); } return loggedIn; } private void getMonsterControllerInstance() throws RemoteException{ try { monsterController = monsterControllerHome.create(); } catch (CreateException e) { log.error("Error calling Controller: " + e.getMessage()); } } private void instantiateControllerHome() { Context context; log = Logger.getLogger(this.getClass()); log.debug("ControllerDispatcher-Servlet init..."); try { context = new InitialContext(); Object ref = context.lookup(ControllerImplHome.JNDI_NAME); log.error("Context lookup successful: "+ context.getNameInNamespace()); monsterControllerHome = (ControllerImplHome) PortableRemoteObject.narrow( ref, ControllerImplHome.class); ref = context.lookup(MediaProxyImplHome.JNDI_NAME); proxyHome = (MediaProxyImplHome) PortableRemoteObject.narrow( ref, MediaProxyImplHome.class); } catch (NamingException e) { log.error("Couldn't get Controller: " + e.getMessage()); e.printStackTrace(); } catch (Exception e) { log.error("Couldn't get Controller: " + e.getMessage()); e.printStackTrace(); } } // Helper: private String formatOutputOptions(OutputOption[] options){ String output = "hmm"; for (int i = 0; i < options.length; i++) { output = output.concat(options[i].toString()); } return output; } }