001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     bstefanescu
011 *
012 * $Id$
013 */
014
015package org.nuxeo.ecm.platform.rendering.fm.adapters;
016
017import java.util.ArrayList;
018import java.util.List;
019
020import org.nuxeo.ecm.core.api.PropertyException;
021import org.nuxeo.ecm.core.api.model.Property;
022
023import freemarker.core.CollectionAndSequence;
024import freemarker.template.AdapterTemplateModel;
025import freemarker.template.SimpleSequence;
026import freemarker.template.TemplateCollectionModel;
027import freemarker.template.TemplateHashModelEx;
028import freemarker.template.TemplateModel;
029import freemarker.template.TemplateModelException;
030
031/**
032 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
033 */
034public class ComplexPropertyTemplate extends PropertyWrapper implements TemplateHashModelEx, AdapterTemplateModel {
035
036    protected final Property property;
037
038    public ComplexPropertyTemplate(DocumentObjectWrapper wrapper, Property property) {
039        super(wrapper);
040        this.property = property;
041    }
042
043    @Override
044    @SuppressWarnings("rawtypes")
045    public Object getAdaptedObject(Class hint) {
046        return property;
047    }
048
049    @Override
050    public TemplateCollectionModel keys() throws TemplateModelException {
051        List<String> list = new ArrayList<String>(property.size());
052        for (Property p : property.getChildren()) {
053            list.add(p.getName());
054        }
055        return new CollectionAndSequence(new SimpleSequence(list, wrapper));
056    }
057
058    @Override
059    public int size() throws TemplateModelException {
060        return property.size();
061    }
062
063    @Override
064    public TemplateCollectionModel values() throws TemplateModelException {
065        try {
066            List<Object> list = new ArrayList<Object>(property.size());
067            for (Property p : property.getChildren()) {
068                Object value = p.getValue();
069                list.add(value == null ? "" : value);
070            }
071            return new CollectionAndSequence(new SimpleSequence(list, wrapper));
072        } catch (PropertyException e) {
073            throw new TemplateModelException("Failed to adapt complex property values", e);
074        }
075    }
076
077    @Override
078    public TemplateModel get(String name) throws TemplateModelException {
079        try {
080            Property p = property.get(name);
081            return wrap(p);
082        } catch (PropertyException e) {
083            throw new TemplateModelException(e);
084        }
085    }
086
087    @Override
088    public boolean isEmpty() throws TemplateModelException {
089        return property.size() == 0;
090    }
091
092}