/* * Copyright 2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wamblee.crawler.kiss; import java.util.Comparator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wamblee.crawler.Action; import org.wamblee.crawler.Page; import org.wamblee.crawler.PageException; /** * Represents a television program. */ public class Program { public static class TimeSorter implements Comparator { /* (non-Javadoc) * @see java.util.Comparator#compare(T, T) */ public int compare(Program o1, Program o2) { return o1.getInterval().getBegin().compareTo(o2.getInterval().getBegin()); } } private static final Log LOG = LogFactory.getLog(Program.class); /** * Name of the record action on the program details page. */ private static final String RECORD_ACTION = "record"; private static final String RESULT_ELEM = "result"; public enum RecordingResult { OK("Successfully recorded programs"), DUPLICATE( "Already recorded programs"), CONFLICT( "Programs in conflict with another recorded program"), OLDSHOW( "Programs that occurred in the past"), ERROR( "Programs that could not be recorded for technical reasons"); private String _description; private RecordingResult(String aDescription) { _description = aDescription; } public String getDescription() { return _description; } }; /** * Indent string to use for pretty printing. */ private static final String INDENT = " "; /** * Channel the program is on. */ private String _channel; /** * Program name. */ private String _name; /** * Program description. */ private String _description; /** * Keywords or classification of the program. */ private String _keywords; /** * Time interval for the program (from/to). */ private TimeInterval _interval; /** * Action to execute to obtain program information and/or record the * program. */ private Action _programInfo; /** * Constructs the program. * * @param aChannel * Channel name. * @param aName * Program name. * @param aDescription * Description. * @param aKeywords * Keywords/classification. * @param aInterval * Time interval. * @param aProgramInfo * Action to execute for detailed program information or for * recording the page. */ public Program(String aChannel, String aName, String aDescription, String aKeywords, TimeInterval aInterval, Action aProgramInfo) { _channel = aChannel; _name = aName; _description = aDescription; _keywords = aKeywords; _interval = aInterval; _programInfo = aProgramInfo; } /** * Gets the channel. * * @return Channel. */ public String getChannel() { return _channel; } /** * Gets the program name. * * @return Name. */ public String getName() { return _name; } /** * Gets the description. * * @return Description. */ public String getDescription() { return _description; } /** * Gets the keywords/classification. * * @return Keywords/classification */ public String getKeywords() { return _keywords; } /** * Gets the time interval. * * @return Time interval. */ public TimeInterval getInterval() { return _interval; } /** * Checks if recording is possible. * @return True iff recording is possible. */ public boolean isRecordingPossible() { try { Action record = _programInfo.execute().getAction(RECORD_ACTION); if (record == null) { return false; } return true; } catch (PageException e) { return false; } } /** * Records the show. * * @return Status describing the result of recording. */ public RecordingResult record() { LOG.info("Recording " + this); try { Action record = _programInfo.execute().getAction(RECORD_ACTION); if (record == null) { LOG.info(" result: " + RecordingResult.OLDSHOW); return RecordingResult.OLDSHOW; } Page result = record.execute(); RecordingResult recordingResult = RecordingResult.valueOf(result.getContent().getText()); LOG.info(" result: " + recordingResult); return recordingResult; } catch (PageException e) { LOG.warn("Technical problem recording program: '" + this + "'", e); LOG.info(" result: " + RecordingResult.ERROR); return RecordingResult.ERROR; } } /** * Accepts the visitor. * * @param aVisitor * Visitor. */ public void accept(Visitor aVisitor) { aVisitor.visitProgram(this); } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { return _interval + " - " + _name + " (" + _channel + "/" + _keywords + ")" + "\n" + (INDENT + _description).replaceAll("\n", "\n" + INDENT); } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if ( !(obj instanceof Program)) { return false; } Program program = (Program)obj; return getName().equals(program.getName()) && _programInfo.equals(program._programInfo); } }