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
     1 /**
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Oracle. Portions Copyright 2013-2013 Oracle. All Rights Reserved.
    31  *
    32  * If you wish your version of this file to be governed by only the CDDL
    33  * or only the GPL Version 2, indicate your decision by adding
    34  * "[Contributor] elects to include this software in this distribution
    35  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    36  * single choice of license, a recipient has the option to distribute
    37  * your version of this file under either the CDDL, the GPL Version 2 or
    38  * to extend the choice of license to its licensees as provided above.
    39  * However, if you add GPL Version 2 code and therefore, elected the GPL
    40  * Version 2 license, then the option applies only if the new code is
    41  * made subject to such option by the copyright holder.
    42  */
    43 package net.java.html;
    44 
    45 import java.util.ServiceLoader;
    46 import java.util.logging.Logger;
    47 import org.netbeans.html.context.impl.CtxAccssr;
    48 import org.netbeans.html.context.impl.CtxImpl;
    49 import org.apidesign.html.context.spi.Contexts;
    50 
    51 /** Represents context where the <code>net.java.html.json.Model</code>
    52  * and other objects
    53  * operate in. The context is usually a particular HTML page in a browser.
    54  * The context is also associated with the actual HTML technology
    55  * in the HTML page - there is likely to be different context for 
    56  * <a href="http://knockoutjs.com">knockout.js</a> and different one
    57  * for <a href="http://angularjs.org">angular</a>.
    58  *
    59  * @author Jaroslav Tulach <jtulach@netbeans.org>
    60  */
    61 public final class BrwsrCtx {
    62     private static final Logger LOG = Logger.getLogger(BrwsrCtx.class.getName());
    63     private final CtxImpl impl;
    64     private BrwsrCtx(CtxImpl impl) {
    65         this.impl = impl;
    66     }
    67     static {
    68         new CtxAccssr() {
    69             @Override
    70             protected BrwsrCtx newContext(CtxImpl impl) {
    71                 return new BrwsrCtx(impl);
    72             }
    73 
    74             @Override
    75             protected CtxImpl find(BrwsrCtx context) {
    76                 return context.impl;
    77             }
    78         };
    79     }
    80     /** Dummy context without binding to any real browser or technology. 
    81      * Useful for simple unit testing of behavior of various business logic
    82      * code.
    83      */
    84     public static final BrwsrCtx EMPTY = Contexts.newBuilder().build();
    85     
    86     /** Seeks for the default context that is associated with the requesting
    87      * class. If no suitable context is found, a warning message is
    88      * printed and {@link #EMPTY} context is returned.
    89      * 
    90      * @param requestor the class that makes the request
    91      * @return appropriate context for the request
    92      */
    93     public static BrwsrCtx findDefault(Class<?> requestor) {
    94         org.apidesign.html.context.spi.Contexts.Builder cb = Contexts.newBuilder();
    95         boolean found = false;
    96         
    97         ClassLoader l;
    98         try {
    99             l = requestor.getClassLoader();
   100         } catch (SecurityException ex) {
   101             l = null;
   102         }
   103         
   104         for (org.apidesign.html.context.spi.Contexts.Provider cp : ServiceLoader.load(
   105             org.apidesign.html.context.spi.Contexts.Provider.class, l
   106         )) {
   107             cp.fillContext(cb, requestor);
   108             found = true;
   109         }
   110         try {
   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())) {
   112                 cp.fillContext(cb, requestor);
   113                 found = true;
   114             }
   115         } catch (SecurityException ex) {
   116             if (!found) {
   117                 throw ex;
   118             }
   119             // if we have some data from regular provides, go on
   120         }
   121         if (!found) {
   122             for (org.apidesign.html.context.spi.Contexts.Provider cp : ServiceLoader.load(org.apidesign.html.context.spi.Contexts.Provider.class)) {
   123                 cp.fillContext(cb, requestor);
   124                 found = true;
   125             }
   126         }
   127         if (!found) {
   128             LOG.warning("No browser context found. Returning empty technology!");
   129             return EMPTY;
   130         }
   131         return cb.build();
   132     }
   133     
   134 }