/*
* Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* bstefanescu
*
* $Id$
*/
package org.eclipse.ecr.web.rendering.fm.adapters;
import java.util.ArrayList;
import java.util.Calendar;
import org.eclipse.ecr.core.api.Blob;
import org.eclipse.ecr.core.api.model.Property;
import org.eclipse.ecr.core.api.model.PropertyException;
import org.eclipse.ecr.core.api.model.impl.ListProperty;
import org.eclipse.ecr.core.api.model.impl.primitives.BlobProperty;
import org.eclipse.ecr.core.schema.types.primitives.DateType;
import freemarker.ext.beans.ArrayModel;
import freemarker.template.SimpleDate;
import freemarker.template.TemplateDateModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
/**
* @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
*/
public class PropertyWrapper {
protected final DocumentObjectWrapper wrapper;
public PropertyWrapper(DocumentObjectWrapper wrapper) {
this.wrapper = wrapper;
}
public TemplateModel wrap(Property property) throws TemplateModelException {
try {
if (property.isScalar()) {
Object value = property.getValue();
if (value == null) {
return TemplateModel.NOTHING;
}
if (property.getType() == DateType.INSTANCE) {
return new SimpleDate(((Calendar) value).getTime(),
TemplateDateModel.DATETIME);
}
return wrapper.wrap(value);
} else if (property.isList()) {
if (property.isContainer()) {
return new ListPropertyTemplate(wrapper,
(ListProperty) property);
} else {
Object value;
try {
value = property.getValue();
} catch (PropertyException e) {
throw new IllegalArgumentException(
"Cannot get array from array property "
+ property);
}
if (value == null) {
return TemplateModel.NOTHING;
}
if (value instanceof ArrayList) {
// FIXME: some instances of ListProperty will answer "false"
// to isContainer()
return new ListPropertyTemplate(wrapper,
(ListProperty) property);
}
return new ArrayModel(value, wrapper);
}
} else if (property.getClass() == BlobProperty.class) {
return new BlobTemplate(wrapper, (Blob) property.getValue());
} else {
return new ComplexPropertyTemplate(wrapper, property);
}
} catch (Exception e) {
throw new TemplateModelException(e);
}
}
}