Android Open Source - anode Module Utils






From Project

Back to project page anode.

License

The source code is released under:

Apache License

If you think the Android project anode listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2011-2012 Paddy Byers//  w w w . jav  a 2 s  . c o m
 *
 *   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 org.meshpoint.anode.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.security.MessageDigest;

import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.meshpoint.anode.Constants;

import android.util.Log;

public class ModuleUtils {
  private static String TAG = "anode::ModuleUtils";

  /* module types */
  public static class ModuleType {
    public int type;
    public String extension;
    public Unpacker unpacker;
    public ModuleType(int type, String extension, Unpacker unpacker) {
      this.type = type;
      this.extension = extension;
      this.unpacker = unpacker;
    }
  }
  
  public static final int TYPE_JS   = 0;
  public static final int TYPE_NODE = 1;
  public static final int TYPE_DIR  = 2;
  public static final int TYPE_ZIP  = 3;
  public static final int TYPE_TAR  = 4;
  
  private static final ModuleType[] modTypes = new ModuleType[] {
    new ModuleType(TYPE_JS,   ".js",     null),
    new ModuleType(TYPE_NODE, ".node",   null),
    new ModuleType(TYPE_DIR,  "",        null),
    new ModuleType(TYPE_ZIP,  ".zip",    new ZipExtractor()),
    new ModuleType(TYPE_TAR,  ".tar.gz", new TarExtractor()),
    new ModuleType(TYPE_TAR,  ".tgz",    new TarExtractor())
  };
  
  public interface Unpacker {
    public void unpack(File src, File dest) throws IOException;
  }
    
  /* for hashing names and tmp files */
  private static int counter = 0;
  private static final int HASH_LEN = 20;
  
  /* cache dir for tmp and downloaded resources */
  private static File resourceDir = new File(Constants.RESOURCE_DIR);
  private static File moduleDir = new File(Constants.MODULE_DIR);
  
  public static ModuleType guessModuleType(String filename) {
    /* guess by extension first */
    for(ModuleType modType : modTypes) {
      if(!modType.extension.isEmpty() && filename.endsWith(modType.extension))
        return modType;
    }
    /* if it's a local directory, then it's type DIR */
    if((new File(filename)).isDirectory())
      return modTypes[TYPE_DIR];

    return null;
  }

  public static File getModuleFile(String module, ModuleType modType) {
    if(modType.unpacker == null)
      module += modType.extension;
    return new File(moduleDir, module);
  }
  
  public static File locateModule(String module, ModuleType modType) {
    File installLocation = null, candidateLocation;
    if(modType == null) {
      for(ModuleType type : modTypes) {
        /* a small cheat, since all unpacked types here match as TYPE_DIR */
        if((candidateLocation = new File(moduleDir, module + type.extension)).exists()) {
          installLocation = candidateLocation;
          break;
        }
      }
    } else {
      candidateLocation = getModuleFile(module, modType);
      if(candidateLocation.exists())
        installLocation = candidateLocation;
    }
    return installLocation;
  }

  public static boolean deleteFile(File location) {
    boolean result = true;
    if(location.exists()) {
      if(location.isDirectory()) {
        result = deleteDir(location);
      } else {
        result = location.delete();
      }
    }
    return result;
  }

  private static boolean deleteDir(File location) {
        for (String child : location.list()) {
            boolean result = deleteFile(new File(location, child));
            if (!result) {
                return false;
            }
        }
        return location.delete();
  }

  public static boolean copyFile(File src, File dest) {
    boolean result = true;
    if(src.isDirectory()) {
      result = copyDir(src, dest);
    } else {
      try {
        int count;
        byte[] buf = new byte[1024];
        FileInputStream fis = new FileInputStream(src);             
        FileOutputStream fos = new FileOutputStream(dest);             
        while ((count = fis.read(buf, 0, 1024)) != -1)
          fos.write(buf, 0, count);
      } catch(IOException e) {
        Log.v(TAG, "moveFile exception: aborting; exception: " + e + "; src = " + src.toString() + "; dest = " + dest.toString());
        return false;
      }
    }
    return result;
  }

  private static boolean copyDir(File src, File dest) {
    dest.mkdir();
        for (String child : src.list()) {
            boolean result = copyFile(new File(src, child), new File(dest, child));
            if (!result) {
                return false;
            }
        }
        return true;
  }

  public static File unpack(File moduleResource, String moduleName, ModuleType modType) throws IOException {
    /* create temp dir to unpack; assume no hash collision */
    String tmpDirName = moduleName + '-' + String.valueOf(counter++) + "-tmp";
    File result = new File(resourceDir, tmpDirName);
    if(!result.isDirectory() && !result.mkdir())
      throw new IOException("Unable to create tmp directory to unpack: " + result.toString());
    
    if(modType.unpacker != null) {
      modType.unpacker.unpack(moduleResource, result);
    } else {
      Log.v(TAG, "ModuleUtils.unpack(): aborting (internal error)");
      result = null;
    }
    return result;
  }

  public static File getResource(URI httpUri, String filename) throws IOException {
    /* download */
    HttpClient http = new DefaultHttpClient();
    HttpGet request = new HttpGet();
    request.setURI(httpUri);
    HttpEntity entity = http.execute(request).getEntity();
    InputStream in = entity.getContent();
    File destination = new File(resourceDir, filename);
    FileOutputStream out = new FileOutputStream(destination);
    byte[] buf = new byte[1024];
    int read;
    while((read = in.read(buf)) != -1) {
      out.write(buf, 0, read);
    }
    in.close();
    out.flush();
    out.close();
    return destination;
  }
  
  public static String getResourceUriHash(String id) {
    try {
      MessageDigest sha = MessageDigest.getInstance("SHA-1");
      sha.update(id.getBytes("iso-8859-1"));
      return digest2Hex(sha.digest());
    }
    catch(Exception e) {
      return null;
    }
  }

  private static String digest2Hex(byte[] digest) {
    StringBuilder hash = new StringBuilder(HASH_LEN * 2);
    final String hexChars = "0123456789abcdef";
    for(int i = 0; i < HASH_LEN; i++) {
          hash.append(hexChars.charAt((digest[i] & 0xF0) >> 4))
             .append(hexChars.charAt((digest[i] & 0x0F)));
    }
    return hash.toString();
  }

}




Java Source Code List

org.meshpoint.anode.AndroidContext.java
org.meshpoint.anode.AnodeActivity.java
org.meshpoint.anode.AnodeReceiver.java
org.meshpoint.anode.AnodeService.java
org.meshpoint.anode.Constants.java
org.meshpoint.anode.Isolate.java
org.meshpoint.anode.RuntimeNative.java
org.meshpoint.anode.Runtime.java
org.meshpoint.anode.bridge.BridgeNative.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.Env.java
org.meshpoint.anode.bridge.FinalizeQueue.java
org.meshpoint.anode.bridge.ModuleClassLoader.java
org.meshpoint.anode.bridge.ModuleContext.java
org.meshpoint.anode.bridge.SynchronousOperation.java
org.meshpoint.anode.error.GeneralError.java
org.meshpoint.anode.error.InternalError.java
org.meshpoint.anode.error.ReferenceError.java
org.meshpoint.anode.error.ScriptError.java
org.meshpoint.anode.error.TypeError.java
org.meshpoint.anode.idl.BoundInterface.java
org.meshpoint.anode.idl.Callback.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.Dictionary.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.IDLInterface.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.InterfaceManager.java
org.meshpoint.anode.idl.StubUtil.java
org.meshpoint.anode.idl.Types.java
org.meshpoint.anode.java.Array.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.Base.java
org.meshpoint.anode.java.ByteArray.java
org.meshpoint.anode.java.DoubleArray.java
org.meshpoint.anode.java.IntegerArray.java
org.meshpoint.anode.java.LongArray.java
org.meshpoint.anode.java.ObjectArray.java
org.meshpoint.anode.js.JSArray.java
org.meshpoint.anode.js.JSByteArray.java
org.meshpoint.anode.js.JSDoubleArray.java
org.meshpoint.anode.js.JSFunction.java
org.meshpoint.anode.js.JSIntegerArray.java
org.meshpoint.anode.js.JSInterface.java
org.meshpoint.anode.js.JSLongArray.java
org.meshpoint.anode.js.JSObjectArray.java
org.meshpoint.anode.js.JSObject.java
org.meshpoint.anode.js.JSValue.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModuleContext.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.module.IModule.java
org.meshpoint.anode.stub.DictionaryStubGenerator.java
org.meshpoint.anode.stub.PlatformStubGenerator.java
org.meshpoint.anode.stub.StubGenerator.java
org.meshpoint.anode.stub.UserStubGenerator.java
org.meshpoint.anode.stub.util.DirectoryClassLoader.java
org.meshpoint.anode.stub.util.StubGen.java
org.meshpoint.anode.type.ICollection.java
org.meshpoint.anode.type.IFunction.java
org.meshpoint.anode.type.IIndexedCollection.java
org.meshpoint.anode.util.AndroidLog.java
org.meshpoint.anode.util.ArgProcessor.java
org.meshpoint.anode.util.Log.java
org.meshpoint.anode.util.ModuleUtils.java
org.meshpoint.anode.util.PrintStreamLog.java
org.meshpoint.anode.util.TarExtractor.java
org.meshpoint.anode.util.ZipExtractor.java
org.w3c.dom.Array.java
org.w3c.dom.Array.java
org.w3c.dom.ByteArray.java
org.w3c.dom.ByteArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.DoubleArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.IntegerArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.LongArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.ObjectArray.java
org.w3c.dom.PrimitiveArray.java
org.w3c.dom.PrimitiveArray.java