boot/src/main/java/org/netbeans/html/boot/impl/JsClassLoader.java
author Jaroslav Tulach <jtulach@netbeans.org>
Tue, 26 Aug 2014 18:13:30 +0200
changeset 838 bdc3d696dd4a
parent 655 7211ec5f3172
child 932 f2de2ae88589
permissions -rw-r--r--
During the API review process (bug 246133) the reviewers decided that in order to include html4j to NetBeans Platform, we need to stop using org.apidesign namespace and switch to NetBeans one. Repackaging all SPI packages into org.netbeans.html.smthng.spi.
jaroslav@123
     1
/**
jaroslav@358
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
jaroslav@123
     3
 *
jaroslav@551
     4
 * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
jaroslav@123
     5
 *
jaroslav@358
     6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
jaroslav@358
     7
 * Other names may be trademarks of their respective owners.
jaroslav@123
     8
 *
jaroslav@358
     9
 * The contents of this file are subject to the terms of either the GNU
jaroslav@358
    10
 * General Public License Version 2 only ("GPL") or the Common
jaroslav@358
    11
 * Development and Distribution License("CDDL") (collectively, the
jaroslav@358
    12
 * "License"). You may not use this file except in compliance with the
jaroslav@358
    13
 * License. You can obtain a copy of the License at
jaroslav@358
    14
 * http://www.netbeans.org/cddl-gplv2.html
jaroslav@358
    15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
jaroslav@358
    16
 * specific language governing permissions and limitations under the
jaroslav@358
    17
 * License.  When distributing the software, include this License Header
jaroslav@358
    18
 * Notice in each file and include the License file at
jaroslav@358
    19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
jaroslav@358
    20
 * particular file as subject to the "Classpath" exception as provided
jaroslav@358
    21
 * by Oracle in the GPL Version 2 section of the License file that
jaroslav@358
    22
 * accompanied this code. If applicable, add the following below the
jaroslav@358
    23
 * License Header, with the fields enclosed by brackets [] replaced by
jaroslav@358
    24
 * your own identifying information:
jaroslav@358
    25
 * "Portions Copyrighted [year] [name of copyright owner]"
jaroslav@358
    26
 *
jaroslav@358
    27
 * Contributor(s):
jaroslav@358
    28
 *
jaroslav@358
    29
 * The Original Software is NetBeans. The Initial Developer of the Original
jaroslav@551
    30
 * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
jaroslav@358
    31
 *
jaroslav@358
    32
 * If you wish your version of this file to be governed by only the CDDL
jaroslav@358
    33
 * or only the GPL Version 2, indicate your decision by adding
jaroslav@358
    34
 * "[Contributor] elects to include this software in this distribution
jaroslav@358
    35
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
jaroslav@358
    36
 * single choice of license, a recipient has the option to distribute
jaroslav@358
    37
 * your version of this file under either the CDDL, the GPL Version 2 or
jaroslav@358
    38
 * to extend the choice of license to its licensees as provided above.
jaroslav@358
    39
 * However, if you add GPL Version 2 code and therefore, elected the GPL
jaroslav@358
    40
 * Version 2 license, then the option applies only if the new code is
jaroslav@358
    41
 * made subject to such option by the copyright holder.
jaroslav@123
    42
 */
jaroslav@362
    43
package org.netbeans.html.boot.impl;
jaroslav@123
    44
jtulach@838
    45
import org.netbeans.html.boot.spi.Fn;
jaroslav@123
    46
import java.io.IOException;
jaroslav@123
    47
import java.io.InputStream;
jaroslav@163
    48
import java.io.Reader;
jaroslav@123
    49
import java.net.URL;
jaroslav@123
    50
import java.util.Enumeration;
jaroslav@123
    51
jaroslav@123
    52
/** 
jaroslav@123
    53
 *
jtulach@655
    54
 * @author Jaroslav Tulach
jaroslav@123
    55
 */
jaroslav@123
    56
abstract class JsClassLoader extends ClassLoader {
jaroslav@123
    57
    JsClassLoader(ClassLoader parent) {
jaroslav@123
    58
        super(parent);
jaroslav@143
    59
        setDefaultAssertionStatus(JsClassLoader.class.desiredAssertionStatus());
jaroslav@123
    60
    }
jaroslav@123
    61
    
jaroslav@123
    62
    @Override
jaroslav@123
    63
    protected abstract URL findResource(String name);
jaroslav@123
    64
    
jaroslav@123
    65
    @Override
jaroslav@123
    66
    protected abstract Enumeration<URL> findResources(String name);
jaroslav@123
    67
jaroslav@123
    68
    @Override
jaroslav@123
    69
    protected Class<?> findClass(String name) throws ClassNotFoundException {
jaroslav@123
    70
        if (name.startsWith("javafx")) {
jaroslav@123
    71
            return Class.forName(name);
jaroslav@123
    72
        }
jaroslav@123
    73
        if (name.startsWith("netscape")) {
jaroslav@123
    74
            return Class.forName(name);
jaroslav@123
    75
        }
jaroslav@123
    76
        if (name.startsWith("com.sun")) {
jaroslav@123
    77
            return Class.forName(name);
jaroslav@123
    78
        }
jtulach@838
    79
        if (name.startsWith("org.netbeans.html.context.spi")) {
jaroslav@580
    80
            return Class.forName(name);
jaroslav@580
    81
        }
jaroslav@583
    82
        if (name.startsWith("net.java.html.BrwsrCtx")) {
jaroslav@583
    83
            return Class.forName(name);
jaroslav@583
    84
        }
jaroslav@123
    85
        if (name.equals(JsClassLoader.class.getName())) {
jaroslav@123
    86
            return JsClassLoader.class;
jaroslav@123
    87
        }
jaroslav@123
    88
        if (name.equals(Fn.class.getName())) {
jaroslav@123
    89
            return Fn.class;
jaroslav@123
    90
        }
jaroslav@288
    91
        if (name.equals(Fn.Presenter.class.getName())) {
jaroslav@288
    92
            return Fn.Presenter.class;
jaroslav@288
    93
        }
jaroslav@430
    94
        if (name.equals(Fn.ToJavaScript.class.getName())) {
jaroslav@430
    95
            return Fn.ToJavaScript.class;
jaroslav@430
    96
        }
jaroslav@446
    97
        if (name.equals(Fn.FromJavaScript.class.getName())) {
jaroslav@446
    98
            return Fn.FromJavaScript.class;
jaroslav@446
    99
        }
jaroslav@124
   100
        if (name.equals(FnUtils.class.getName())) {
jaroslav@124
   101
            return FnUtils.class;
jaroslav@124
   102
        }
jaroslav@309
   103
        if (
jtulach@838
   104
            name.equals("org.netbeans.html.boot.spi.Fn") ||
jaroslav@362
   105
            name.equals("org.netbeans.html.boot.impl.FnUtils") ||
jaroslav@362
   106
            name.equals("org.netbeans.html.boot.impl.FnContext")
jaroslav@309
   107
        ) {
jaroslav@309
   108
            return Class.forName(name);
jaroslav@309
   109
        }
jaroslav@123
   110
        URL u = findResource(name.replace('.', '/') + ".class");
jaroslav@123
   111
        if (u != null) {
jaroslav@123
   112
            InputStream is = null;
jaroslav@123
   113
            try {
jaroslav@123
   114
                is = u.openStream();
jaroslav@123
   115
                byte[] arr = new byte[is.available()];
jaroslav@123
   116
                int len = 0;
jaroslav@123
   117
                while (len < arr.length) {
jaroslav@123
   118
                    int read = is.read(arr, len, arr.length - len);
jaroslav@123
   119
                    if (read == -1) {
jaroslav@123
   120
                        throw new IOException("Can't read " + u);
jaroslav@123
   121
                    }
jaroslav@123
   122
                    len += read;
jaroslav@123
   123
                }
jaroslav@123
   124
                is.close();
jaroslav@123
   125
                is = null;
jaroslav@459
   126
                if (JsPkgCache.process(this, name)) {
jaroslav@459
   127
                    arr = FnUtils.transform(arr, JsClassLoader.this);
jaroslav@123
   128
                }
jaroslav@459
   129
                return defineClass(name, arr, 0, arr.length);
jaroslav@123
   130
            } catch (IOException ex) {
jaroslav@123
   131
                throw new ClassNotFoundException("Can't load " + name, ex);
jaroslav@123
   132
            } finally {
jaroslav@123
   133
                try {
jaroslav@123
   134
                    if (is != null) is.close();
jaroslav@123
   135
                } catch (IOException ex) {
jaroslav@123
   136
                    throw new ClassNotFoundException(null, ex);
jaroslav@123
   137
                }
jaroslav@123
   138
            }
jaroslav@123
   139
        }
jaroslav@123
   140
        return super.findClass(name);
jaroslav@123
   141
    }
jaroslav@123
   142
    
jaroslav@123
   143
    protected abstract Fn defineFn(String code, String... names);
jaroslav@163
   144
    protected abstract void loadScript(Reader code) throws Exception;
jaroslav@123
   145
}