/** * ======================== legal notice ====================== * * File: AbstractMediaNode.java Created: 13. June 2012, 04:57 Author: Geronimo Project: cmpc - a java frontend * (client) part of compound media player uses external players to play the * media * * CMP - compound media player * * is a client/server mediaplayer intended to play any media from any * workstation without the need to export or mount shares. cmps is an easy to * use backend with a (ready to use) HTML-interface. Additionally the backend * supports authentication via HTTP-digest authorization. cmpc is a client with * vdr-like osd-menues. * * Copyright (c) 2012 Reinhard Mantey, some rights reserved! published under * Creative Commons by-sa For details see * http://creativecommons.org/licenses/by-sa/3.0/ * * The cmp project's homepage is at * http://projects.vdr-developer.org/projects/cmp * * -------------------------------------------------------------- */ package de.schwarzrot.media.domain; import java.io.File; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.util.Map; import java.util.TreeMap; public abstract class AbstractMediaNode implements Serializable, Comparable { public static final String FORMAT_PROPERTY = "format"; public static final String NAME_PROPERTY = "name"; public static final String PATH_PROPERTY = "path"; public static final String TYPE_PROPERTY = "type"; public static final String SEARCH_PROPERTY = "search"; private static final long serialVersionUID = 713L; public enum SupportedMediaType { Genre, // Audio, // Movie, IMovie, DVDImage, IDVDImage, // LegacyVdrRecording, ILegacyVdrRecording, VdrRecording, IVdrRecording, // Picture, // Unknown } protected AbstractMediaNode(AbstractMediaNode parent, SupportedMediaType type, String mimeType, File path) { properties = new TreeMap(); setParent(parent); setType(type); setMimeType(mimeType); setRealPath(path); originalPath = realPath; } @Override public int compareTo(AbstractMediaNode o) { if (o == null) return -1; if (this != o) { int rv = type.ordinal() - o.getType().ordinal(); if (rv == 0) rv = getName().compareToIgnoreCase(o.getName()); return rv; } return 0; } public String getFormat() { return format; } public String getMimeType() { return mimeType; } public String getName() { return name; } public File getOriginalPath() { return originalPath; } public AbstractMediaNode getParent() { return parent; } public Map getProperties() { return properties; } public File getRealPath() { return realPath; } public String getSearch() { return search; } public SupportedMediaType getType() { return type; } public URI getURI() { return uri; } public void setFormat(String format) { this.format = format; properties.put(FORMAT_PROPERTY, format); } public void setMimeType(String mimeType) { this.mimeType = mimeType; } public void setName(String name) { this.name = name; properties.put(NAME_PROPERTY, name); refresh(); } public void setParent(AbstractMediaNode parent) { if ((this.parent = parent) != null) refresh(); } public void setPath(String path) { if (uri == null) { try { // properties.put(PATH_PROPERTY, path); uri = new URI(path); properties.put(PATH_PROPERTY, uri.toString()); } catch (URISyntaxException e) { e.printStackTrace(); } } try { File tmp = new File(URLDecoder.decode(path, "UTF-8")); if (path != null && originalPath == null) originalPath = tmp; setRealPath(tmp); } catch (Throwable t) { t.printStackTrace(); } } public void setProperty(String key, Object value) { properties.put(key, value); } public void setRealPath(File realPath) { this.realPath = realPath; if (name == null && realPath != null) setName(realPath.getName()); } public void setSearch(String search) { this.search = search; properties.put(SEARCH_PROPERTY, search); } public void setType(int type) { if (type == SupportedMediaType.Audio.ordinal()) this.type = SupportedMediaType.Audio; else if (type == SupportedMediaType.Movie.ordinal()) this.type = SupportedMediaType.Movie; else if (type == SupportedMediaType.IMovie.ordinal()) this.type = SupportedMediaType.IMovie; else if (type == SupportedMediaType.DVDImage.ordinal()) this.type = SupportedMediaType.DVDImage; else if (type == SupportedMediaType.IDVDImage.ordinal()) this.type = SupportedMediaType.IDVDImage; else if (type == SupportedMediaType.LegacyVdrRecording.ordinal()) this.type = SupportedMediaType.LegacyVdrRecording; else if (type == SupportedMediaType.ILegacyVdrRecording.ordinal()) this.type = SupportedMediaType.ILegacyVdrRecording; else if (type == SupportedMediaType.VdrRecording.ordinal()) this.type = SupportedMediaType.VdrRecording; else if (type == SupportedMediaType.IVdrRecording.ordinal()) this.type = SupportedMediaType.IVdrRecording; else if (type == SupportedMediaType.Picture.ordinal()) this.type = SupportedMediaType.Picture; else throw new EnumConstantNotPresentException(SupportedMediaType.class, "unknown ordinal #" + type); properties.put(TYPE_PROPERTY, this.type); } @Override public String toString() { return getName(); } protected void refresh() { if (parent != null && realPath != null) realPath = new File(parent.getRealPath(), getName()); } protected void setType(SupportedMediaType type) { this.type = type; properties.put(TYPE_PROPERTY, this.type); } private File realPath; private File originalPath; private URI uri; private SupportedMediaType type; private AbstractMediaNode parent; private String name; private String mimeType; private String search; private String format; private Map properties; }