Package cn.bran.japid.rendererloader

Source Code of cn.bran.japid.rendererloader.NameEnv

/**
*
*/
package cn.bran.japid.rendererloader;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;

import cn.bran.japid.template.JapidRenderer;
import cn.bran.japid.util.JapidFlags;
import cn.bran.japid.util.StringUtils;

/**
* @author bran
*
*/
final class NameEnv implements INameEnvironment {

  private Map<String, Boolean> packagesCache = new HashMap<String, Boolean>();
  private TemplateClassLoader crlr;

  /**
   * @param rendererCompiler
   */
  NameEnv(TemplateClassLoader ldr) {
    this.crlr = ldr;
  }

  @Override
  public NameEnvironmentAnswer findType(final char[][] compoundTypeName) {
    return findType(StringUtils.join(compoundTypeName, "."));
  }

  @Override
  public NameEnvironmentAnswer findType(final char[] typeName, final char[][] packageName) {
    return findType(StringUtils.join(packageName, ".") + "." + new String(typeName));
  }

  private NameEnvironmentAnswer findType(final String name) {
    char[] fileName = name.toCharArray();

    try {
      if (!name.startsWith("japidviews.")) {
        // let super class loader to load the bytecode
        byte[] bytes = crlr.getClassDefinition(name);
        if (bytes != null) {
          // System.out.println("japid: byecode found: " + name);
          return new NameEnvironmentAnswer(new ClassFileReader(bytes, fileName, true), null);
        } else {
          // System.out.println("japid: bytes not found: " + name);
        }
      } else { // japidviews
        RendererClass applicationClass = JapidRenderer.japidClasses.get(name); // I don't like this XXX

        // ApplicationClass exists
        if (applicationClass != null) {

          byte[] bytecode = applicationClass.getBytecode();
          if (bytecode != null) {
            return new NameEnvironmentAnswer(new ClassFileReader(bytecode, fileName, true), null);
          } else
            // Cascade compilation
            return new NameEnvironmentAnswer(new CompilationUnit(name), null);
        }
      }
      return null;
    } catch (ClassFormatException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  public boolean isPackage(char[][] parentPackageName, char[] packageName) {
    String name = StringUtils.join(parentPackageName, ".") + "." + new String(packageName);
    if (packagesCache.containsKey(name)) {
      return packagesCache.get(name).booleanValue();
    }
    // Check if there is a .java or .class for this resource
    if (crlr.getClassDefinition(name) != null) {
      packagesCache.put(name, false);
      return false;
    }
    if (JapidRenderer.japidClasses.get(name) != null) {
      packagesCache.put(name, false);
      return false;
    }
    packagesCache.put(name, true);
    return true;
  }

  @Override
  public void cleanup() {
  }
}
TOP

Related Classes of cn.bran.japid.rendererloader.NameEnv

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.