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.io.IOException;
018import java.util.ArrayList;
019import java.util.List;
020
021import org.nuxeo.ecm.core.api.Blob;
022
023import freemarker.template.AdapterTemplateModel;
024import freemarker.template.SimpleNumber;
025import freemarker.template.SimpleScalar;
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 BlobTemplate extends PropertyWrapper implements TemplateHashModelEx, AdapterTemplateModel {
035
036    protected static final String[] keys = { "filename", "data", "length", "mimeType", "encoding", "digest" };
037
038    protected final Blob blob;
039
040    public BlobTemplate(DocumentObjectWrapper wrapper, Blob blob) {
041        super(wrapper);
042        this.blob = blob;
043    }
044
045    @SuppressWarnings("rawtypes")
046    @Override
047    public Object getAdaptedObject(Class hint) {
048        return blob;
049    }
050
051    @Override
052    public TemplateCollectionModel keys() throws TemplateModelException {
053        return (TemplateCollectionModel) wrapper.wrap(keys);
054    }
055
056    @Override
057    public int size() throws TemplateModelException {
058        return keys.length;
059    }
060
061    @Override
062    public TemplateCollectionModel values() throws TemplateModelException {
063        try {
064            List<Object> list = new ArrayList<Object>(keys.length);
065            if (blob != null) {
066                list.add(blob.getFilename());
067                list.add(blob.getString());
068                list.add(blob.getLength());
069                list.add(blob.getMimeType());
070                list.add(blob.getEncoding());
071                list.add(blob.getDigest());
072            } else {
073                list.add("");
074                list.add("");
075                list.add("");
076                list.add("");
077                list.add("");
078                list.add("");
079            }
080            return (TemplateCollectionModel) wrapper.wrap(list);
081        } catch (IOException e) {
082            throw new TemplateModelException("Failed to adapt complex property values", e);
083        }
084    }
085
086    @Override
087    public TemplateModel get(String name) throws TemplateModelException {
088        try {
089            if (blob != null) {
090                if (keys[0].equals(name)) {
091                    return new SimpleScalar(blob.getFilename());
092                } else if (keys[1].equals(name)) {
093                    return new SimpleScalar(blob.getString());
094                } else if (keys[2].equals(name)) {
095                    return new SimpleNumber(blob.getLength());
096                } else if (keys[3].equals(name)) {
097                    return new SimpleScalar(blob.getMimeType());
098                } else if (keys[4].equals(name)) {
099                    return new SimpleScalar(blob.getEncoding());
100                } else if (keys[5].equals(name)) {
101                    return new SimpleScalar(blob.getDigest());
102                }
103            }
104            return NOTHING;
105        } catch (IOException e) {
106            throw new TemplateModelException(e);
107        }
108    }
109
110    @Override
111    public boolean isEmpty() throws TemplateModelException {
112        return false;
113    }
114
115}