public void log(String msg) {
   if (SecurityUtil.isPackageProtectionEnabled()) {
     doPrivileged("log", new Object[] {msg});
   } else {
     context.log(msg);
   }
 }
 public void log(String message, Throwable throwable) {
   if (SecurityUtil.isPackageProtectionEnabled()) {
     doPrivileged(
         "log", new Class[] {String.class, Throwable.class}, new Object[] {message, throwable});
   } else {
     context.log(message, throwable);
   }
 }
 public void log(Exception exception, String msg) {
   if (SecurityUtil.isPackageProtectionEnabled()) {
     doPrivileged(
         "log", new Class[] {Exception.class, String.class}, new Object[] {exception, msg});
   } else {
     context.log(exception, msg);
   }
 }
  /**
   * Bind the specified value with the specified context attribute name, replacing any existing
   * value for that name.
   *
   * @param name Attribute name to be bound
   * @param value New attribute value to be bound
   */
  public void setAttribute(String name, Object value) {

    // Name cannot be null
    if (name == null)
      throw new IllegalArgumentException(sm.getString("applicationContext.setAttribute.namenull"));

    // Null value is the same as removeAttribute()
    if (value == null) {
      removeAttribute(name);
      return;
    }

    Object oldValue = null;
    boolean replaced = false;

    // Add or replace the specified attribute
    synchronized (attributes) {
      // Check for read only attribute
      if (readOnlyAttributes.containsKey(name)) return;
      oldValue = attributes.get(name);
      if (oldValue != null) replaced = true;
      attributes.put(name, value);
    }

    // Notify interested application event listeners
    Object listeners[] = context.getApplicationListeners();
    if ((listeners == null) || (listeners.length == 0)) return;
    ServletContextAttributeEvent event = null;
    if (replaced)
      event = new ServletContextAttributeEvent(context.getServletContext(), name, oldValue);
    else event = new ServletContextAttributeEvent(context.getServletContext(), name, value);

    for (int i = 0; i < listeners.length; i++) {
      if (!(listeners[i] instanceof ServletContextAttributeListener)) continue;
      ServletContextAttributeListener listener = (ServletContextAttributeListener) listeners[i];
      try {
        if (replaced) {
          context.fireContainerEvent("beforeContextAttributeReplaced", listener);
          listener.attributeReplaced(event);
          context.fireContainerEvent("afterContextAttributeReplaced", listener);
        } else {
          context.fireContainerEvent("beforeContextAttributeAdded", listener);
          listener.attributeAdded(event);
          context.fireContainerEvent("afterContextAttributeAdded", listener);
        }
      } catch (Throwable t) {
        if (replaced) context.fireContainerEvent("afterContextAttributeReplaced", listener);
        else context.fireContainerEvent("afterContextAttributeAdded", listener);
        // FIXME - should we do anything besides log these?
        log(sm.getString("applicationContext.attributeEvent"), t);
      }
    }
  }
  /**
   * Remove the context attribute with the specified name, if any.
   *
   * @param name Name of the context attribute to be removed
   */
  public void removeAttribute(String name) {

    Object value = null;
    boolean found = false;

    // Remove the specified attribute
    synchronized (attributes) {
      // Check for read only attribute
      if (readOnlyAttributes.containsKey(name)) return;
      found = attributes.containsKey(name);
      if (found) {
        value = attributes.get(name);
        attributes.remove(name);
      } else {
        return;
      }
    }

    // Notify interested application event listeners
    Object listeners[] = context.getApplicationListeners();
    if ((listeners == null) || (listeners.length == 0)) return;
    ServletContextAttributeEvent event =
        new ServletContextAttributeEvent(context.getServletContext(), name, value);
    for (int i = 0; i < listeners.length; i++) {
      if (!(listeners[i] instanceof ServletContextAttributeListener)) continue;
      ServletContextAttributeListener listener = (ServletContextAttributeListener) listeners[i];
      try {
        context.fireContainerEvent("beforeContextAttributeRemoved", listener);
        listener.attributeRemoved(event);
        context.fireContainerEvent("afterContextAttributeRemoved", listener);
      } catch (Throwable t) {
        context.fireContainerEvent("afterContextAttributeRemoved", listener);
        // FIXME - should we do anything besides log these?
        log(sm.getString("applicationContext.attributeEvent"), t);
      }
    }
  }