diff --git a/source/java/org/alfresco/repo/content/AbstractContentReader.java b/source/java/org/alfresco/repo/content/AbstractContentReader.java index 3081b636b5..f9c74d4b08 100644 --- a/source/java/org/alfresco/repo/content/AbstractContentReader.java +++ b/source/java/org/alfresco/repo/content/AbstractContentReader.java @@ -400,10 +400,9 @@ public abstract class AbstractContentReader extends AbstractContentAccessor impl } // read it all, if possible int count = reader.read(buffer, 0, length); - // there may have been fewer characters - create a new string - String result = new String(buffer, 0, count); - // done - return result; + + // there may have been fewer characters - create a new string as the result + return (count != -1 ? new String(buffer, 0, count) : ""); } catch (IOException e) { diff --git a/source/java/org/alfresco/repo/content/MimetypeMap.java b/source/java/org/alfresco/repo/content/MimetypeMap.java index c198ef38f7..de5220967e 100644 --- a/source/java/org/alfresco/repo/content/MimetypeMap.java +++ b/source/java/org/alfresco/repo/content/MimetypeMap.java @@ -65,6 +65,7 @@ public class MimetypeMap implements MimetypeService public static final String MIMETYPE_IMAGE_JPEG = "image/jpeg"; public static final String MIMETYPE_IMAGE_RGB = "image/x-rgb"; public static final String MIMETYPE_IMAGE_SVG = "image/svg"; + public static final String MIMETYPE_IMAGE_PNG = "image/png"; public static final String MIMETYPE_JAVASCRIPT = "application/x-javascript"; public static final String MIMETYPE_ZIP = "application/zip"; public static final String MIMETYPE_OPENSEARCH_DESCRIPTION = "application/opensearchdescription+xml"; diff --git a/source/java/org/alfresco/repo/template/CropContentMethod.java b/source/java/org/alfresco/repo/template/CropContentMethod.java new file mode 100644 index 0000000000..6e0eda4f8f --- /dev/null +++ b/source/java/org/alfresco/repo/template/CropContentMethod.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing + */ +package org.alfresco.repo.template; + +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.service.cmr.repository.TemplateNode; +import org.alfresco.service.cmr.repository.TemplateNode.TemplateContentData; + +import freemarker.ext.beans.BeanModel; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateNumberModel; + +/** + * @author Kevin Roast + * + * FreeMarker custom method to return the first N characters of a content stream. + *

+ * Usage: String cropContent(TemplateContentData content, int length) + */ +public final class CropContentMethod implements TemplateMethodModelEx +{ + /** + * @see freemarker.template.TemplateMethodModel#exec(java.util.List) + */ + public Object exec(List args) throws TemplateModelException + { + String result = null; + + if (args.size() == 2) + { + Object arg0 = args.get(0); + Object arg1 = args.get(1); + + if (arg0 instanceof BeanModel && arg1 instanceof TemplateNumberModel) + { + Object wrapped = ((BeanModel)arg0).getWrappedObject(); + if (wrapped instanceof TemplateContentData) + { + int bytes = ((TemplateNumberModel)arg1).getAsNumber().intValue(); + + result = ((TemplateContentData)wrapped).getContentAsText(bytes); + } + } + } + + return result != null ? result : ""; + } +} diff --git a/source/java/org/alfresco/service/cmr/repository/TemplateNode.java b/source/java/org/alfresco/service/cmr/repository/TemplateNode.java index ce2d5374a8..3e09d4b700 100644 --- a/source/java/org/alfresco/service/cmr/repository/TemplateNode.java +++ b/source/java/org/alfresco/service/cmr/repository/TemplateNode.java @@ -36,6 +36,8 @@ import java.util.Map; import java.util.Set; import org.alfresco.model.ContentModel; +import org.alfresco.repo.action.executer.TransformActionExecuter; +import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.template.LuceneSearchResultsMap; import org.alfresco.repo.template.NamePathResultsMap; @@ -793,6 +795,64 @@ public class TemplateNode implements Serializable return (reader != null && reader.exists()) ? reader.getContentString() : ""; } + /** + * @return the content stream to the specified maximum length in characters + */ + public String getContent(int length) + { + ContentService contentService = services.getContentService(); + ContentReader reader = contentService.getReader(nodeRef, property); + + return (reader != null && reader.exists()) ? reader.getContentString(length) : ""; + } + + /** + * @param length Length of the character stream to return, or -1 for all + * + * @return the binary content stream converted to text using any available transformer + * if fails to convert then null will be returned + */ + public String getContentAsText(int length) + { + String result = null; + + if (MimetypeMap.MIMETYPE_TEXT_PLAIN.equals(mimetype)) + { + result = getContent(length); + } + else + { + // get the content reader + ContentService contentService = services.getContentService(); + ContentReader reader = contentService.getReader(nodeRef, property); + + // get the writer and set it up for text convert + ContentWriter writer = contentService.getWriter(null, ContentModel.PROP_CONTENT, true); + writer.setMimetype("text/plain"); + writer.setEncoding(reader.getEncoding()); + + // try and transform the content + if (contentService.isTransformable(reader, writer)) + { + contentService.transform(reader, writer); + + ContentReader resultReader = writer.getReader(); + if (resultReader != null && reader.exists()) + { + if (length != -1) + { + result = resultReader.getContentString(length); + } + else + { + result = resultReader.getContentString(); + } + } + } + } + return result; + } + /** * @return */