Java tutorial
/* Java Media APIs: Cross-Platform Imaging, Media and Visualization Alejandro Terrazas Sams, Published November 2002, ISBN 0672320940 */ /******************************************************************************* * ManagerQuery - Query the manager class about the configuration and support of * the installed JMF version. ManagerQuery is a text-based application that * provides a report on the support of the JMF for Players, Processors and * DataSinks. * * Without any command-line arguments ManagerQuery prints a complete (LONG) list * of Player, Processor, and DataSource classes that support the various * formats, protocols, and content types. * * Alternatively it is possible to provide command-line arguments specifying the * format or protocol for which support is to be checked. The means of calling * is as follows: java ManagerQuery [ [-h|-p|-d] support1 support2 ... supportN] * The -h flag specifies handlers (Players) only. The -p flag specifies * Processors only. The -d flag specifies DataSources only. Leaving off the flag * defaults behaviour to checking for Players only. * * For instance: java ManagerQuery -h mp3 ulaw would list the classes capable of * Playing the MP3 (MPEG, Layer 3) and U-Law formats (codecs). * * ManagerQuery always prints the version of JMF, caching directory, and hints * prior to any other output. * * @author Spike Barlow ******************************************************************************/ import javax.media.*; import javax.media.protocol.*; import javax.media.format.*; import java.util.*; public class ManagerQuery { /////////////////////////////////////////////////// // Constants to facilitate selection of the // approprite get*List() method. /////////////////////////////////////////////////// public static final int HANDLERS = 1; public static final int PROCESSORS = 2; public static final int DATASOURCES = 3; /////////////////////////////////////////////////////// // Array containing all the content types that JMF2.1.1 // supports. This is used when the user provides no // command-line arguments in order to generate a // complete list of support for all the content types. ///////////////////////////////////////////////////////// private static final String[] CONTENTS = { ContentDescriptor.CONTENT_UNKNOWN, ContentDescriptor.MIXED, ContentDescriptor.RAW, ContentDescriptor.RAW_RTP, FileTypeDescriptor.AIFF, FileTypeDescriptor.BASIC_AUDIO, FileTypeDescriptor.GSM, FileTypeDescriptor.MIDI, FileTypeDescriptor.MPEG, FileTypeDescriptor.MPEG_AUDIO, FileTypeDescriptor.MSVIDEO, FileTypeDescriptor.QUICKTIME, FileTypeDescriptor.RMF, FileTypeDescriptor.VIVO, FileTypeDescriptor.WAVE, VideoFormat.CINEPAK, VideoFormat.H261, VideoFormat.H263, VideoFormat.H261_RTP, VideoFormat.H263_RTP, VideoFormat.INDEO32, VideoFormat.INDEO41, VideoFormat.INDEO50, VideoFormat.IRGB, VideoFormat.JPEG, VideoFormat.JPEG_RTP, VideoFormat.MJPEGA, VideoFormat.MJPEGB, VideoFormat.MJPG, VideoFormat.MPEG_RTP, VideoFormat.RGB, VideoFormat.RLE, VideoFormat.SMC, VideoFormat.YUV, AudioFormat.ALAW, AudioFormat.DOLBYAC3, AudioFormat.DVI, AudioFormat.DVI_RTP, AudioFormat.G723, AudioFormat.G723_RTP, AudioFormat.G728, AudioFormat.G728_RTP, AudioFormat.G729, AudioFormat.G729_RTP, AudioFormat.G729A, AudioFormat.G729A_RTP, AudioFormat.GSM, AudioFormat.GSM_MS, AudioFormat.GSM_RTP, AudioFormat.IMA4, AudioFormat.IMA4_MS, AudioFormat.LINEAR, AudioFormat.MAC3, AudioFormat.MAC6, AudioFormat.MPEG, AudioFormat.MPEG_RTP, AudioFormat.MPEGLAYER3, AudioFormat.MSADPCM, AudioFormat.MSNAUDIO, AudioFormat.MSRT24, AudioFormat.TRUESPEECH, AudioFormat.ULAW, AudioFormat.ULAW_RTP, AudioFormat.VOXWAREAC10, AudioFormat.VOXWAREAC16, AudioFormat.VOXWAREAC20, AudioFormat.VOXWAREAC8, AudioFormat.VOXWAREMETASOUND, AudioFormat.VOXWAREMETAVOICE, AudioFormat.VOXWARERT29H, AudioFormat.VOXWARETQ40, AudioFormat.VOXWARETQ60, AudioFormat.VOXWAREVR12, AudioFormat.VOXWAREVR18 }; //////////////////////////////////// // The protocols that JMF supports. /////////////////////////////////// private static final String[] PROTOCOLS = { "ftp", "file", "rtp", "http" }; /*************************************************************************** * Return a String being a list of all hints settings. **************************************************************************/ public static String getHints() { return "\tSecurity: " + Manager.getHint(Manager.MAX_SECURITY) + "\n\tCaching: " + Manager.getHint(Manager.CACHING) + "\n\tLightweight Renderer: " + Manager.getHint(Manager.LIGHTWEIGHT_RENDERER) + "\n\tPlug-in Player: " + Manager.getHint(Manager.PLUGIN_PLAYER); } /*************************************************************************** * Produce a list of all classes that support the content types or protocols * passed to the method. The list is returned as a formatted String, while * the 2nd parameter (which) specifies whether it is Player (Handler), * Processor, or DataSource classes. **************************************************************************/ public static String getHandlersOrProcessors(String[] contents, int which) { String str = ""; Vector classes; int NUM_PER_LINE = 2; String LEADING = "\t "; String SEPARATOR = " "; if (contents == null) return null; ///////////////////////////////////////////////////////////////////// // Generate a separate list for each content-type/protocol specified. ///////////////////////////////////////////////////////////////////// for (int i = 0; i < contents.length; i++) { str = str + "\t" + contents[i] + ":\n"; if (which == HANDLERS) classes = Manager.getHandlerClassList(contents[i]); else if (which == PROCESSORS) classes = Manager.getProcessorClassList(contents[i]); else classes = Manager.getDataSourceList(contents[i]); if (classes == null) str = str + "\t <None>\n"; else str = str + formatVectorStrings(classes, LEADING, 2, SEPARATOR); } return str; } /*************************************************************************** * Get a list of all Handler (Player) classes that support each of the * formats (content types). **************************************************************************/ public static String getHandlers() { return getHandlersOrProcessors(CONTENTS, HANDLERS); } /*************************************************************************** * Get a list of all Processor classes that support each of the formats * (content types). **************************************************************************/ public static String getProcessors() { return getHandlersOrProcessors(CONTENTS, PROCESSORS); } /*************************************************************************** * Get a list of all DataSources classes that support each of the protocols. **************************************************************************/ public static String getDataSources() { return getHandlersOrProcessors(PROTOCOLS, DATASOURCES); } /*************************************************************************** * Format the Vector of Strings returned by the get*List() methods into a * single String. A simple formatting method. **************************************************************************/ public static String formatVectorStrings(Vector vec, String leading, int count, String separator) { String str = leading; for (int i = 0; i < vec.size(); i++) { str = str + (String) vec.elementAt(i); if ((i + 1) == vec.size()) str = str + "\n"; else if ((i + 1) % count == 0) str = str + "\n" + leading; else str = str + separator; } return str; } /*************************************************************************** * Produce a list showing total support (i.e., Player, Processors, and * DataSinks) for all content types and protocols. **************************************************************************/ public static void printTotalList() { System.out.println("\nPlayer Handler Classes:"); System.out.println(getHandlers()); System.out.println("\nProcessor Class List:"); System.out.println(getProcessors()); System.out.println("\nDataSink Class List: "); System.out.println(getDataSources()); } /*************************************************************************** * Main method. Produce a version and hints report. Then if no command line * arguments produce a total class list report. Otherwise process the * command line arguments and produce a report on their basis only. **************************************************************************/ public static void main(String args[]) { System.out.println("JMF: " + Manager.getVersion()); String cacheArea = Manager.getCacheDirectory(); if (cacheArea == null) System.out.println("No cache directory specified."); else System.out.println("Cache Directory: " + cacheArea); System.out.println("Hints:"); System.out.println(getHints()); // No command-line arguments. Make a toral report. if (args == null || args.length == 0) printTotalList(); else { // Command-line. Process flags and then support to be // queried upon in order to generate appropriate report. String header = ""; int whichCategory = 0; String[] interested; int i; int start; if (args[0].equalsIgnoreCase("-h")) { header = "\nPlayer Handler Classes: "; whichCategory = HANDLERS; } else if (args[0].equalsIgnoreCase("-p")) { header = "\nProcessor Class List:"; whichCategory = PROCESSORS; } else if (args[0].equalsIgnoreCase("-d")) { header = "\nDataSink Class List: "; whichCategory = DATASOURCES; } if (whichCategory == 0) { whichCategory = HANDLERS; header = "\nPlayer Handler Classes: "; interested = new String[args.length]; start = 0; } else { interested = new String[args.length - 1]; start = 1; } for (i = start; i < args.length; i++) interested[i - start] = args[i]; System.out.println(header); System.out.println(getHandlersOrProcessors(interested, whichCategory)); } } }