Coverage Report - org.webmacro.util.Instantiator
 
Classes in this File Line Coverage Branch Coverage Complexity
Instantiator
0%
0/61
0%
0/34
5.167
 
 1  
 /*
 2  
  * Copyright (C) 1998-2005 Semiotek Inc.  All Rights Reserved.
 3  
  *
 4  
  * Redistribution and use in source and binary forms, with or without
 5  
  * modification, are permitted under the terms of either of the following
 6  
  * Open Source licenses:
 7  
  *
 8  
  * The GNU General Public License, version 2, or any later version, as
 9  
  * published by the Free Software Foundation
 10  
  * (http://www.fsf.org/copyleft/gpl.html);
 11  
  *
 12  
  *  or
 13  
  *
 14  
  * The Semiotek Public License (http://webmacro.org/LICENSE.)
 15  
  *
 16  
  * This software is provided "as is", with NO WARRANTY, not even the
 17  
  * implied warranties of fitness to purpose, or merchantability. You
 18  
  * assume all risks and liabilities associated with its use.
 19  
  *
 20  
  * See www.webmacro.org for more information on the WebMacro project.
 21  
  */
 22  
 
 23  
 package org.webmacro.util;
 24  
 
 25  
 import java.util.Arrays;
 26  
 import java.util.Collections;
 27  
 import java.util.List;
 28  
 
 29  
 import org.slf4j.Logger;
 30  
 import org.slf4j.LoggerFactory;
 31  
 import org.webmacro.Broker;
 32  
 import org.webmacro.WebMacroException;
 33  
 
 34  
 /**
 35  
  * Utility class for loading and instantiating classes subject
 36  
  * to package restrictions specified by the AllowedPackages property,
 37  
  * and using implicit package names specified by the ImpliedPackages
 38  
  * configuration property.
 39  
  * 
 40  
  * Used by BeanDirective and SetpropsDirective.
 41  
  * 
 42  
  * NOTE If AllowedPackages is empty then all packages are allowed.
 43  
  * 
 44  
  * @author Keats Kirsch
 45  
  * @see org.webmacro.directive.BeanDirective
 46  
  * @see org.webmacro.directive.SetpropsDirective
 47  
  */
 48  
 final public class Instantiator
 49  
 {
 50  0
     static Logger _log =  LoggerFactory.getLogger(Instantiator.class);
 51  
 
 52  
    private static final String IMPLIED_PACKAGES = "ImpliedPackages";
 53  
 
 54  
    private static final String ALLOWED_PACKAGES = "AllowedPackages";
 55  
 
 56  
    private static final String DEPRECATED_IMPLIED_PACKAGES = "BeanDirective.ImpliedPackages";
 57  
 
 58  
    private static final String DEPRECATED_ALLOWED_PACKAGES = "BeanDirective.AllowedPackages";
 59  
 
 60  
    private static final String INSTANTIATOR_KEY = "org.webmacro.util.Instantiator";
 61  
 
 62  
    private List _impliedPackages;
 63  
 
 64  
    private List _allowedPackages;
 65  
 
 66  
    private Broker _broker;
 67  
 
 68  
    private Instantiator(Broker b)
 69  0
    {
 70  0
       _broker = b;
 71  0
       String s = b.getSetting(IMPLIED_PACKAGES);
 72  0
       if (s == null)
 73  
       {
 74  0
          s = b.getSetting(DEPRECATED_IMPLIED_PACKAGES);
 75  0
          if (s != null)
 76  
          {
 77  0
             _log.warn(
 78  
                      "The configuration parameter \""
 79  
                               + DEPRECATED_IMPLIED_PACKAGES
 80  
                               + "\" has been deprecated! Use \""
 81  
                               + IMPLIED_PACKAGES + "\" instead.");
 82  
          }
 83  
       }
 84  0
       if (s == null)
 85  
       {
 86  0
          _impliedPackages = Collections.EMPTY_LIST;
 87  
       }
 88  
       else
 89  
       {
 90  0
          _impliedPackages = Arrays.asList(org.webmacro.servlet.TextTool.split(
 91  
                   s, ","));
 92  
       }
 93  
 
 94  
       // get allowed packages setting
 95  0
       s = b.getSetting(ALLOWED_PACKAGES);
 96  0
       if (s == null)
 97  
       {
 98  0
          s = b.getSetting(DEPRECATED_ALLOWED_PACKAGES);
 99  0
          if (s != null)
 100  
          {
 101  0
             _log.warn(
 102  
                      "The configuration parameter \""
 103  
                               + DEPRECATED_ALLOWED_PACKAGES
 104  
                               + "\" has been deprecated! Use \""
 105  
                               + ALLOWED_PACKAGES + "\" instead.");
 106  
          }
 107  
       }
 108  0
       if (s == null)
 109  
       {
 110  0
          _allowedPackages = Collections.EMPTY_LIST;
 111  
       }
 112  
       else
 113  
       {
 114  0
          _allowedPackages = Arrays.asList(org.webmacro.servlet.TextTool.split(
 115  
                   s, ","));
 116  
       }
 117  0
    }
 118  
 
 119  
    public List getImpliedPackages()
 120  
    {
 121  0
       return _impliedPackages;
 122  
    }
 123  
 
 124  
    public List getAllowedPackages()
 125  
    {
 126  0
       return _allowedPackages;
 127  
    }
 128  
 
 129  
    public Class classForName(String className) throws WebMacroException
 130  
    {
 131  0
       Class c = null;
 132  0
       if (className.indexOf('.') >= 0) // it is a fully specified class name
 133  
       {
 134  
          try
 135  
          {
 136  0
             c = _broker.classForName(className);
 137  
          }
 138  0
          catch (ClassNotFoundException e)
 139  
          {
 140  0
                  throw new WebMacroException("Unable to load class " + className, e);
 141  0
          }
 142  
       }
 143  
       else
 144  
       {  // try with implied packages prepended
 145  0
          ClassNotFoundException exception = null;
 146  
          
 147  0
          for (int i = 0; i < _impliedPackages.size(); i++)
 148  
          {
 149  0
             String s = (String) _impliedPackages.get(i);
 150  
             try
 151  
             {
 152  0
                c = _broker.classForName(s + "." + className);
 153  0
                break;
 154  
             }
 155  0
             catch (ClassNotFoundException e)
 156  
             {
 157  0
                     exception = e;
 158  
             }
 159  
          }
 160  0
          if (c == null) {
 161  0
                  if (exception == null)
 162  0
                          throw new WebMacroException("Unable to load class " + className + 
 163  
                                          ", property " + IMPLIED_PACKAGES + " contains " + 
 164  
                                          _impliedPackages.size() + " items");
 165  
                  else
 166  0
                          throw new WebMacroException("Unable to load class " + className, exception);
 167  
          }
 168  
       }
 169  
 
 170  0
       if (!_allowedPackages.isEmpty())
 171  
       {
 172  
          // check if class is in a permitted package
 173  0
          String pkg = c.getPackage().getName();
 174  0
          if (!_allowedPackages.contains(pkg))
 175  
          {
 176  0
             throw new WebMacroException(
 177  
                      "You are not permitted to load classes from this package ("
 178  
                               + pkg + ").  Check the \"" + ALLOWED_PACKAGES
 179  
                               + "\" parameter in the WebMacro configuration.");
 180  
          }
 181  
       } 
 182  
       // else allowed packages not specified so all allowed
 183  
               
 184  0
       return c;
 185  
    }
 186  
 
 187  
    public Object instantiate(Class c, Object[] args) throws Exception
 188  
    {
 189  0
       Object o = null;
 190  0
       if (args == null)
 191  
       {
 192  0
          o = c.newInstance();
 193  
       }
 194  
       else
 195  
       {
 196  0
          java.lang.reflect.Constructor[] cons = c.getConstructors();
 197  0
          for (int i = 0; i < cons.length; i++)
 198  
          {
 199  0
             if (cons[i].getParameterTypes().length == args.length)
 200  
             {
 201  
                // try to instantiate using this constructor
 202  
                try
 203  
                {
 204  0
                   o = cons[i].newInstance(args);
 205  0
                   break; // if successful, we're done!
 206  
                }
 207  0
                catch (Exception e)
 208  
                {
 209  
                   // ignore
 210  
                }
 211  
             }
 212  
          }
 213  0
          if (o == null)
 214  
          {
 215  0
             throw new InstantiationException(
 216  
                      "Unable to construct object of type " + c.getName()
 217  
                               + " using the supplied arguments: "
 218  
                               + java.util.Arrays.asList(args).toString());
 219  
          }
 220  
       }
 221  0
       return o;
 222  
    }
 223  
 
 224  
    synchronized public static Instantiator getInstance(Broker b)
 225  
    {
 226  0
       Instantiator instantiator = (Instantiator) b
 227  
                .getBrokerLocal(INSTANTIATOR_KEY);
 228  0
       if (instantiator == null)
 229  
       {
 230  0
          instantiator = new Instantiator(b);
 231  0
          b.setBrokerLocal(INSTANTIATOR_KEY, instantiator);
 232  
       }
 233  0
       return instantiator;
 234  
    }
 235  
 }
 236