1 9 10 package org.mmbase.applications.media.builders; 11 12 import java.util.*; 13 14 import org.mmbase.module.core.MMObjectNode; 15 import org.mmbase.module.core.MMObjectBuilder; 16 17 18 import org.mmbase.util.functions.*; 19 import org.mmbase.util.logging.Logger; 20 import org.mmbase.util.logging.Logging; 21 22 import org.mmbase.applications.media.urlcomposers.URLComposer; 23 import org.mmbase.applications.media.filters.MainFilter; 24 import org.mmbase.applications.media.Format; 25 import org.mmbase.applications.media.Codec; 26 27 28 29 41 public class MediaSources extends MMObjectBuilder { 42 private static final Logger log = Logging.getLoggerInstance(MediaSources.class); 43 44 public static final String FUNCTION_URLS = "urls"; 46 public static final String FUNCTION_FILTEREDURLS = "filteredurls"; 47 public static final String FUNCTION_URL = "url"; 48 public static final String FUNCTION_AVAILABLE = "available"; 49 public static final String FUNCTION_FORMAT = "format"; 50 public static final String FUNCTION_CODEC = "codec"; 51 public static final String FUNCTION_MIMETYPE = "mimetype"; 52 53 54 public final static Parameter[] URLS_PARAMETERS = { new Parameter("node", org.mmbase.bridge.Node.class), 56 new Parameter.Wrapper(MediaFragments.URLS_PARAMETERS) }; 57 public final static Parameter[] FILTEREDURLS_PARAMETERS = URLS_PARAMETERS; 58 public final static Parameter[] URL_PARAMETERS = URLS_PARAMETERS; 59 public final static Parameter[] AVAILABLE_PARAMETERS = {}; 60 public final static Parameter[] FORMAT_PARAMETERS = URLS_PARAMETERS; 61 public final static Parameter[] CODEC_PARAMETERS = {}; 62 public final static Parameter[] MIMETYPE_PARAMETERS = {}; 63 64 65 66 67 68 public final static int STATE_DONE = 3; public final static int STATE_SOURCE = 4; public final static int STATE_REMOVED = 10; public final static String STATES_RESOURCE = "org.mmbase.applications.media.builders.resources.states"; 73 74 public final static int MONO = 1; 75 public final static int STEREO = 2; 76 77 78 79 80 private String defaultProvider = null; 81 82 85 public boolean init() { 86 boolean result = super.init(); 87 88 defaultProvider = getInitParameter("default.provider.alias"); 89 90 return result; 91 } 92 93 94 public MediaSources() { 95 } 96 97 108 public MMObjectNode createSource(MMObjectNode mediafragment, int status, int format, int speed, int channels, String url, String owner) { 109 MMObjectNode source = getNewNode(owner); 111 source.setValue("state", status); 112 source.setValue("format", format); 113 source.setValue("codec", Codec.UNKNOWN.toInt()); 114 source.setValue("bitrate", speed); 115 source.setValue("channels",channels); 116 source.setValue("url",url); 117 source.insert(owner); 118 119 MMObjectNode insrel = mmb.getInsRel().getNewNode(owner); 121 insrel.setValue("snumber", mediafragment.getIntValue("number")); 122 insrel.setValue("dnumber", source.getIntValue("number")); 123 insrel.setValue("rnumber", mmb.getRelDef().getNumberByName("related")); 124 int ret = insrel.insert(owner); 125 if(ret<0) { 126 log.error("Cannot create relation between mediafragment and mediasource "+insrel); 127 } else { 128 log.debug("created "+insrel); 129 } 130 131 return source; 132 } 133 134 135 142 protected String getURL(MMObjectNode source, Map info) { 143 List urls = getFilteredURLs(source, null, info); 144 if (urls.size() == 0) return "[could not compose URL]"; 145 URLComposer ri = (URLComposer) urls.get(0); 146 return ri.getURL(); 147 } 148 149 150 156 String getMimeType(MMObjectNode source) { return getFormat(source).getMimeType(); 158 159 } 160 161 162 163 166 public String getGUIIndicator(MMObjectNode source) { 167 return "" + Format.get(source.getIntValue("format")) + "/" + source.getStringValue("bitrate") + "/" + source.getStringValue("channels"); 168 182 } 183 184 public int getSpeed(MMObjectNode node) { 185 return node.getIntValue("bitrate"); 186 } 187 188 public int getChannels(MMObjectNode node) { 189 return node.getIntValue("channels"); 190 } 191 192 195 protected Format getFormat(MMObjectNode source) { 196 return Format.get(source.getIntValue("format")); 197 } 198 199 200 protected String getFormat(MMObjectNode source, Map info) { 201 log.debug("Getting format of a source."); 202 List urls = getFilteredURLs(source, null, info); 203 if (urls.size() > 0) { 204 return ((URLComposer) urls.get(0)).getFormat().toString(); 205 } else { 206 return ""; } 208 } 209 210 213 protected Codec getCodec(MMObjectNode source) { 214 return Codec.get(source.getIntValue("codec")); 215 } 216 217 220 protected Object executeFunction(MMObjectNode node, String function, List args) { 221 if (log.isDebugEnabled()) { 222 log.debug("executeFunction " + function + "(" + args + ") on mediasources " + node); 223 } 224 if (function.equals("info")) { 225 List empty = new ArrayList(); 226 java.util.Map info = (java.util.Map ) super.executeFunction(node, function, empty); 227 info.put("absoluteurl", "(<??>)"); 228 info.put("urlresult", "(<??>) "); 229 info.put(FUNCTION_URLS, "(fragment) A list of all possible URLs to this source/fragment (Really URLComposer.URLComposer's)"); 230 info.put(FUNCTION_FORMAT, "() Shorthand for gui(format)"); 231 info.put(FUNCTION_CODEC, "() Shorthand for gui(codec)"); 232 info.put(FUNCTION_MIMETYPE, "() Returns the mime-type for this source"); 233 info.put("gui", "(state|channels|codec|format|..) Gui representation of this object."); 234 235 if (args == null || args.size() == 0) { 236 return info; 237 } else { 238 return info.get(args.get(0)); 239 } 240 } else if (FUNCTION_URLS.equals(function) || FUNCTION_FILTEREDURLS.equals(function)) { 241 242 Parameters parameters = Functions.buildParameters(URLS_PARAMETERS, args); 243 244 MMObjectNode fragment; 245 246 Object f = parameters.get("node"); 247 if (f == null) { 248 fragment = null; 249 } else { 250 if (f instanceof MMObjectNode) { 251 fragment = (MMObjectNode) f; 252 } else if (f instanceof org.mmbase.bridge.Node) { 253 fragment = getNode(((org.mmbase.bridge.Node) f).getNumber()); 254 } else if (f instanceof String ) { 255 fragment = getNode((String ) f); 256 } else { 257 throw new IllegalArgumentException ("Argument of function " + FUNCTION_URLS + " must be a Node"); 258 } 259 } 260 261 if (FUNCTION_FILTEREDURLS.equals(function)) { 262 return getFilteredURLs(node, fragment, MediaFragments.translateURLArguments(args, null)); 263 } else { 264 return getURLs(node, fragment, MediaFragments.translateURLArguments(args, null), null,null); 265 } 266 } else if (FUNCTION_URL.equals(function)) { 267 return getURL(node, MediaFragments.translateURLArguments(args, null)); 268 } else if (FUNCTION_AVAILABLE.equals(function)) { 269 Iterator providers = getProviders(node).iterator(); 270 while (providers.hasNext()) { 271 MMObjectNode provider = (MMObjectNode) providers.next(); 273 if (provider.getIntValue("state") == MediaProviders.STATE_ON) return Boolean.TRUE; 274 } 275 return Boolean.FALSE; 276 } else if (FUNCTION_FORMAT.equals(function)) { 277 return getFormat(node, MediaFragments.translateURLArguments(args, null)); 278 } else if (FUNCTION_CODEC.equals(function)) { 279 return getCodec(node); 280 } else if (FUNCTION_MIMETYPE.equals(function)) { 281 return getMimeType(node); 282 } else if (args != null && args.size() > 0) { 283 if (function.equals("gui")) { 284 if ("state".equals(args.get(0))) { 285 String val = node.getStringValue("state"); 286 ResourceBundle bundle; 287 if (args.size() > 1) { 288 bundle = ResourceBundle.getBundle(STATES_RESOURCE, new Locale((String ) args.get(1), ""), getClass().getClassLoader()); 289 } else { 290 bundle = ResourceBundle.getBundle(STATES_RESOURCE, new Locale(mmb.getLanguage(), ""), getClass().getClassLoader()); 291 } 292 try { 293 return bundle.getString(val); 294 } catch (java.util.MissingResourceException e) { 295 return val; 296 } 297 } else if ("channels".equals(args.get(0))) { 298 int val = node.getIntValue("channels"); 299 switch(val) { 300 case MONO: return "Mono"; 301 case STEREO: return "Stereo"; 302 default: return "Undefined"; 303 } 304 } else if ("codec".equals(args.get(0))) { 305 return getCodec(node); 306 } else if ("format".equals(args.get(0))) { 307 Locale locale = new Locale(mmb.getLanguage(), ""); 308 if(args.size() > 1) { 309 locale = new Locale((String ) args.get(1), ""); 310 } 311 return getFormat(node).getGUIIndicator(locale); 312 } else if ("".equals(args.get(0)) || args.get(0) == null) { 313 return super.executeFunction(node, function, args); } else { 315 return node.getStringValue((String ) args.get(0)); 316 } 317 } 318 } else { 319 String arg = null; 320 if (args != null && args.size() > 0) { 321 arg = (String ) args.get(0); 322 } else { 323 arg = ""; 324 } 325 if (function.equals("absoluteurl")) { 326 Map info = new HashMap(); 327 info.put("server", arg); 328 return getURL(node, info); 329 } else if (function.equals("urlresult")) { 330 } 332 } 333 log.debug("Function not matched in mediasources"); 334 return super.executeFunction(node, function, args); 335 } 336 337 341 345 346 347 350 351 protected List getURLs(MMObjectNode source, MMObjectNode fragment, Map info, List urls, Set cacheExpireObjects) { 352 if (urls == null) urls = new ArrayList(); 353 log.debug("Getting urls for source " + source.getNumber()); 354 List providers = getProviders(source); 355 if (providers.size() == 0) { 356 if (defaultProvider != null) { 357 MMObjectNode provider = getNode(defaultProvider); 358 if (provider == null) { 359 log.warn("Specified default provider '" + defaultProvider + "' is not an existing node"); 360 } else { 361 MediaProviders bul = (MediaProviders) provider.getBuilder(); bul.getURLs(provider, source, fragment, info, urls, cacheExpireObjects); 363 } 364 } 365 366 } else { 367 Iterator i = providers.iterator(); 368 while (i.hasNext()) { 369 MMObjectNode provider = (MMObjectNode) i.next(); 370 if (log.isDebugEnabled()) { 371 log.debug("Found provider " + provider.getNumber() + " source: " + source.getNumber()); 372 } 373 MediaProviders bul = (MediaProviders) provider.getBuilder(); bul.getURLs(provider, source, fragment, info, urls, cacheExpireObjects); 375 } 376 } 377 return urls; 378 } 379 382 protected List getFilteredURLs(MMObjectNode source, MMObjectNode fragment, Map info) { 383 List urls = getURLs(source, fragment, info, null, null); 384 return MainFilter.getInstance().filter(urls); 385 } 386 387 394 395 public void addProvider(MMObjectNode source, String providername, String owner) { 396 MMObjectBuilder providers = mmb.getMMObject("mediaproviders"); 397 398 411 412 int providernumber = 0; 413 Enumeration e = providers.search("WHERE name='"+providername+"'"); 414 if (!e.hasMoreElements()) { 415 log.error("No media provider found with name "+providername); 416 return; 417 } else { 418 MMObjectNode provider = (MMObjectNode)e.nextElement(); 419 providernumber = provider.getIntValue("number"); 420 log.debug("found provider with number = "+providernumber); 421 } 422 if (e.hasMoreElements()) { 423 log.error("Multiple media providers with name "+providername+" found"); 424 return; 425 } 426 427 MMObjectNode insrel = mmb.getInsRel().getNewNode(owner); 428 insrel.setValue("snumber", source.getValue("number")); 429 insrel.setValue("dnumber", providernumber); 430 insrel.setValue("rnumber", mmb.getRelDef().getNumberByName("related")); 431 432 int ret = insrel.insert(owner); 433 if(ret<0) { 434 log.error("cannot create relation "+insrel); 435 } else { 436 log.debug("relation created "+insrel); 437 } 438 } 439 440 441 446 protected List getProviders(MMObjectNode source) { 447 if (log.isDebugEnabled()) { 448 log.debug("mediasource " + source.getStringValue("number")); 449 } 450 return source.getRelatedNodes("mediaproviders"); 451 } 452 453 454 private void checkFields(MMObjectNode node) { 455 if (log.isDebugEnabled()) { 456 log.debug("format: " + node.getValue("format")); 457 } 458 if (node.getValue("format") == null || node.getIntValue("format") == -1) { 459 String url = node.getStringValue("url"); 460 int dot = url.lastIndexOf('.'); 461 if (dot > 0) { 462 String extension = url.substring(dot + 1).toLowerCase(); 463 if (log.isDebugEnabled()) { 464 log.debug("Format of was unset, trying to autodetect by using 'url' field '" + url + "' with extension '" + extension + "'"); 465 } 466 node.setValue("format", Format.get(extension).toInt()); 467 } 468 } 469 } 470 471 public boolean setValue(MMObjectNode node,String fieldName, Object value) { 472 if ("format".equals(fieldName)) { 473 } 474 return super.setValue(node, fieldName, value); 475 } 476 477 482 483 public boolean commit(MMObjectNode node) { 484 checkFields(node); 485 return super.commit(node); 486 } 487 public int insert(String owner, MMObjectNode node) { 488 checkFields(node); 489 return super.insert(owner, node); 490 } 491 492 493 494 } 495 | Popular Tags |