/** * jetbrick-template * http://subchen.github.io/jetbrick-template/ * * Copyright 2010-2014 Guoqiang Chen. All rights reserved. * Email: subchen@gmail.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrick.template.runtime; import java.io.UnsupportedEncodingException; import java.lang.reflect.Array; import java.util.*; import jetbrick.template.JetContext; import jetbrick.template.JetTemplate; import jetbrick.template.resource.Resource; import jetbrick.template.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class JetUtils { private static final Logger log = LoggerFactory.getLogger(JetUtils.class); public static boolean asBoolean(Object value) { if (value == null) return false; Class<?> klass = value.getClass(); if (Boolean.class.equals(klass)) return (Boolean) value; if (value instanceof Collection) return !((Collection<?>) value).isEmpty(); if (value instanceof Map) return !((Map<?, ?>) value).isEmpty(); if (value instanceof CharSequence) return ((CharSequence) value).length() > 0; if (value instanceof Number) return ((Number) value).intValue() != 0; if (klass.isArray()) return Array.getLength(value) > 0; if (value instanceof Character) return ((Character) value) != '\0'; if (value instanceof Enumeration) return ((Enumeration<?>) value).hasMoreElements(); if (value instanceof Iterator) return ((Iterator<?>) value).hasNext(); if (value instanceof Iterable) return ((Iterable<?>) value).iterator().hasNext(); return true; } /** * @deprecated From 1.1.3 改为 JetForIterator 内部实现. */ @SuppressWarnings("rawtypes") public static Iterator<?> asIterator(Object value) { return new JetForIterator(value); } /** * 返回一个 Map。类似于 Arrays.asList(...)。 * * <p>注意:这里必须去掉泛型类型,使用 rawtypes, 防止生成的模板出现编译错误。</p> */ @SuppressWarnings("rawtypes") public static Map asMap(Object... values) { if (values == null || values.length == 0) { return Collections.emptyMap(); } if (values.length % 2 == 1) { throw new IllegalArgumentException("Mismatched arguments count."); } Map<Object, Object> map = new HashMap<Object, Object>(values.length); for (int i = 0; i < values.length; i += 2) { map.put(values[i], values[i + 1]); } return map; } public static byte[] asBytes(String value, String encoding) { try { return value.getBytes(encoding); } catch (UnsupportedEncodingException e) { throw ExceptionUtils.uncheck(e); } } public static boolean asEquals(Object obj1, Object obj2) { if (obj1 == obj2) return true; if (obj1 == null || obj2 == null) return false; if (obj1 instanceof Number && obj2 instanceof Number) { return ((Number) obj1).doubleValue() == ((Number) obj2).doubleValue(); } return obj1.equals(obj2); } public static boolean asNotEquals(Object obj1, Object obj2) { return !asEquals(obj1, obj2); } @SuppressWarnings("unchecked") public static int asCompareWith(Object lhs, Object rhs) { if (lhs == rhs) return 0; // null compare if (lhs == null) return -1; if (rhs == null) return 1; // numeric compare if (Character.class.equals(lhs)) { lhs = Integer.valueOf(((Character) lhs).charValue()); } if (Character.class.equals(rhs)) { rhs = Integer.valueOf(((Character) rhs).charValue()); } if (lhs instanceof Number && rhs instanceof Number) { return (int) (((Number) lhs).doubleValue() - ((Number) rhs).doubleValue()); } // object compare if (lhs instanceof Comparable) { return ((Comparable<Object>) lhs).compareTo(rhs); } throw new ClassCastException(lhs.getClass().getName() + " cannot be cast to java.util.Comparable"); } public static String asEscapeHtml(String value) { return StringEscapeUtils.escapeXml(value); } // render 子模板,并直接输出 public static void asInclude(JetPageContext ctx, String relativeName, Map<String, Object> parameters) { if (relativeName == null || relativeName.length() == 0) { throw new IllegalArgumentException("argument relativeName is null or empty."); } String file = ctx.getAbsolutionName(relativeName); JetTemplate template = ctx.getEngine().getTemplate(file); JetContext context = new JetContext(ctx.getContext(), parameters); JetWriter writer = ctx.getWriter(); template.render(context, writer); } // render 子模板,并返回生成的内容 public static String asIncludeContent(JetPageContext ctx, String relativeName, Map<String, Object> parameters) { if (relativeName == null || relativeName.length() == 0) { throw new IllegalArgumentException("argument relativeName is null or empty."); } String file = ctx.getAbsolutionName(relativeName); JetTemplate template = ctx.getEngine().getTemplate(file); JetContext context = new JetContext(ctx.getContext(), parameters); UnsafeCharArrayWriter os = new UnsafeCharArrayWriter(); template.render(context, os); return os.toString(); } // 读取纯文本内容 public static String asReadContent(JetPageContext ctx, String relativeName, String encoding) { if (relativeName == null || relativeName.length() == 0) { throw new IllegalArgumentException("argument relativeName is null or empty."); } String file = ctx.getAbsolutionName(relativeName); Resource resource = ctx.getEngine().getResource(file); if (encoding == null) { encoding = ctx.getEngine().getConfig().getOutputEncoding(); } return new String(resource.getSource(encoding)); } public static void debug(String format, Object... args) { if (log.isDebugEnabled()) { format = "template debug: " + format; log.debug(format, args); } } }