/* This file is part of ATM. ATM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ATM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ATM. If not, see <http://www.gnu.org/licenses/>. */ package org.jflicks.restlet; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import org.jflicks.configure.Configuration; import org.jflicks.configure.J4ccConfiguration; import org.jflicks.nms.NMS; import org.jflicks.nms.NMSConstants; import org.jflicks.nms.NMSUtil; import org.jflicks.nms.State; import org.jflicks.nms.Video; import org.jflicks.tv.Channel; import org.jflicks.tv.Recording; import org.jflicks.tv.RecordingRule; import org.jflicks.tv.Show; import org.jflicks.tv.ShowAiring; import org.jflicks.tv.Task; import org.jflicks.tv.Upcoming; import org.jflicks.util.LogUtil; import org.jflicks.util.Util; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; /** * This class is a singleton to handle state of NMS support * vis REST. * * @author Doug Barnum * @version 1.0 */ public final class NMSSupport extends BaseSupport { private static NMSSupport instance = new NMSSupport(); /** * Default empty constructor. */ private NMSSupport() { } /** * We are a singleton, so users need access to it. * * @return A NMSSupport instance. */ public static NMSSupport getInstance() { return (instance); } public Channel[] getChannels() { Channel[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<Channel> clist = new ArrayList<Channel>(); for (int i = 0; i < array.length; i++) { Channel[] carray = getChannels(array[i]); if ((carray != null) && (carray.length > 0)) { for (int j = 0; j < carray.length; j++) { clist.add(carray[j]); } } } if (clist.size() > 0) { result = clist.toArray(new Channel[clist.size()]); } } return (result); } private Channel[] getChannels(NMS n) { Channel[] result = null; if (n != null) { result = n.getRecordableChannels(); } return (result); } public Channel getChannelById(String id) { Channel result = null; LogUtil.log(LogUtil.DEBUG, "id: " + id); Channel[] array = getChannels(); if ((id != null) && (array != null) && (array.length > 0)) { int cid = Util.str2int(id, 0); if (cid != 0) { for (int i = 0; i < array.length; i++) { if (cid == array[i].getId()) { result = array[i]; break; } } } } return (result); } public ShowAiring[] getShowAiringsByChannel(Channel c) { ShowAiring[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<ShowAiring> slist = new ArrayList<ShowAiring>(); for (int i = 0; i < array.length; i++) { ShowAiring[] sarray = getShowAiringsByChannel(array[i], c); if ((sarray != null) && (sarray.length > 0)) { for (int j = 0; j < sarray.length; j++) { slist.add(sarray[j]); } } } if (slist.size() > 0) { result = slist.toArray(new ShowAiring[slist.size()]); } } return (result); } private ShowAiring[] getShowAiringsByChannel(NMS n, Channel c) { ShowAiring[] result = null; if ((n != null) && (c != null)) { result = n.getShowAiringsByChannel(c); } return (result); } public String[] getRecordingTitles() { String[] result = null; NMS[] array = getNMS(); LogUtil.log(LogUtil.DEBUG, "do we have nms: " + array); if ((array != null) && (array.length > 0)) { ArrayList<String> tlist = new ArrayList<String>(); for (int i = 0; i < array.length; i++) { Recording[] rarray = getRecordings(array[i]); if ((rarray != null) && (rarray.length > 0)) { for (int j = 0; j < rarray.length; j++) { String title = rarray[j].getTitle(); if (!tlist.contains(title)) { tlist.add(title); } } } } if (tlist.size() > 0) { result = tlist.toArray(new String[tlist.size()]); Arrays.sort(result, new RecordingSortByTitle()); } } return (result); } public Recording[] getRecordingsByTitle(String s) { Recording[] result = null; if (s != null) { Recording[] array = getRecordings(); if ((array != null) && (array.length > 0)) { ArrayList<Recording> rlist = new ArrayList<Recording>(); for (int i = 0; i < array.length; i++) { if (s.equals(array[i].getTitle())) { rlist.add(array[i]); } } if (rlist.size() > 0) { result = rlist.toArray(new Recording[rlist.size()]); } } } return (result); } public Recording[] getRecordings() { Recording[] result = null; NMS[] array = getNMS(); LogUtil.log(LogUtil.DEBUG, "NMS array null = " + (array == null)); if ((array != null) && (array.length > 0)) { ArrayList<Recording> rlist = new ArrayList<Recording>(); for (int i = 0; i < array.length; i++) { Recording[] rarray = getRecordings(array[i]); LogUtil.log(LogUtil.DEBUG, "recording array null = " + (rarray == null)); if ((rarray != null) && (rarray.length > 0)) { LogUtil.log(LogUtil.DEBUG, "rarray.length " + rarray.length); for (int j = 0; j < rarray.length; j++) { rlist.add(rarray[j]); } } } LogUtil.log(LogUtil.DEBUG, "rlist.size() " + rlist.size()); if (rlist.size() > 0) { result = rlist.toArray(new Recording[rlist.size()]); } } return (result); } private Recording[] getRecordings(NMS n) { Recording[] result = null; LogUtil.log(LogUtil.DEBUG, "NMS null = " + (n == null)); if (n != null) { Recording[] array = n.getRecordings(); LogUtil.log(LogUtil.DEBUG, "array null = " + (array == null)); if ((array != null) && (array.length > 0)) { LogUtil.log(LogUtil.DEBUG, "array length = " + array.length); ArrayList<Recording> l = new ArrayList<Recording>(); for (int i = 0; i < array.length; i++) { l.add(array[i]); } if (l.size() > 0) { result = l.toArray(new Recording[l.size()]); } } } return (result); } public RecordingRule[] getRecordingRules() { RecordingRule[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<RecordingRule> rlist = new ArrayList<RecordingRule>(); for (int i = 0; i < array.length; i++) { RecordingRule[] rarray = getRecordingRules(array[i]); if ((rarray != null) && (rarray.length > 0)) { for (int j = 0; j < rarray.length; j++) { rlist.add(rarray[j]); } } } if (rlist.size() > 0) { result = rlist.toArray(new RecordingRule[rlist.size()]); } } return (result); } private RecordingRule[] getRecordingRules(NMS n) { RecordingRule[] result = null; if (n != null) { result = n.getRecordingRules(); } return (result); } public RecordingRule getRecordingRuleById(String s) { RecordingRule result = null; RecordingRule[] rules = getRecordingRules(); if ((s != null) && (rules != null)) { for (int i = 0; i < rules.length; i++) { if (s.equals(rules[i].getId())) { result = rules[i]; break; } } } return (result); } public Recording getRecordingById(String s) { Recording result = null; Recording[] recs = getRecordings(); if ((s != null) && (recs != null)) { for (int i = 0; i < recs.length; i++) { if (s.equals(recs[i].getId())) { result = recs[i]; break; } } } return (result); } public void schedule(RecordingRule rr) { if (rr != null) { NMS n = NMSUtil.select(getNMS(), rr.getHostPort()); if (n != null) { n.schedule(rr); } } } public void stopRecording(String id) { NMS[] array = getNMS(); if ((id != null) && (array != null) && (array.length > 0)) { NMS n = null; Recording r = null; for (int i = 0; i < array.length; i++) { r = array[i].getRecordingById(id); if (r != null) { n = array[i]; break; } } if ((n != null) && (r != null)) { n.stopRecording(r); } } } public String processDelete(String id, boolean b) { String result = "\n"; NMS[] array = getNMS(); if ((id != null) && (array != null) && (array.length > 0)) { NMS n = null; Recording r = null; for (int i = 0; i < array.length; i++) { r = array[i].getRecordingById(id); if (r != null) { n = array[i]; break; } } if ((n != null) && (r != null)) { n.removeRecording(r, b); } } return (result); } public ShowAiring[] getShowAirings(String term, int searchType) { ShowAiring[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<ShowAiring> slist = new ArrayList<ShowAiring>(); for (int i = 0; i < array.length; i++) { ShowAiring[] sarray = getShowAirings(array[i], term, searchType); if ((sarray != null) && (sarray.length > 0)) { for (int j = 0; j < sarray.length; j++) { slist.add(sarray[j]); } } } if (slist.size() > 0) { result = slist.toArray(new ShowAiring[slist.size()]); } } return (result); } private ShowAiring[] getShowAirings(NMS n, String term, int searchType) { ShowAiring[] result = null; if ((term != null) && (n != null)) { result = n.getShowAirings(term, searchType); } return (result); } public ShowAiring[] getShowAiringsByLetter(String letter, boolean unique) { ShowAiring[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<ShowAiring> slist = new ArrayList<ShowAiring>(); for (int i = 0; i < array.length; i++) { ShowAiring[] sarray = getShowAiringsByLetter(array[i], letter, unique); if ((sarray != null) && (sarray.length > 0)) { for (int j = 0; j < sarray.length; j++) { slist.add(sarray[j]); } } } if (slist.size() > 0) { LogUtil.log(LogUtil.DEBUG, "Found: " + slist.size()); result = slist.toArray(new ShowAiring[slist.size()]); Arrays.sort(result, new ShowAiringSortByTitle()); } } return (result); } public ShowAiring[] getShowAiringsByLetter(NMS n, String letter, boolean unique) { ShowAiring[] result = null; if ((letter != null) && (n != null)) { letter = letter.toLowerCase(); Channel[] channels = getChannels(n); if ((channels != null) && (channels.length > 0)) { ArrayList<ShowAiring> l = new ArrayList<ShowAiring>(); ArrayList<ShowAiring> chanlist = new ArrayList<ShowAiring>(); ArrayList<String> showlist = new ArrayList<String>(); for (int i = 0; i < channels.length; i++) { LogUtil.log(LogUtil.DEBUG, "Processing: " + channels[i]); ShowAiring[] array = getShowAiringsByChannel(n, channels[i]); if ((array != null) && (array.length > 0)) { for (int j = 0; j < array.length; j++) { Show s = array[j].getShow(); if (s != null) { String title = s.getTitle(); title = Util.toSortableTitle(title); title = title.toLowerCase(); if ((title != null) && (title.startsWith(letter))) { if (unique) { if (!showlist.contains(title)) { LogUtil.log(LogUtil.DEBUG, "Added: " + array[j]); chanlist.add(array[j]); showlist.add(title); } } else { LogUtil.log(LogUtil.DEBUG, "Added: " + array[j]); chanlist.add(array[j]); } } } } l.addAll(chanlist); chanlist.clear(); showlist.clear(); } } if (l.size() > 0) { result = l.toArray(new ShowAiring[l.size()]); } } } return (result); } public State getState() { State result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { result = array[0].getState(); if (result != null) { for (int i = 1; i < array.length; i++) { result = result.merge(array[i].getState()); } } } return (result); } public Task[] getTasks() { Task[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<Task> tlist = new ArrayList<Task>(); for (int i = 0; i < array.length; i++) { Task[] tarray = getTasks(array[i]); if ((tarray != null) && (tarray.length > 0)) { for (int j = 0; j < tarray.length; j++) { LogUtil.log(LogUtil.DEBUG, tarray[j].getDescription()); if (tarray[j].isSelectable()) { tlist.add(tarray[j]); } } } } if (tlist.size() > 0) { result = tlist.toArray(new Task[tlist.size()]); } } return (result); } private Task[] getTasks(NMS n) { Task[] result = null; if (n != null) { result = n.getTasks(); } return (result); } public J4ccConfiguration getJ4ccConfiguration(String host) { J4ccConfiguration result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0) && (host != null)) { for (int i = 0; i < array.length; i++) { if (host.equals(array[i].getHost())) { result = array[i].getJ4ccConfiguration(); break; } } } return (result); } public Configuration[] getConfigurations() { Configuration[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<Configuration> clist = new ArrayList<Configuration>(); for (int i = 0; i < array.length; i++) { Configuration[] carray = getConfigurations(array[i]); if ((carray != null) && (carray.length > 0)) { for (int j = 0; j < carray.length; j++) { clist.add(carray[j]); } } } if (clist.size() > 0) { result = clist.toArray(new Configuration[clist.size()]); } } return (result); } private Configuration[] getConfigurations(NMS n) { Configuration[] result = null; LogUtil.log(LogUtil.DEBUG, "nms: " + n); if (n != null) { result = n.getConfigurations(); } return (result); } public Upcoming[] getUpcomings() { Upcoming[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<Upcoming> ulist = new ArrayList<Upcoming>(); for (int i = 0; i < array.length; i++) { Upcoming[] uarray = getUpcomings(array[i]); if ((uarray != null) && (uarray.length > 0)) { for (int j = 0; j < uarray.length; j++) { ulist.add(uarray[j]); } } } if (ulist.size() > 0) { result = ulist.toArray(new Upcoming[ulist.size()]); } } return (result); } private Upcoming[] getUpcomings(NMS n) { Upcoming[] result = null; LogUtil.log(LogUtil.DEBUG, "nms: " + n); if (n != null) { result = n.getUpcomings(); } return (result); } public Upcoming getUpcomingByShowId(String showId) { Upcoming result = null; Upcoming[] array = getUpcomings(); if ((array != null) && (showId != null)) { for (int i = 0; i < array.length; i++) { if (showId.equals(array[i].getShowId())) { result = array[i]; break; } } } return (result); } public void overrideUpcoming(Upcoming u) { if (u != null) { NMS n = NMSUtil.select(getNMS(), u.getHostPort()); if (n != null) { n.overrideUpcoming(u); } } } public Video[] getVideos() { Video[] result = null; NMS[] array = getNMS(); if ((array != null) && (array.length > 0)) { ArrayList<Video> vlist = new ArrayList<Video>(); for (int i = 0; i < array.length; i++) { Video[] varray = getVideos(array[i]); if ((varray != null) && (varray.length > 0)) { for (int j = 0; j < varray.length; j++) { vlist.add(varray[j]); } } } if (vlist.size() > 0) { result = vlist.toArray(new Video[vlist.size()]); } } return (result); } private Video[] getVideos(NMS n) { Video[] result = null; if (n != null) { result = n.getVideos(); } return (result); } static class ShowAiringSortByTitle implements Comparator<ShowAiring>, Serializable { public int compare(ShowAiring sa0, ShowAiring sa1) { String title0 = Util.toSortableTitle(sa0.getShow().getTitle()); String title1 = Util.toSortableTitle(sa1.getShow().getTitle()); return (title0.compareTo(title1)); } } static class RecordingSortByTitle implements Comparator<String>, Serializable { public int compare(String s0, String s1) { String title0 = Util.toSortableTitle(s0); String title1 = Util.toSortableTitle(s1); return (title0.compareTo(title1)); } } }