Package juzu.impl.template.spi.juzu.dialect.gtmpl

Source Code of juzu.impl.template.spi.juzu.dialect.gtmpl.GroovyPrinter

/*
* Copyright 2013 eXo Platform SAS
*
* 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 juzu.impl.template.spi.juzu.dialect.gtmpl;

import groovy.lang.GString;
import groovy.lang.GroovyInterceptable;
import groovy.lang.GroovyObjectSupport;
import juzu.io.Chunk;
import juzu.template.TemplateRenderContext;
import org.codehaus.groovy.runtime.InvokerInvocationException;

import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

/** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */
public class GroovyPrinter extends GroovyObjectSupport implements GroovyInterceptable {

  /** . */
  final TemplateRenderContext renderContext;

  public GroovyPrinter(TemplateRenderContext renderContext) throws NullPointerException {
    if (renderContext == null) {
      throw new NullPointerException("No null render context accepted");
    }

    //
    this.renderContext = renderContext;
  }

  /**
   * Optimize the call to the various print methods.
   *
   * @param name the method name
   * @param args the method arguments
   * @return the return value
   */
  @Override
  public Object invokeMethod(String name, Object args) {
    // Optimize access to print methods
    if (args instanceof Object[]) {
      Object[] array = (Object[])args;
      if (array.length == 1) {
        try {
          if ("print".equals(name)) {
            print(array[0]);
            return null;
          }
          else if ("println".equals(name)) {
            println(array[0]);
            return null;
          }
        }
        catch (IOException e) {
          throw new InvokerInvocationException(e);
        }
      }
    }

    // Back to Groovy method call
    return super.invokeMethod(name, args);
  }

  public final void println(Object o) throws IOException {
    print(o);
    println();
  }

  public final void println() throws IOException {
    renderContext.getPrinter().provide(Chunk.create("\n"));
  }

  /**
   * We handle in this method a conversion of an object to another one for formatting purposes.
   *
   * @param o the object to format
   * @return the formatted object
   */
  private Object format(Object o) {
    if (o instanceof Date) {
      Locale locale = renderContext.getLocale();
      if (locale != null) {
        DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
        o = dateFormat.format((Date)o);
      }
    } else if (o instanceof MessageKey) {
      MessageKey key = (MessageKey)o;
      o = renderContext.resolveMessage(key);
    }

    //
    return o;
  }

  private String toString(Object o) {
    Object f = format(o);
    if (f == null) {
      return "null";
    }
    else if (f instanceof String) {
      return (String)f;
    }
    else {
      return o.toString();
    }
  }

  public final void print(Object o) throws IOException {
    if (o instanceof GString) {
      GString gs = (GString)o;
      Object[] values = gs.getValues();
      for (int i = 0;i < values.length;i++) {
        values[i] = format(values[i]);
      }
      renderContext.getPrinter().provide(Chunk.create(o.toString()));
    }
    else {
      renderContext.getPrinter().provide(Chunk.create(toString(o)));
    }
  }
}
TOP

Related Classes of juzu.impl.template.spi.juzu.dialect.gtmpl.GroovyPrinter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.