/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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.opencastproject.metadata.mpeg7;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.util.Formatter;
/**
* Implementation of a relative <code>TimePoint</code>.
*/
public class MediaRelTimePointImpl extends MediaTimePointImpl implements MediaTimePoint {
/** Time delimiter */
private static final String TimeSpecDelimiter = "T";
/** Fraction delimiter */
private static final String FractionSpecDelimiter = "F";
/** Time separator */
private static final String TimeSeparator = ":";
/** Number of milliseconds per second */
private static final long MS_PER_SECOND = 1000L;
/** Number of milliseconds per minute */
private static final long MS_PER_MINUTE = 60000L;
/** Number of milliseconds per hour */
private static final long MS_PER_HOUR = 3600000L;
/** Number of milliseconds per day */
private static final long MS_PER_DAY = 86400000L;
/**
* Creates a relative time point at <code>T00:00:00:0F1000</code>.
*/
public MediaRelTimePointImpl() {
super();
}
/**
* @param milliseconds
*/
public MediaRelTimePointImpl(long milliseconds) {
fractions = (int) (milliseconds % MS_PER_SECOND);
second = (int) ((milliseconds / MS_PER_SECOND) % 60);
minute = (int) ((milliseconds / MS_PER_MINUTE) % 60);
hour = (int) ((milliseconds / MS_PER_HOUR) % 24);
day = (int) (milliseconds / MS_PER_DAY);
hour += day * 24;
fractionsPerSecond = 1000;
}
/**
* @param hour
* the number of hours
* @param minute
* the number of minutes
* @param second
* the number of seconds
* @param fraction
* the number of fractions
* @param fractionsPerSecond
* the number of fractions per second
*/
public MediaRelTimePointImpl(int hour, int minute, int second, int fraction, int fractionsPerSecond) {
this.fractionsPerSecond = fractionsPerSecond;
this.fractions = fraction;
this.second = second;
this.minute = minute;
this.hour = hour;
}
/**
* Creates a relative timepoint representation from the given time point string.
*
* @param text
* the timepoint text representation
* @return the the timepoint
* @throws IllegalArgumentException
* if <code>text</code> is malformed
*/
public static MediaRelTimePointImpl parseTimePoint(String text) throws IllegalArgumentException {
MediaRelTimePointImpl timePoint = new MediaRelTimePointImpl();
timePoint.parse(text);
return timePoint;
}
/**
* Parses a timepoint string.
*/
private void parse(String text) throws IllegalArgumentException {
String time = null;
String fractions = null;
time = text.substring(text.indexOf(TimeSpecDelimiter) + 1, text.indexOf(TimeSpecDelimiter) + 9);
fractions = text.substring(text.indexOf(TimeSpecDelimiter) + time.length() + 2);
if (fractions.contains(TimeSeparator)) {
timeZone = fractions.substring(fractions.length() - 6);
fractions = fractions.substring(0, fractions.length() - 7);
}
parseTime(time);
parseDate(time);
parseFractions(fractions);
}
/**
* Parses the fractions of a time point.
*
* @param fractions
* the fractions
*/
private void parseFractions(String fractions) {
this.fractions = Integer.parseInt(fractions.substring(0, fractions.indexOf(FractionSpecDelimiter)));
this.fractionsPerSecond = Integer.parseInt(fractions.substring(fractions.indexOf(FractionSpecDelimiter) + 1));
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return super.hashCode();
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof MediaRelTimePointImpl) {
return ((MediaRelTimePointImpl) obj).getTimeInMilliseconds() == getTimeInMilliseconds();
}
return false;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
Formatter f = new Formatter();
String result = null;
result = f.format("T%02d:%02d:%02d:%dF%d", hour, minute, second, fractions, fractionsPerSecond).toString();
f.close();
return result;
}
/**
* @see org.opencastproject.mediapackage.XmlElement#toXml(org.w3c.dom.Document)
*/
public Node toXml(Document document) {
Element node = null;
node = document.createElement("MediaRelTimePoint");
node.setTextContent(toString());
return node;
}
}