/*
* Copyright 2013-2016 Skynav, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY SKYNAV, INC. AND ITS CONTRIBUTORS “AS IS” AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SKYNAV, INC. OR ITS CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.skynav.ttv.verifier.ttml;
import java.math.BigInteger;
import java.util.Map;
import javax.xml.namespace.QName;
import com.skynav.ttv.model.Model;
import com.skynav.ttv.model.ttml2.tt.TimedText;
import com.skynav.ttv.model.ttml2.ttd.ClockMode;
import com.skynav.ttv.model.ttml2.ttd.DropMode;
import com.skynav.ttv.model.ttml2.ttd.InferProcessorProfileMethod;
import com.skynav.ttv.model.ttml2.ttd.InferProcessorProfileSource;
import com.skynav.ttv.model.ttml2.ttd.MarkerMode;
import com.skynav.ttv.model.ttml2.ttd.ProfileCombination;
import com.skynav.ttv.model.ttml2.ttd.TimeBase;
import com.skynav.ttv.model.ttml2.ttd.Validation;
import com.skynav.ttv.model.ttml2.ttd.ValidationAction;
import com.skynav.ttv.model.ttml2.ttp.Extensions;
import com.skynav.ttv.model.ttml2.ttp.Features;
import com.skynav.ttv.verifier.ttml.parameter.ClockModeVerifier;
import com.skynav.ttv.verifier.ttml.parameter.DisplayAspectRatioVerifier;
import com.skynav.ttv.verifier.ttml.parameter.DropModeVerifier;
import com.skynav.ttv.verifier.ttml.parameter.FeatureSemanticsVerifier;
import com.skynav.ttv.verifier.ttml.parameter.InferProcessorProfileMethodVerifier;
import com.skynav.ttv.verifier.ttml.parameter.InferProcessorProfileSourceVerifier;
import com.skynav.ttv.verifier.ttml.parameter.MarkerModeVerifier;
import com.skynav.ttv.verifier.ttml.parameter.ProfileCombinationVerifier;
import com.skynav.ttv.verifier.ttml.parameter.ProfilesVerifier;
import com.skynav.ttv.verifier.ttml.parameter.TimeBaseVerifier;
import com.skynav.ttv.verifier.ttml.parameter.ValidationActionVerifier;
import com.skynav.ttv.verifier.ttml.parameter.ValidationVerifier;
import com.skynav.ttv.verifier.ttml.parameter.VersionVerifier;
import com.skynav.xml.helpers.XML;
public class TTML2ParameterVerifier extends TTML1ParameterVerifier {
public static final QName contentProfileCombinationAttributeName = new QName(NAMESPACE, "contentProfileCombination");
public static final QName contentProfilesAttributeName = new QName(NAMESPACE, "contentProfiles");
public static final QName displayAspectRatioAttributeName = new QName(NAMESPACE, "displayAspectRatio");
public static final QName inferProcessorProfileMethodAttributeName = new QName(NAMESPACE, "inferProcessorProfileMethod");
public static final QName inferProcessorProfileSourceAttributeName = new QName(NAMESPACE, "inferProcessorProfileSource");
public static final QName mediaDurationAttributeName = new QName(NAMESPACE, "mediaDuration");
public static final QName mediaOffsetAttributeName = new QName(NAMESPACE, "mediaOffset");
public static final QName permitFeatureNarrowingAttributeName = new QName(NAMESPACE, "permitFeatureNarrowing");
public static final QName permitFeatureWideningAttributeName = new QName(NAMESPACE, "permitFeatureWidening");
public static final QName processorProfileCombinationAttributeName = new QName(NAMESPACE, "processorProfileCombination");
public static final QName processorProfilesAttributeName = new QName(NAMESPACE, "processorProfiles");
public static final QName validationActionAttributeName = new QName(NAMESPACE, "validationAction");
public static final QName validationAttributeName = new QName(NAMESPACE, "validation");
public static final QName versionAttributeName = new QName(NAMESPACE, "version");
private static final Object[][] parameterAccessorMap = new Object[][] {
{
clockModeAttributeName,
"ClockMode",
ClockMode.class,
ClockModeVerifier.class,
Boolean.FALSE,
ClockMode.UTC,
},
{
contentProfileCombinationAttributeName,
"ContentProfileCombination",
ProfileCombination.class,
ProfileCombinationVerifier.class,
Boolean.FALSE,
ProfileCombination.REPLACE,
},
{
contentProfilesAttributeName,
"ContentProfiles",
String.class,
ProfilesVerifier.class,
Boolean.FALSE,
null
},
{
displayAspectRatioAttributeName,
"DisplayAspectRatio",
String.class,
DisplayAspectRatioVerifier.class,
Boolean.FALSE,
"auto",
},
{
dropModeAttributeName,
"DropMode",
DropMode.class,
DropModeVerifier.class,
Boolean.FALSE,
DropMode.NON_DROP,
},
{
inferProcessorProfileMethodAttributeName,
"InferProcessorProfileMethod",
InferProcessorProfileMethod.class,
InferProcessorProfileMethodVerifier.class,
Boolean.FALSE,
InferProcessorProfileMethod.LOOSE,
},
{
inferProcessorProfileSourceAttributeName,
"InferProcessorProfileSource",
InferProcessorProfileSource.class,
InferProcessorProfileSourceVerifier.class,
Boolean.FALSE,
InferProcessorProfileSource.COMBINED,
},
{
markerModeAttributeName,
"MarkerMode",
MarkerMode.class,
MarkerModeVerifier.class,
Boolean.FALSE,
MarkerMode.DISCONTINUOUS,
},
{
permitFeatureNarrowingAttributeName,
"PermitFeatureNarrowing",
Boolean.class,
FeatureSemanticsVerifier.class,
Boolean.FALSE,
Boolean.FALSE,
},
{
permitFeatureWideningAttributeName,
"PermitFeatureWidening",
Boolean.class,
FeatureSemanticsVerifier.class,
Boolean.FALSE,
Boolean.FALSE,
},
{
processorProfileCombinationAttributeName,
"ProcessorProfileCombination",
ProfileCombination.class,
ProfileCombinationVerifier.class,
Boolean.FALSE,
ProfileCombination.REPLACE,
},
{
processorProfilesAttributeName,
"ProcessorProfiles",
String.class,
ProfilesVerifier.class,
Boolean.FALSE,
null
},
{
timeBaseAttributeName,
"TimeBase",
TimeBase.class,
TimeBaseVerifier.class,
Boolean.FALSE,
TimeBase.MEDIA,
},
{
validationAttributeName,
"Validation",
Validation.class,
ValidationVerifier.class,
Boolean.FALSE,
Validation.OPTIONAL,
},
{
validationActionAttributeName,
"ValidationAction",
ValidationAction.class,
ValidationActionVerifier.class,
Boolean.FALSE,
ValidationAction.WARN,
},
{
versionAttributeName,
"Version",
BigInteger.class,
VersionVerifier.class,
Boolean.FALSE,
BigInteger.valueOf(2),
},
};
public TTML2ParameterVerifier(Model model) {
super(model);
}
@Override
protected void populateAccessors(Map<QName, ParameterAccessor> accessors) {
super.populateAccessors(accessors);
populateAccessors(accessors, parameterAccessorMap);
}
@Override
protected boolean permitsParameterAttribute(Object content, QName name) {
if (content instanceof TimedText)
return true;
else
return false;
}
@Override
protected boolean isParameterAttribute(QName name) {
if (super.isParameterAttribute(name))
return true;
else if (name.equals(mediaDurationAttributeName)) // handled by ttml2 timing verifier
return true;
else if (name.equals(mediaOffsetAttributeName)) // handled by ttml2 timing verifier
return true;
else
return false;
}
@Override
protected boolean setParameterDefaultValue(Object content, ParameterAccessor pa, Object defaultValue) {
if (content instanceof TimedText) {
if (defaultValue != null) {
setParameterValue(content, pa.setterName, pa.valueClass, defaultValue);
return true;
}
} else if ((content instanceof Features) || (content instanceof Extensions)) {
if (pa.parameterName.equals(XML.getBaseAttributeName())) {
Model model = getModel();
if (content instanceof Features)
defaultValue = model.getFeatureNamespaceUri().toString();
else if (content instanceof Extensions)
defaultValue = model.getExtensionNamespaceUri().toString();
if (defaultValue != null) {
setParameterValue(content, pa.setterName, pa.valueClass, defaultValue);
return true;
}
}
}
return false;
}
}