All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unidal.script.java.JavaSourceFromString Maven / Gradle / Ivy

The newest version!
package org.unidal.script.java;

import java.io.File;
import java.net.URI;

import javax.tools.SimpleJavaFileObject;

class JavaSourceFromString extends SimpleJavaFileObject {
   private static URI FAKE = URI.create("fake:///nothing");

   private File m_baseDir;

   private String m_className;

   private CharSequence m_code;

   private int m_lineOffset;

   private String m_methodName;

   private URI m_uri;

   private String m_packageName;

   private String m_uriPath;

   JavaSourceFromString(File baseDir, String code) {
      super(FAKE, Kind.SOURCE);
      m_baseDir = baseDir;
      m_className = "$JavaFragment$" + Math.abs(code.hashCode());
      m_code = normalize(code);
      m_uriPath = buildUriPath();
      m_uri = URI.create("fragment:///" + m_uriPath + ".java");
   }

   private String buildUriPath() {
      StringBuilder sb = new StringBuilder(64);

      if (m_packageName != null) {
         sb.append(m_packageName.replace('.', '/'));
         sb.append('/');
      }

      sb.append(m_className);

      return sb.toString();
   }

   @Override
   public CharSequence getCharContent(boolean ignoreEncodingErrors) {
      return m_code;
   }

   public File getClassFile() {
      return new File(m_baseDir, m_uriPath + ".class");
   }

   public String getClassName() {
      if (m_packageName == null) {
         return m_className;
      } else {
         return m_packageName + '.' + m_className;
      }
   }

   public int getLineOffset() {
      return m_lineOffset;
   }

   public String getMethodName() {
      return m_methodName;
   }

   public boolean isFragment() {
      return m_lineOffset > 0;
   }

   private CharSequence normalize(String code) {
      // a whole java source file
      if (code.startsWith("package ")) {
         return normalizeForClassWithPackage(code);
      } else if (code.indexOf("public class ") >= 0) {
         return normalizeForClass(code);
      } else {
         return normalizeForFragment(code);
      }
   }

   private CharSequence normalizeForClass(String code) {
      String token = " class ";
      int pos1 = code.indexOf(token);
      int len = token.length();
      int pos2 = code.indexOf(' ', pos1 + len);

      if (pos1 > 0 && pos2 > pos1) {
         m_className = code.substring(pos1 + len, pos2);
      }

      return code;
   }

   private CharSequence normalizeForClassWithPackage(String code) {
      int off = code.indexOf(';');
      String token = " class ";
      int pos1 = code.indexOf(token);
      int len = token.length();
      int pos2 = code.indexOf(' ', pos1 + len);

      if (off >= 0) {
         m_packageName = code.substring("package ".length(), off);
      }

      if (pos1 > 0 && pos2 > pos1) {
         m_className = code.substring(pos1 + len, pos2);
      }

      return code;
   }

   private CharSequence normalizeForFragment(String code) {
      StringBuilder sb = new StringBuilder(code.length() + 64);

      if (code.startsWith("public ")) {
         sb.append("public class ").append(m_className).append(" {\r\n");
         sb.append(code).append("\r\n");
         sb.append("}\r\n");

         m_lineOffset = 1;
      } else {
         sb.append("public class ").append(m_className).append(" {\r\n");
         sb.append("   public static void fragment() {\r\n");
         sb.append(code).append("\r\n");
         sb.append("   }\r\n");
         sb.append("}\r\n");

         m_methodName = "fragment";
         m_lineOffset = 2;
      }

      return sb.toString();
   }

   @Override
   public URI toUri() {
      return m_uri;
   }

   @Override
   public String toString() {
      return m_uri.toString();
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy