package multimonster.converter; import javax.naming.Context; import multimonster.common.Format; import multimonster.common.media.MIIdentifier; import multimonster.common.media.MOIdentifier; import multimonster.common.media.MediaInstance; import multimonster.common.media.MetaData; import multimonster.common.pipe.Pipe; import multimonster.common.pipe.PipeClosedException; import multimonster.common.util.EjbCreator; import multimonster.systemadministration.interfaces.SystemAdministrationImpl; import multimonster .systemadministration .interfaces .SystemAdministrationImplHome; import org.apache.log4j.Logger; /** * TODO Create Java-Doc * * @author Holger Velke (sihovelk) */ public abstract class MetaDataExtractor implements Runnable { private static Logger log = Logger.getLogger(MetaDataExtractor.class); // TODO use administrative setting here private static String EXTRACTOR_TO_USE = "multimonster.converter.plugin.TCProbeExtractor"; private SystemAdministrationImplHome systemAdministrationHome; private Context context; private MOIdentifier mOId = null; private MIIdentifier mIId = null; private Pipe input = null; private Pipe output = null; protected Format format = null; protected MetaData metaData = null; // state attibutes private boolean finished = false; private boolean ready = false; /** * @param ready * The ready to set. */ protected void setReady(boolean ready) { this.ready = ready; } /** * */ protected void setFinished() { finished = true; } /** * @return <code>true</code> if the extration is finished. */ protected boolean isFinished() { return this.finished; } /** * @return */ protected boolean isReady() { return this.ready; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { byte[] buf = null; int count = 0; int readBufSize = Pipe.getPipeSegmentSize(); // check preconditions if ((input == null) || (output == null)) { log.error("Pipes missing - unable to do work"); } try { output.waitForPipeSetup(); } catch (PipeClosedException e){ log.warn("pipe was not setup - unable to do work"); input.close(); return; } input.setupFinished(); while (true) { try { buf = input.read(readBufSize); } catch (PipeClosedException e) { break; } doWork(buf); try { output.write(buf); } catch (PipeClosedException e) { break; } count += buf.length; } input.close(); output.close(); finishWork(); addMediaInstance(); } private void addMediaInstance() { SystemAdministrationImpl systemAdministration = null; MediaInstance mI = null; this.format = parseFormat(); this.metaData = parseMetaData(); mI = new MediaInstance(mIId, mOId, this.format); try { systemAdministration = EjbCreator.createSystemAdministration( systemAdministrationHome, context); systemAdministration.addMediaInstance(mI, this.metaData); systemAdministration.remove(); } catch (Exception e) { log.error( "problem adding MediaInstance to SystemAdministration: " + e.getMessage()); } } public static MetaDataExtractor getInstance() { MetaDataExtractor instance = null; try { instance = (MetaDataExtractor) Class .forName(EXTRACTOR_TO_USE) .newInstance(); } catch (ClassNotFoundException e) { log.error( "unable to instanciate MetaDataExtractor, class'" + EXTRACTOR_TO_USE + "' not found"); } catch (Exception e) { log.error("unable to instanciate MetaDataExtractor", e); } return instance; } /** * @param inputPipe */ public void setInput(Pipe inputPipe) { this.input = inputPipe; } /** * @param outputPipe */ public void setOutput(Pipe outputPipe) { this.output = outputPipe; } /** * @param id * The mIId to set. */ public void setMIId(MIIdentifier id) { mIId = id; } /** * @param id * The mOId to set. */ public void setMOId(MOIdentifier id) { mOId = id; } /** * @param context * The context to set. */ public void setContext(Context context) { this.context = context; } /** * @param systemAdministrationHome * The systemAdministrationHome to set. */ public void setSystemAdministrationHome(SystemAdministrationImplHome systemAdministrationHome) { this.systemAdministrationHome = systemAdministrationHome; } /** * @param buf */ abstract protected void doWork(byte[] buf); /** * */ abstract protected Format parseFormat(); /** * */ abstract protected void finishWork(); /** * @return */ abstract protected MetaData parseMetaData(); }