diff --git a/config/alfresco/template-services-context.xml b/config/alfresco/template-services-context.xml index 5492cf5b57..78262dae8a 100644 --- a/config/alfresco/template-services-context.xml +++ b/config/alfresco/template-services-context.xml @@ -155,5 +155,14 @@ cropContent + + + + shortQName + + + + + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/jscript/ScriptUtils.java b/source/java/org/alfresco/repo/jscript/ScriptUtils.java index 9b02368ddd..bbc376266b 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptUtils.java +++ b/source/java/org/alfresco/repo/jscript/ScriptUtils.java @@ -42,6 +42,8 @@ import org.alfresco.util.ISO8601DateFormat; */ public final class ScriptUtils extends BaseScopableProcessorExtension { + private final static String NAMESPACE_BEGIN = "" + QName.NAMESPACE_BEGIN; + /** Services */ private ServiceRegistry services; @@ -147,4 +149,37 @@ public final class ScriptUtils extends BaseScopableProcessorExtension { return ISO8601DateFormat.parse(isoDateString); } + + /** + * Given a long-form QName string, this method uses the namespace service to create a + * short-form QName string. + * + * @param s Fully qualified QName string + * @return the short form of the QName string, e.g. "cm:content" + */ + public String shortQName(String s) + { + return createQName(s).toPrefixString(services.getNamespaceService()); + } + + /** + * Helper to create a QName from either a fully qualified or short-name QName string + * + * @param s Fully qualified or short-name QName string + * + * @return QName + */ + private QName createQName(String s) + { + QName qname; + if (s.indexOf(NAMESPACE_BEGIN) != -1) + { + qname = QName.createQName(s); + } + else + { + qname = QName.createQName(s, this.services.getNamespaceService()); + } + return qname; + } } diff --git a/source/java/org/alfresco/repo/template/ShortQNameMethod.java b/source/java/org/alfresco/repo/template/ShortQNameMethod.java new file mode 100644 index 0000000000..97744c34e4 --- /dev/null +++ b/source/java/org/alfresco/repo/template/ShortQNameMethod.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2005-2009 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.repo.processor.BaseProcessorExtension; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.namespace.QName; + +import freemarker.ext.beans.BeanModel; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateScalarModel; + +/** + * @author Mike Hatfield + * + * FreeMarker custom method to return the short (prefix) version of a QName. + *

+ * Usage: String shortQname(String longQName) + */ +public final class ShortQNameMethod extends BaseProcessorExtension implements TemplateMethodModelEx +{ + private final static String NAMESPACE_BEGIN = "" + QName.NAMESPACE_BEGIN; + + /* Repository Service Registry */ + private ServiceRegistry services; + + /** + * Set the service registry + * + * @param serviceRegistry the service registry + */ + public void setServiceRegistry(ServiceRegistry serviceRegistry) + { + this.services = serviceRegistry; + } + + /** + * @see freemarker.template.TemplateMethodModel#exec(java.util.List) + */ + public Object exec(List args) throws TemplateModelException + { + String result = null; + + if (args.size() == 1) + { + // arg 0 can be either wrapped QName object or a String + String arg0String = null; + Object arg0 = args.get(0); + if (arg0 instanceof BeanModel) + { + arg0String = ((BeanModel)arg0).getWrappedObject().toString(); + } + else if (arg0 instanceof TemplateScalarModel) + { + arg0String = ((TemplateScalarModel)arg0).getAsString(); + } + + result = createQName(arg0String).toPrefixString(services.getNamespaceService()); + } + + return result != null ? result : ""; + } + + /** + * Helper to create a QName from either a fully qualified or short-name QName string + * + * @param s Fully qualified or short-name QName string + * + * @return QName + */ + private QName createQName(String s) + { + QName qname; + if (s.indexOf(NAMESPACE_BEGIN) != -1) + { + qname = QName.createQName(s); + } + else + { + qname = QName.createQName(s, this.services.getNamespaceService()); + } + return qname; + } +}