Package org.nodeclipse.ui.contentassist

Source Code of org.nodeclipse.ui.contentassist.ContentFromOrionIndexFiles

package org.nodeclipse.ui.contentassist;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;

/**
* Using Orion IndexFiles for libraries for content assist</br>
* This is logic class without Eclipse API dependencies. Just run it as Java App
<pre>
express={
  "!define": {
    "response": {
      "send": {"!type": "fn(body: String) -> response"},
      "get": {"!type": "fn(field: String) -> String"},
      "location": {"!type": "fn(url: String) -> response"},
      "status": {"!type": "fn(code: Number) -> response"},
      "set": {"!type": "fn(field: Object, val: String) -> response"},
      "links": {"!type": "fn(links: Object) -> response"},
      "download": {"!type": "fn(path: String, filename: String, fn: fn())"}, *
</pre>
* @author Paul Verest
* @since 0.12
*/
public class ContentFromOrionIndexFiles // implements IModelFiller
{
  private static boolean verbose = true;
  private static int errorCounter = 0;
  private static Model model = null;

  /*
   * Run this As Java Application to check .indexFiles
   *
   * Reading Libraries IndexFiles finished in 40 ms. errorCounter=2
   * */
  public static void main(String[] args) {
    model = new Model();
    initModel(model);
    //code example from https://github.com/demodays/bjdd/issues/1
//    model.processWith(new EntryProcessor(){
//      entry -> System.out.println(entry.toFullString());
//    }
    model.processWith(new EntryProcessor(){
      @Override
      public void process(Entry entry) {
        System.out.println(entry.toFullString());
      }     
    });
  }
 
  //@Override
  public static void initModel(Model model) {
    long startTime = System.currentTimeMillis(); //nanoTime();
    addIndexFile(model, "amqp");
//    addIndexFile(model, "browser");
//    addIndexFile(model, "ecma5");
    addIndexFile(model, "express");
    addIndexFile(model, "mongodb");
    addIndexFile(model, "mysql");
//    addIndexFile(model, "node");
    addIndexFile(model, "postgres");
    addIndexFile(model, "redis");
   
    long time = System.currentTimeMillis() - startTime;   
    log("Reading Libraries IndexFiles finished in "+time+" ms. errorCounter="+errorCounter);
  }

  // see analog ContentFromSources.populateModel()
  private static boolean addIndexFile(Model model, String libname) {
    JSONObject libraryIndex = jsonForLibrary(libname);
    if (libraryIndex == null){
      return false;
    }
    try {
      String moduleName = libraryIndex.getString("!name");
      debug(", " + moduleName);
      Module moduleObj = new Module(moduleName);
      model.addModule(moduleObj);
     
      JSONObject module = (JSONObject) libraryIndex.get("!define");
      if (verbose) debug("(("+module.length()+")):");
     
      //DONE add moduleDesc as list of higher level objects
      String moduleDesc = formatedName(moduleName)+module.names();
      Entry moduleEntry = new Entry(moduleObj,EntryType.module,moduleName,moduleName,moduleDesc,null);
      model.addEntry(moduleEntry)
     
      if (verbose) debug("\n    Model size="+model.entries.size());
     
//          "response": {
//          "send": {"!type": "fn(body: String) -> response"},
     
      Iterator keysIterator = module.keys();
        while (keysIterator.hasNext()){
          String key = keysIterator.next().toString();
          JSONObject obj = (JSONObject) module.get(key);
          if (verbose) debug("\n"+key+"("+obj.length()+"):");
         
          String trigger = moduleName+'.'+key;
        String name = key;
        String desc = formatedName(name,trigger);
        //read !proto, !type to make desc
        String proto = obj.optString("!proto");
        if (""!=proto){ desc+="prototype:"+proto+' ';}
        String type = obj.optString("!type");
        if (""!=type){ desc+="type:"+type+' ';}
       
        Entry entry = new Entry(moduleObj,EntryType.unknown,name,trigger,desc,moduleEntry);
        model.addEntry(entry);
       
        // obj may have other objects inside
        populateCheckObj(model, obj, name, moduleObj, entry);
         
        if (verbose) debug("\n    Model size="+model.entries.size());
        }
        if (verbose) debug(";\n");
           
     
    } catch (ClassCastException e) {
      errorCounter++;
      error(e.getLocalizedMessage() + "\n" + e + "\n");
    } catch (JSONException e) {
      errorCounter++;
      error(e.getLocalizedMessage() + "\n" + e + "\n");
    }

    return true;
  }
 
  public static boolean checkProperties = true;
 
  private static void populateCheckObj(Model model, JSONObject obj, String word, Module moduleObj, Entry parent) throws JSONException {
    if (!checkProperties){
      return;
    }
   
    Iterator keysIterator = obj.keys();
      while (keysIterator.hasNext()){
        String key = keysIterator.next().toString();
        if (verbose) debug(key+'`');
        if (key.equals("!proto")||key.equals("!type")) {
          continue;
        }
        //JSONObject objEement = (JSONObject) obj.get(key);
        Object objEementObject = obj.get(key);
        JSONObject objEement = null;
       
        String trigger = word+'.'+key;
        String name = key;
        String desc = formatedName(name,trigger);
       
        if (objEementObject instanceof String ){
//            "express": {
//              "response": "response",
        } else{
          objEement = (JSONObject) objEementObject;
        //read !proto, !type to make desc
        String proto = objEement.optString("!proto");
        if (""!=proto){ desc+="prototype:"+proto+' ';}
        String type = objEement.optString("!type");
        if (""!=type){ desc+="type:"+type+' ';}
        }
     
      Entry entry = new Entry(moduleObj,EntryType.unknown,name,trigger,desc,parent);
      model.addEntry(entry);
      }
   
  } 
 
  private static String formatedName(String name) {
    return "<b>"+name+"</b><br/>";
  }
  private static String formatedName(String name, String trigger) {
    return formatedName(name)+"<code>"+trigger+"</code><br/>";
  }
 
  private static JSONObject jsonForLibrary(String libname){
    if (libname==null || libname.length()==0)
      return null;
    String filename = "org/nodeclipse/ui/contentassist/indexFiles/"+libname+"Index.js";
    JSONObject libraryIndex = null;
        try {
            InputStream is = ContentFromSources.class.getClassLoader().getResourceAsStream(filename);
            String index = inputStream2StringWithJson(is);
            libraryIndex = new JSONObject(index);
            if (verbose) debug( libname+'='+ libraryIndex.toString(2)+'\n');
        } catch (JSONException e) {
          errorCounter++;
          error("error "+errorCounter+" in "+libname+": "+ e.getLocalizedMessage()+"\n");
        } catch (IOException e) {
          error(e.getLocalizedMessage()+"\n");
        }
    return libraryIndex;
  }
 
    private static String inputStream2StringWithJson(InputStream is) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        StringBuilder buffer = new StringBuilder();
        String line = "";
        boolean isJsonStarted = false;
        while ((line = in.readLine()) != null) {
          if (!isJsonStarted){ //skipping header
            if (!line.contains("return")){
              continue;
            }
            isJsonStarted = true;
            buffer.append("{");
            continue;
          }
            buffer.append(line);
        }
        return buffer.toString();
    }
 
 
    private static void error(String s){
      //NodeclipseConsole.write(s);
      System.err.print(s);
    }
    private static void debug(String s){
      //NodeclipseConsole.write(s);
      System.out.print(s);
    }
    private static void log(String s){
      //NodeclipseConsole.write(s);
      System.out.print(s);
    }

}
TOP

Related Classes of org.nodeclipse.ui.contentassist.ContentFromOrionIndexFiles

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.