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

juzu.impl.plugin.amd.ModuleAsset Maven / Gradle / Ivy

package juzu.impl.plugin.amd;

import juzu.impl.asset.NormalizeJSReader;
import juzu.impl.common.Tools;
import juzu.impl.plugin.asset.Asset;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.io.StringWriter;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Julien Viet
 */
public class ModuleAsset extends Asset {

  /** . */
  private final String adapter;

  /** . */
  private final LinkedHashMap dependencyMappings;

  public ModuleAsset( Map asset, String adapter, List aliases) {
    super("module", asset);

    //
    LinkedHashMap dependencyMappings;
    if (depends != null && aliases != null) {
      dependencyMappings = new LinkedHashMap();
      int size = Math.min(depends.size(), aliases.size());
      for (int i = 0;i < size;i++) {
        dependencyMappings.put(depends.get(i), aliases.get(i));
      }
    } else {
      dependencyMappings = null;
    }

    //
    depends.add("juzu.amd");

    //
    this.adapter = adapter;
    this.dependencyMappings = dependencyMappings;
  }

  @Override
  public InputStream open(String source, URLConnection resource) throws IOException {

    InputStream stream = resource.getInputStream();

    if (dependencyMappings != null || adapter != null) {
      StringWriter buffer = new StringWriter();

      // The define call
      buffer.append("\ndefine('").append(id).append("', [");
      if (dependencyMappings != null) {
        joinDependencies(buffer);
      }
      buffer.append("], function(");
      if (dependencyMappings != null) {
        joinParams(buffer);
      }
      buffer.append(") {");

      // Redeclare here define
      // Note : this only work with
      // define(id,dependencies,factory)
      // it does not work with
      // define(?id,?dependencies,factory)
      // because we use 'arguments[2]'
      // so it should be done and tested
      buffer.append("var define = function() {");
      buffer.append("return arguments[2].apply(this, [");
      if (dependencyMappings != null) {
        joinParams(buffer);
      }
      buffer.append("]);");
      buffer.append("};");

      buffer.append("\nreturn ");

      int idx;
      if (adapter != null && !adapter.isEmpty()) {
        idx = adapter.indexOf("@{include}");
      } else {
        idx = -1;
      }

      if (idx != -1) {
        buffer.append(adapter.substring(0, idx)).append("\n");
      }
      Tools.copy(new NormalizeJSReader(new InputStreamReader(stream)), buffer);
      if (idx != -1) {
        buffer.append(adapter.substring(idx + "@{include}".length(), adapter.length()));
      }

      //
      buffer.append("\n});");

      //
      return new ByteArrayInputStream(buffer.toString().getBytes());
    } else {
      return stream;
    }
  }

  private void joinDependencies(Appendable sb) throws IOException {
    for (Iterator i = dependencyMappings.keySet().iterator();i.hasNext();) {
      sb.append("'").append(i.next()).append("'");
      if (i.hasNext()) {
        sb.append(", ");
      }
    }
  }

  private void joinParams(Appendable sb) throws IOException {
    for (Iterator i = dependencyMappings.values().iterator();i.hasNext();) {
      sb.append(i.next());
      if (i.hasNext()) {
        sb.append(", ");
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy