/*****************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.xmpbox.type;
import java.util.Calendar;
import org.apache.xmpbox.XMPMetadata;
public abstract class AbstractStructuredType extends AbstractComplexProperty
{
protected static final String STRUCTURE_ARRAY_NAME = "li";
private String namespace;
private String preferedPrefix;
private String prefix;
public AbstractStructuredType(XMPMetadata metadata)
{
this(metadata, null, null, null);
}
public AbstractStructuredType(XMPMetadata metadata, String namespaceURI)
{
this(metadata, namespaceURI, null, null);
StructuredType st = this.getClass().getAnnotation(StructuredType.class);
if (st != null)
{
// init with annotation
this.namespace = st.namespace();
this.preferedPrefix = st.preferedPrefix();
}
else
{
throw new IllegalArgumentException(" StructuredType annotation cannot be null");
}
this.prefix = this.preferedPrefix;
}
public AbstractStructuredType(XMPMetadata metadata, String namespaceURI, String fieldPrefix, String propertyName)
{
super(metadata, propertyName);
StructuredType st = this.getClass().getAnnotation(StructuredType.class);
if (st != null)
{
// init with annotation
this.namespace = st.namespace();
this.preferedPrefix = st.preferedPrefix();
}
else
{
// init with parameters
if (namespaceURI == null)
{
throw new IllegalArgumentException(
"Both StructuredType annotation and namespace parameter cannot be null");
}
this.namespace = namespaceURI;
this.preferedPrefix = fieldPrefix;
}
this.prefix = fieldPrefix == null ? this.preferedPrefix : fieldPrefix;
}
/**
* Get the namespace URI of this entity
*
* @return the namespace URI
*/
public final String getNamespace()
{
return namespace;
}
public final void setNamespace(String ns)
{
this.namespace = ns;
}
/**
* Get the prefix of this entity
*
* @return the prefix specified
*/
public final String getPrefix()
{
return prefix;
}
public final void setPrefix(String pf)
{
this.prefix = pf;
}
public final String getPreferedPrefix()
{
return preferedPrefix;
}
protected void addSimpleProperty(String propertyName, Object value)
{
TypeMapping tm = getMetadata().getTypeMapping();
AbstractSimpleProperty asp = tm.instanciateSimpleField(getClass(), null, getPrefix(), propertyName, value);
addProperty(asp);
}
protected String getPropertyValueAsString(String fieldName)
{
AbstractSimpleProperty absProp = (AbstractSimpleProperty) getProperty(fieldName);
if (absProp == null)
{
return null;
}
else
{
return absProp.getStringValue();
}
}
protected Calendar getDatePropertyAsCalendar(String fieldName)
{
DateType absProp = (DateType) getFirstEquivalentProperty(fieldName, DateType.class);
if (absProp != null)
{
return absProp.getValue();
}
else
{
return null;
}
}
public TextType createTextType(String propertyName, String value)
{
return getMetadata().getTypeMapping().createText(getNamespace(), getPrefix(), propertyName, value);
}
public ArrayProperty createArrayProperty(String propertyName, Cardinality type)
{
return getMetadata().getTypeMapping().createArrayProperty(getNamespace(), getPrefix(), propertyName, type);
}
}