context/src/main/java/net/java/html/BrwsrCtx.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 16 Dec 2013 16:59:43 +0100
branchnetbeans
changeset 362 92fb71afdc0e
parent 358 80702021b851
child 365 5c93ad8c7a15
permissions -rw-r--r--
Moving implementation classes into org.netbeans.html namespace
jaroslav@5
     1
/**
jaroslav@358
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
jaroslav@5
     3
 *
jaroslav@358
     4
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
jaroslav@5
     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@5
     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@358
    30
 * Software is Oracle. Portions Copyright 2013-2013 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@5
    42
 */
jaroslav@110
    43
package net.java.html;
jaroslav@5
    44
jaroslav@39
    45
import java.util.ServiceLoader;
jaroslav@320
    46
import java.util.logging.Logger;
jaroslav@362
    47
import org.netbeans.html.context.impl.CtxAccssr;
jaroslav@362
    48
import org.netbeans.html.context.impl.CtxImpl;
jaroslav@110
    49
import org.apidesign.html.context.spi.Contexts;
jaroslav@6
    50
jaroslav@167
    51
/** Represents context where the <code>net.java.html.json.Model</code>
jaroslav@167
    52
 * and other objects
jaroslav@5
    53
 * operate in. The context is usually a particular HTML page in a browser.
jaroslav@167
    54
 * The context is also associated with the actual HTML technology
jaroslav@5
    55
 * in the HTML page - there is likely to be different context for 
jaroslav@5
    56
 * <a href="http://knockoutjs.com">knockout.js</a> and different one
jaroslav@5
    57
 * for <a href="http://angularjs.org">angular</a>.
jaroslav@5
    58
 *
jaroslav@5
    59
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@5
    60
 */
jaroslav@110
    61
public final class BrwsrCtx {
jaroslav@320
    62
    private static final Logger LOG = Logger.getLogger(BrwsrCtx.class.getName());
jaroslav@110
    63
    private final CtxImpl impl;
jaroslav@110
    64
    private BrwsrCtx(CtxImpl impl) {
jaroslav@110
    65
        this.impl = impl;
jaroslav@5
    66
    }
jaroslav@6
    67
    static {
jaroslav@110
    68
        new CtxAccssr() {
jaroslav@6
    69
            @Override
jaroslav@110
    70
            protected BrwsrCtx newContext(CtxImpl impl) {
jaroslav@110
    71
                return new BrwsrCtx(impl);
jaroslav@6
    72
            }
jaroslav@6
    73
jaroslav@6
    74
            @Override
jaroslav@110
    75
            protected CtxImpl find(BrwsrCtx context) {
jaroslav@110
    76
                return context.impl;
jaroslav@6
    77
            }
jaroslav@6
    78
        };
jaroslav@6
    79
    }
jaroslav@5
    80
    /** Dummy context without binding to any real browser or technology. 
jaroslav@110
    81
     * Useful for simple unit testing of behavior of various business logic
jaroslav@110
    82
     * code.
jaroslav@5
    83
     */
jaroslav@110
    84
    public static final BrwsrCtx EMPTY = Contexts.newBuilder().build();
jaroslav@39
    85
    
jaroslav@39
    86
    /** Seeks for the default context that is associated with the requesting
jaroslav@39
    87
     * class. If no suitable context is found, a warning message is
jaroslav@39
    88
     * printed and {@link #EMPTY} context is returned.
jaroslav@39
    89
     * 
jaroslav@39
    90
     * @param requestor the class that makes the request
jaroslav@39
    91
     * @return appropriate context for the request
jaroslav@39
    92
     */
jaroslav@110
    93
    public static BrwsrCtx findDefault(Class<?> requestor) {
jaroslav@110
    94
        org.apidesign.html.context.spi.Contexts.Builder cb = Contexts.newBuilder();
jaroslav@110
    95
        boolean found = false;
jaroslav@121
    96
        
jaroslav@121
    97
        ClassLoader l;
jaroslav@121
    98
        try {
jaroslav@121
    99
            l = requestor.getClassLoader();
jaroslav@121
   100
        } catch (SecurityException ex) {
jaroslav@121
   101
            l = null;
jaroslav@121
   102
        }
jaroslav@121
   103
        
jaroslav@121
   104
        for (org.apidesign.html.context.spi.Contexts.Provider cp : ServiceLoader.load(
jaroslav@121
   105
            org.apidesign.html.context.spi.Contexts.Provider.class, l
jaroslav@121
   106
        )) {
jaroslav@110
   107
            cp.fillContext(cb, requestor);
jaroslav@110
   108
            found = true;
jaroslav@39
   109
        }
jaroslav@113
   110
        try {
jaroslav@113
   111
            for (org.apidesign.html.context.spi.Contexts.Provider cp : ServiceLoader.load(org.apidesign.html.context.spi.Contexts.Provider.class, org.apidesign.html.context.spi.Contexts.Provider.class.getClassLoader())) {
jaroslav@113
   112
                cp.fillContext(cb, requestor);
jaroslav@113
   113
                found = true;
jaroslav@113
   114
            }
jaroslav@113
   115
        } catch (SecurityException ex) {
jaroslav@113
   116
            if (!found) {
jaroslav@113
   117
                throw ex;
jaroslav@113
   118
            }
jaroslav@113
   119
            // if we have some data from regular provides, go on
jaroslav@41
   120
        }
jaroslav@110
   121
        if (!found) {
jaroslav@320
   122
            for (org.apidesign.html.context.spi.Contexts.Provider cp : ServiceLoader.load(org.apidesign.html.context.spi.Contexts.Provider.class)) {
jaroslav@320
   123
                cp.fillContext(cb, requestor);
jaroslav@320
   124
                found = true;
jaroslav@320
   125
            }
jaroslav@320
   126
        }
jaroslav@320
   127
        if (!found) {
jaroslav@320
   128
            LOG.warning("No browser context found. Returning empty technology!");
jaroslav@110
   129
            return EMPTY;
jaroslav@110
   130
        }
jaroslav@110
   131
        return cb.build();
jaroslav@39
   132
    }
jaroslav@39
   133
    
jaroslav@5
   134
}