You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by yo...@apache.org on 2004/12/06 22:07:57 UTC

cvs commit: logging-log4j/src/java/org/apache/log4j/joran/action JndiSubstitutionPropertyAction.java

yoavs       2004/12/06 13:07:57

  Modified:    src/java/org/apache/log4j/joran JoranConfigurator.java
  Added:       src/java/org/apache/log4j/joran/action
                        JndiSubstitutionPropertyAction.java
  Log:
  Initial version of JndiSubstitutionPropertyAction for joran.
  
  Revision  Changes    Path
  1.25      +5 -0      logging-log4j/src/java/org/apache/log4j/joran/JoranConfigurator.java
  
  Index: JoranConfigurator.java
  ===================================================================
  RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/joran/JoranConfigurator.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- JoranConfigurator.java	1 Dec 2004 09:41:01 -0000	1.24
  +++ JoranConfigurator.java	6 Dec 2004 21:07:56 -0000	1.25
  @@ -31,6 +31,7 @@
   import org.apache.log4j.joran.action.AppenderRefAction;
   import org.apache.log4j.joran.action.ConfigurationAction;
   import org.apache.log4j.joran.action.ConversionRuleAction;
  +import org.apache.log4j.joran.action.JndiSubstitutionPropertyAction;
   import org.apache.log4j.joran.action.LayoutAction;
   import org.apache.log4j.joran.action.LevelAction;
   import org.apache.log4j.joran.action.LoggerAction;
  @@ -228,8 +229,12 @@
         new Pattern("log4j:configuration/appender/layout/conversionRule"),
         new ConversionRuleAction());
       rs.addRule(
  +               new Pattern("log4j:configuration/jndiSubstitutionProperty"),
  +               new JndiSubstitutionPropertyAction());
  +    rs.addRule(
         new Pattern("log4j:configuration/newRule"), new NewRuleAction());
       rs.addRule(new Pattern("*/param"), new ParamAction());
  +
   
       joranInterpreter = new Interpreter(rs);
   
  
  
  
  1.1                  logging-log4j/src/java/org/apache/log4j/joran/action/JndiSubstitutionPropertyAction.java
  
  Index: JndiSubstitutionPropertyAction.java
  ===================================================================
  /*
   * Copyright 2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.log4j.joran.action;
  
  import javax.naming.Context;
  import javax.naming.NamingException;
  import javax.naming.InitialContext;
  
  import org.apache.joran.ExecutionContext;
  import org.apache.joran.action.Action;
  import org.apache.log4j.Logger;
  import org.apache.log4j.spi.ErrorItem;
  
  import org.xml.sax.Attributes;
  
  /**
   * This action looks up JNDI properties specified in the configuration
   * file and adds them to the Joran <code>ExecutionContext</code>.  The
   * element in the configuration file should have an attribute called
   * "jndiName".  This attribute will be the key to the naming context lookup,
   * as well as the key to the <code>ExecutionContext</code> properties.  If a value
   * is found whose name matches the given jndiName, it will be placed
   * in the ExecutionContext's properties.
   *
   * @author Yoav Shapira
   */
  public class JndiSubstitutionPropertyAction extends Action {
      /**
       * Logger.
       */
      private static final Logger LOGGER = Logger.getLogger(JndiSubstitutionPropertyAction.class);
  
      /**
       * The attribute name specifying the JNDI variable to lookup.
       */
      private static final String JNDI_ATTR = "jndiName";
  
      /**
       * The naming context.
       */
      private Context namingContext;
  
      /**
       * Returns the naming context for lookups.
       *
       * @return The context (may be null)
       */
      protected Context getNamingContext() {
          return namingContext;
      }
  
      /**
       * Creates the naming context.  This is an expensive
       * operation.
       *
       * @throws NamingException If an error occurs
       */
      protected void findNamingContext() throws NamingException {
          if(getNamingContext() != null) {
              LOGGER.warn("Overwriting existing naming context.");
          }
  
          // POSSIBLE TO-DO: add support for properties
          // passed to the initial context, e.g. a factory,
          // to enable things like a remote context.
          InitialContext ic = new InitialContext();
          namingContext = (Context) ic.lookup("java:comp/env");
      }
  
      /**
       * @see org.apache.joran.Action#begin.
       */
      public void begin(final ExecutionContext ec, final String name, final Attributes attributes) {
          if(LOGGER.isDebugEnabled()) {
              LOGGER.debug(getClass().getName() +
                           ": begin(" + ec +
                           ", " + name +
                           ", " + attributes +
                           "): here.");
          }
  
          // If first time, create and locate context: expensive operation.
          if(getNamingContext() == null) {
              try {
                  findNamingContext();
              } catch (Exception e) {
                  LOGGER.error("Couldn't find JNDI naming context: ", e);
                  ec.addError(new ErrorItem("Couldn't find JNDI naming context.", e));
              }
          }
  
          String jndiName = attributes.getValue(JNDI_ATTR);
          
          if((jndiName == null) || (jndiName.trim().length() < 1)) {
              LOGGER.warn("Missing " + JNDI_ATTR + " attribute, ignoring.");
          } else if(getNamingContext() != null){ 
              Object value = null;
  
              try {
                  value = getNamingContext().lookup(jndiName);
              } catch (Exception e) {
                  LOGGER.error("Error looking up " + jndiName + ": ", e);
                  ec.addError(new ErrorItem("Error looking up " + jndiName, e));
              }
  
              if(value == null) {
                  LOGGER.warn("No JNDI value found for " + jndiName);
              } else if(! (value instanceof String)) {
                  LOGGER.warn("Value for " + jndiName + " is not a String.");
              } else {
                  ec.addProperty(jndiName, (String) value);
              }
          } else {
              LOGGER.warn("Naming context is null, cannot lookup " + jndiName);
          }
      }
  
      /**
       * @see org.apache.joran.Action#end.
       */
      public void end(final ExecutionContext ec, final String name) {
      }
  
  
  }
  
  // End of class: JndiSubstitutionPropertyAction.java
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org