com.ibm.wala.cast.js.nodejs.NodejsRequiredCoreModule.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.wala.cast.js.nodejs.NodejsRequiredCoreModule.java

Source

/******************************************************************************
 * Copyright (c) 2002 - 2016 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Brian Pfretzschner - initial implementation
 *****************************************************************************/
package com.ibm.wala.cast.js.nodejs;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;

import org.apache.commons.io.FilenameUtils;

import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil;
import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.io.TemporaryFile;

/**
 * @author Brian Pfretzschner <brian.pfretzschner@gmail.com>
 */
public class NodejsRequiredCoreModule extends NodejsRequiredSourceModule {

    /**
     * Core modules list for Nodejs v6.2.2
     * https://github.com/nodejs/node/blob/v6.2.2/lib/internal/module.js 
     */
    private static final Set<String> CORE_MODULES = HashSetFactory
            .make(Arrays.asList("assert", "buffer", "child_process", "cluster", "crypto", "dgram", "dns", "domain",
                    "events", "fs", "http", "https", "net", "os", "path", "punycode", "querystring", "readline",
                    "repl", "stream", "string_decoder", "tls", "tty", "url", "util", "v8", "vm", "zlib",

                    // Non-public files
                    "timers", "constants", "freelist", "smalloc", "_debugger", "_http_agent", "_http_client",
                    "_http_common", "_http_incoming", "_http_outgoing", "_http_server", "_linklist",
                    "_stream_duplex", "_stream_passthrough", "_stream_readable", "_stream_transform",
                    "_stream_writable", "_tls_common", "_tls_legacy", "_tls_wrap"));

    protected NodejsRequiredCoreModule(File f, SourceFileModule clonedFrom) throws IOException {
        super(FilenameUtils.getBaseName(f.getName()), f, clonedFrom);
    }

    private static InputStream getModule(String name) {
        return NodejsRequiredCoreModule.class.getClassLoader().getResourceAsStream("core-modules/" + name + ".js");

    }

    private static final Map<String, File> names = HashMapFactory.make();

    public static NodejsRequiredCoreModule make(String name) throws IOException {
        if (!names.containsKey(name)) {
            java.nio.file.Path p = Files.createTempDirectory("nodejs");
            File f = new File(p.toFile(), name + ".js");
            f.deleteOnExit();
            p.toFile().deleteOnExit();
            names.put(name, f);
        }
        File file = names.get(name);
        TemporaryFile.streamToFile(file, getModule(name));
        SourceFileModule sourceFileModule = CAstCallGraphUtil.makeSourceModule(file.toURI().toURL(),
                file.getName());
        return new NodejsRequiredCoreModule(file, sourceFileModule);
    }

    public static boolean isCoreModule(String name) {
        return CORE_MODULES.contains(name);
    }

}