Mapping Atomic Fields
The field-descriptor maps a bean attribute based on a Java primitive
type into a JCR property. By default, the persistence manager uses
the correct mapping in function of the attribute type (see below
the section “Supported Types”).
Based on our model defined here, the following field-descriptor maps the bean field “title” (String type) into the JCR property “my:title”.
Supported Types
It is not necessary to specify the type in the field-descriptor.
The Persistence Manager uses the java introspection to get
information on each atomic field.
Java Type | Jcr Type |
---|---|
String | STRING |
Boolean, boolean | BOOLEAN |
Double, double | DOUBLE |
Integer, int | DOUBLE |
Long, long | LONG |
byte\[\](\.html) | BINARY |
java.io.InputStream | BINARY |
java.util.Calendar | LONG (corresponding to Calendar.getTimeInMillis() |
java.sql.Timestamp | LONG (corresponding to Timestamp.getTime() |
java.util.Date | LONG (corresponding to java.util.Date.getTime() |
Due to some issues with Jackrabbit (mainly with xpath queries),
Calendar, Timestamp and date are converted into JCR LONG. We plan
to add other converters for those types in the next release.
Using Another Atomic Type Converter
The OCM framework gives you the freedom to choose another kind of
mapping for atomic fields. For example, you can convert
java.util.Date bean field into a JCR Date type instead of a JCR
Long type. This can be done by writing your own atomic type
converter class.
Let's start with a simple example. If you want to use a mapping
strategy which convert a boolean bean field into a JCR Long type,
you have to make the following steps:
Specify the converter class in the field descriptor
<class-descriptor
className="org.apache.jackrabbit.ocm.testmodel.Atomic"
jcrType="nt:unstructured">
<field-descriptor
fieldName="int2boolean"
jcrName="int2boolean"
converter="org.apache.jackrabbit.ocm.persistence.atomic.Int2BooleanTypeConverterImpl"
/>
</class-descriptor>
Implement the converter class
Use the interface org.apache.jackrabbit.ocm.persistence.atomic.AtomicTypeConverter
package org.apache.jackrabbit.ocm.persistence.atomic;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import org.apache.jackrabbit.ocm.exception.IncorrectAtomicTypeException;
import org.apache.jackrabbit.ocm.persistence.atomictypeconverter.AtomicTypeConverter;
/**
* This is a simple converter which convert a boolean field value into a jcr long property.
*
* @author <a href="mailto:christophe.lombart@gmail.com">Christophe Lombart</a>
*/
public class Int2BooleanTypeConverterImpl implements AtomicTypeConverter
{
/**
*
* @see org.apache.jackrabbit.ocm.persistence.atomictypeconverter.AtomicTypeConverter#getValue(java.lang.Object)
*/
public Value getValue(ValueFactory valueFactory, Object propValue)
{
if (propValue == null)
{
return null;
}
boolean value = ((Boolean) propValue).booleanValue();
int jcrValue = 0;
if (value)
{
jcrValue = 1;
}
return valueFactory.createValue(jcrValue);
}
/**
*
* @see org.apache.jackrabbit.ocm.persistence.atomictypeconverter.AtomicTypeConverter#getObject(javax.jcr.Value)
*/
public Object getObject(Value value)
{
try
{
long jcrValue = value.getLong();
if (jcrValue == 1)
{
return new Boolean(true);
}
else
{
return new Boolean(false);
}
}
catch (Exception e)
{
throw new IncorrectAtomicTypeException("Impossible to convert the value : " + value.toString() , e);
}
}
/**
*
* @see org.apache.jackrabbit.ocm.persistence.atomictypeconverter.AtomicTypeConverter#getStringValue(java.lang.Object)
*/
public String getStringValue(Object object)
{
return ((Boolean) object).booleanValue() ? "1" : "0";
}
}