You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by jo...@apache.org on 2015/06/15 19:38:07 UTC

[6/9] struts git commit: Minor code improvements's in the xwork-core module

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/inject/util/ReferenceMap.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/inject/util/ReferenceMap.java b/xwork-core/src/main/java/com/opensymphony/xwork2/inject/util/ReferenceMap.java
index 2542a8c..4d8eebb 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/inject/util/ReferenceMap.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/inject/util/ReferenceMap.java
@@ -1,12 +1,12 @@
 /**
  * Copyright (C) 2006 Google Inc.
- *
+ * <p/>
  * 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
- *
+ * <p/>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p/>
  * 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.
@@ -16,8 +16,6 @@
 
 package com.opensymphony.xwork2.inject.util;
 
-import static com.opensymphony.xwork2.inject.util.ReferenceType.STRONG;
-
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
@@ -27,6 +25,8 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import static com.opensymphony.xwork2.inject.util.ReferenceType.STRONG;
+
 /**
  * Concurrent hash map that wraps keys and/or values in soft or weak
  * references. Does not support null keys or values. Uses identity equality
@@ -54,563 +54,552 @@ import java.util.concurrent.ConcurrentMap;
 @SuppressWarnings("unchecked")
 public class ReferenceMap<K, V> implements Map<K, V>, Serializable {
 
-  private static final long serialVersionUID = 0;
-
-  transient ConcurrentMap<Object, Object> delegate;
-
-  final ReferenceType keyReferenceType;
-  final ReferenceType valueReferenceType;
-
-  /**
-   * Concurrent hash map that wraps keys and/or values based on specified
-   * reference types.
-   *
-   * @param keyReferenceType key reference type
-   * @param valueReferenceType value reference type
-   */
-  public ReferenceMap(ReferenceType keyReferenceType,
-      ReferenceType valueReferenceType) {
-    ensureNotNull(keyReferenceType, valueReferenceType);
-
-    if (keyReferenceType == ReferenceType.PHANTOM
-        || valueReferenceType == ReferenceType.PHANTOM) {
-      throw new IllegalArgumentException("Phantom references not supported.");
-    }
-
-    this.delegate = new ConcurrentHashMap<Object, Object>();
-    this.keyReferenceType = keyReferenceType;
-    this.valueReferenceType = valueReferenceType;
-  }
-
-  V internalGet(K key) {
-    Object valueReference = delegate.get(makeKeyReferenceAware(key));
-    return valueReference == null
-        ? null
-        : (V) dereferenceValue(valueReference);
-  }
-
-  public V get(final Object key) {
-    ensureNotNull(key);
-    return internalGet((K) key);
-  }
-
-  V execute(Strategy strategy, K key, V value) {
-    ensureNotNull(key, value);
-    Object keyReference = referenceKey(key);
-    Object valueReference = strategy.execute(
-      this,
-      keyReference,
-      referenceValue(keyReference, value)
-    );
-    return valueReference == null ? null
-        : (V) dereferenceValue(valueReference);
-  }
-
-  public V put(K key, V value) {
-    return execute(putStrategy(), key, value);
-  }
-
-  public V remove(Object key) {
-    ensureNotNull(key);
-    Object referenceAwareKey = makeKeyReferenceAware(key);
-    Object valueReference = delegate.remove(referenceAwareKey);
-    return valueReference == null ? null
-        : (V) dereferenceValue(valueReference);
-  }
-
-  public int size() {
-    return delegate.size();
-  }
-
-  public boolean isEmpty() {
-    return delegate.isEmpty();
-  }
-
-  public boolean containsKey(Object key) {
-    ensureNotNull(key);
-    Object referenceAwareKey = makeKeyReferenceAware(key);
-    return delegate.containsKey(referenceAwareKey);
-  }
-
-  public boolean containsValue(Object value) {
-    ensureNotNull(value);
-    for (Object valueReference : delegate.values()) {
-      if (value.equals(dereferenceValue(valueReference))) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public void putAll(Map<? extends K, ? extends V> t) {
-    for (Map.Entry<? extends K, ? extends V> entry : t.entrySet()) {
-      put(entry.getKey(), entry.getValue());
-    }
-  }
-
-  public void clear() {
-    delegate.clear();
-  }
-
-  /**
-   * Returns an unmodifiable set view of the keys in this map. As this method
-   * creates a defensive copy, the performance is O(n).
-   */
-  public Set<K> keySet() {
-    return Collections.unmodifiableSet(
-        dereferenceKeySet(delegate.keySet()));
-  }
-
-  /**
-   * Returns an unmodifiable set view of the values in this map. As this
-   * method creates a defensive copy, the performance is O(n).
-   */
-  public Collection<V> values() {
-    return Collections.unmodifiableCollection(
-        dereferenceValues(delegate.values()));
-  }
-
-  public V putIfAbsent(K key, V value) {
-    // TODO (crazybob) if the value has been gc'ed but the entry hasn't been
-    // cleaned up yet, this put will fail.
-    return execute(putIfAbsentStrategy(), key, value);
-  }
-
-  public boolean remove(Object key, Object value) {
-    ensureNotNull(key, value);
-    Object referenceAwareKey = makeKeyReferenceAware(key);
-    Object referenceAwareValue = makeValueReferenceAware(value);
-    return delegate.remove(referenceAwareKey, referenceAwareValue);
-  }
-
-  public boolean replace(K key, V oldValue, V newValue) {
-    ensureNotNull(key, oldValue, newValue);
-    Object keyReference = referenceKey(key);
-
-    Object referenceAwareOldValue = makeValueReferenceAware(oldValue);
-    return delegate.replace(
-      keyReference,
-      referenceAwareOldValue,
-      referenceValue(keyReference, newValue)
-    );
-  }
-
-  public V replace(K key, V value) {
-    // TODO (crazybob) if the value has been gc'ed but the entry hasn't been
-    // cleaned up yet, this will succeed when it probably shouldn't.
-    return execute(replaceStrategy(), key, value);
-  }
-
-  /**
-   * Returns an unmodifiable set view of the entries in this map. As this
-   * method creates a defensive copy, the performance is O(n).
-   */
-  public Set<Map.Entry<K, V>> entrySet() {
-    Set<Map.Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>();
-    for (Map.Entry<Object, Object> entry : delegate.entrySet()) {
-      Map.Entry<K, V> dereferenced = dereferenceEntry(entry);
-      if (dereferenced != null) {
-        entrySet.add(dereferenced);
-      }
-    }
-    return Collections.unmodifiableSet(entrySet);
-  }
-
-  /**
-   * Dereferences an entry. Returns null if the key or value has been gc'ed.
-   */
-  Entry dereferenceEntry(Map.Entry<Object, Object> entry) {
-    K key = dereferenceKey(entry.getKey()); 
-    V value = dereferenceValue(entry.getValue());
-    return (key == null || value == null)
-        ? null
-        : new Entry(key, value);
-  }
-
-  /**
-   * Creates a reference for a key.
-   */
-  Object referenceKey(K key) {
-    switch (keyReferenceType) {
-      case STRONG: return key;
-      case SOFT: return new SoftKeyReference(key);
-      case WEAK: return new WeakKeyReference(key);
-      default: throw new AssertionError();
-    }
-  }
-
-  /**
-   * Converts a reference to a key.
-   */
-  K dereferenceKey(Object o) {
-    return (K) dereference(keyReferenceType, o);
-  }
-
-  /**
-   * Converts a reference to a value.
-   */
-  V dereferenceValue(Object o) {
-    return (V) dereference(valueReferenceType, o);
-  }
-
-  /**
-   * Returns the refererent for reference given its reference type.
-   */
-  Object dereference(ReferenceType referenceType, Object reference) {
-    return referenceType == STRONG ? reference : ((Reference) reference).get();
-  }
-
-  /**
-   * Creates a reference for a value.
-   */
-  Object referenceValue(Object keyReference, Object value) {
-    switch (valueReferenceType) {
-      case STRONG: return value;
-      case SOFT: return new SoftValueReference(keyReference, value);
-      case WEAK: return new WeakValueReference(keyReference, value);
-      default: throw new AssertionError();
-    }
-  }
-
-  /**
-   * Dereferences a set of key references.
-   */
-  Set<K> dereferenceKeySet(Set keyReferences) {
-    return keyReferenceType == STRONG
-        ? keyReferences
-        : dereferenceCollection(keyReferenceType, keyReferences, new HashSet());
-  }
-
-  /**
-   * Dereferences a collection of value references.
-   */
-  Collection<V> dereferenceValues(Collection valueReferences) {
-    return valueReferenceType == STRONG
-        ? valueReferences
-        : dereferenceCollection(valueReferenceType, valueReferences,
-            new ArrayList(valueReferences.size()));
-  }
-
-  /**
-   * Wraps key so it can be compared to a referenced key for equality.
-   */
-  Object makeKeyReferenceAware(Object o) {
-    return keyReferenceType == STRONG ? o : new KeyReferenceAwareWrapper(o);
-  }
-
-  /**
-   * Wraps value so it can be compared to a referenced value for equality.
-   */
-  Object makeValueReferenceAware(Object o) {
-    return valueReferenceType == STRONG ? o : new ReferenceAwareWrapper(o);
-  }
-
-  /**
-   * Dereferences elements in {@code in} using
-   * {@code referenceType} and puts them in {@code out}. Returns
-   * {@code out}.
-   */
-  <T extends Collection<Object>> T dereferenceCollection(
-      ReferenceType referenceType, T in, T out) {
-    for (Object reference : in) {
-      out.add(dereference(referenceType, reference));
-    }
-    return out;
-  }
-
-  /**
-   * Marker interface to differentiate external and internal references.
-   */
-  interface InternalReference {}
-
-  static int keyHashCode(Object key) {
-    return System.identityHashCode(key);
-  }
-
-  /**
-   * Tests weak and soft references for identity equality. Compares references
-   * to other references and wrappers. If o is a reference, this returns true
-   * if r == o or if r and o reference the same non null object. If o is a
-   * wrapper, this returns true if r's referent is identical to the wrapped
-   * object.
-   */
-  static boolean referenceEquals(Reference r, Object o) {
-    // compare reference to reference.
-    if (o instanceof InternalReference) {
-      // are they the same reference? used in cleanup.
-      if (o == r) {
-        return true;
-      }
+    private static final long serialVersionUID = 0;
 
-      // do they reference identical values? used in conditional puts.
-      Object referent = ((Reference) o).get();
-      return referent != null && referent == r.get();
-    }
+    transient ConcurrentMap<Object, Object> delegate;
 
-    // is the wrapped object identical to the referent? used in lookups.
-    return ((ReferenceAwareWrapper) o).unwrap() == r.get();
-  }
+    final ReferenceType keyReferenceType;
+    final ReferenceType valueReferenceType;
 
-  /**
-   * Big hack. Used to compare keys and values to referenced keys and values
-   * without creating more references.
-   */
-  static class ReferenceAwareWrapper {
+    /**
+     * Concurrent hash map that wraps keys and/or values based on specified
+     * reference types.
+     *
+     * @param keyReferenceType   key reference type
+     * @param valueReferenceType value reference type
+     */
+    public ReferenceMap(ReferenceType keyReferenceType,
+                        ReferenceType valueReferenceType) {
+        ensureNotNull(keyReferenceType, valueReferenceType);
 
-    Object wrapped;
+        if (keyReferenceType == ReferenceType.PHANTOM || valueReferenceType == ReferenceType.PHANTOM) {
+            throw new IllegalArgumentException("Phantom references not supported.");
+        }
 
-    ReferenceAwareWrapper(Object wrapped) {
-      this.wrapped = wrapped;
+        this.delegate = new ConcurrentHashMap<>();
+        this.keyReferenceType = keyReferenceType;
+        this.valueReferenceType = valueReferenceType;
     }
 
-    Object unwrap() {
-      return wrapped;
+    V internalGet(K key) {
+        Object valueReference = delegate.get(makeKeyReferenceAware(key));
+        return valueReference == null ? null : (V) dereferenceValue(valueReference);
     }
 
-    @Override
-    public int hashCode() {
-      return wrapped.hashCode();
+    public V get(final Object key) {
+        ensureNotNull(key);
+        return internalGet((K) key);
     }
 
-    @Override
-    public boolean equals(Object obj) {
-      // defer to reference's equals() logic.
-      return obj.equals(this);
+    V execute(Strategy strategy, K key, V value) {
+        ensureNotNull(key, value);
+        Object keyReference = referenceKey(key);
+        Object valueReference = strategy.execute(this, keyReference, referenceValue(keyReference, value));
+        return valueReference == null ? null : (V) dereferenceValue(valueReference);
     }
-  }
 
-  /**
-   * Used for keys. Overrides hash code to use identity hash code.
-   */
-  static class KeyReferenceAwareWrapper extends ReferenceAwareWrapper {
+    public V put(K key, V value) {
+        return execute(putStrategy(), key, value);
+    }
 
-    public KeyReferenceAwareWrapper(Object wrapped) {
-      super(wrapped);
+    public V remove(Object key) {
+        ensureNotNull(key);
+        Object referenceAwareKey = makeKeyReferenceAware(key);
+        Object valueReference = delegate.remove(referenceAwareKey);
+        return valueReference == null ? null : (V) dereferenceValue(valueReference);
     }
 
-    @Override
-    public int hashCode() {
-      return System.identityHashCode(wrapped);
+    public int size() {
+        return delegate.size();
     }
-  }
 
-  class SoftKeyReference extends FinalizableSoftReference<Object>
-      implements InternalReference {
+    public boolean isEmpty() {
+        return delegate.isEmpty();
+    }
 
-    int hashCode;
+    public boolean containsKey(Object key) {
+        ensureNotNull(key);
+        Object referenceAwareKey = makeKeyReferenceAware(key);
+        return delegate.containsKey(referenceAwareKey);
+    }
 
-    public SoftKeyReference(Object key) {
-      super(key);
-      this.hashCode = keyHashCode(key);
+    public boolean containsValue(Object value) {
+        ensureNotNull(value);
+        for (Object valueReference : delegate.values()) {
+            if (value.equals(dereferenceValue(valueReference))) {
+                return true;
+            }
+        }
+        return false;
     }
 
-    public void finalizeReferent() {
-      delegate.remove(this);
+    public void putAll(Map<? extends K, ? extends V> t) {
+        for (Map.Entry<? extends K, ? extends V> entry : t.entrySet()) {
+            put(entry.getKey(), entry.getValue());
+        }
     }
 
-    @Override public int hashCode() {
-      return this.hashCode;
+    public void clear() {
+        delegate.clear();
     }
 
-    @Override public boolean equals(Object o) {
-      return referenceEquals(this, o);
+    /**
+     * Returns an unmodifiable set view of the keys in this map. As this method
+     * creates a defensive copy, the performance is O(n).
+     */
+    public Set<K> keySet() {
+        return Collections.unmodifiableSet(dereferenceKeySet(delegate.keySet()));
     }
-  }
 
-  class WeakKeyReference extends FinalizableWeakReference<Object>
-      implements InternalReference {
+    /**
+     * Returns an unmodifiable set view of the values in this map. As this
+     * method creates a defensive copy, the performance is O(n).
+     */
+    public Collection<V> values() {
+        return Collections.unmodifiableCollection(dereferenceValues(delegate.values()));
+    }
+
+    public V putIfAbsent(K key, V value) {
+        // TODO (crazybob) if the value has been gc'ed but the entry hasn't been
+        // cleaned up yet, this put will fail.
+        return execute(putIfAbsentStrategy(), key, value);
+    }
 
-    int hashCode;
+    public boolean remove(Object key, Object value) {
+        ensureNotNull(key, value);
+        Object referenceAwareKey = makeKeyReferenceAware(key);
+        Object referenceAwareValue = makeValueReferenceAware(value);
+        return delegate.remove(referenceAwareKey, referenceAwareValue);
+    }
 
-    public WeakKeyReference(Object key) {
-      super(key);
-      this.hashCode = keyHashCode(key);
-    }
+    public boolean replace(K key, V oldValue, V newValue) {
+        ensureNotNull(key, oldValue, newValue);
+        Object keyReference = referenceKey(key);
+
+        Object referenceAwareOldValue = makeValueReferenceAware(oldValue);
+        return delegate.replace(keyReference, referenceAwareOldValue, referenceValue(keyReference, newValue));
+    }
+
+    public V replace(K key, V value) {
+        // TODO (crazybob) if the value has been gc'ed but the entry hasn't been
+        // cleaned up yet, this will succeed when it probably shouldn't.
+        return execute(replaceStrategy(), key, value);
+    }
+
+    /**
+     * Returns an unmodifiable set view of the entries in this map. As this
+     * method creates a defensive copy, the performance is O(n).
+     */
+    public Set<Map.Entry<K, V>> entrySet() {
+        Set<Map.Entry<K, V>> entrySet = new HashSet<>();
+        for (Map.Entry<Object, Object> entry : delegate.entrySet()) {
+            Map.Entry<K, V> dereferenced = dereferenceEntry(entry);
+            if (dereferenced != null) {
+                entrySet.add(dereferenced);
+            }
+        }
+        return Collections.unmodifiableSet(entrySet);
+    }
+
+    /**
+     * Dereferences an entry. Returns null if the key or value has been gc'ed.
+     */
+    Entry dereferenceEntry(Map.Entry<Object, Object> entry) {
+        K key = dereferenceKey(entry.getKey());
+        V value = dereferenceValue(entry.getValue());
+        return (key == null || value == null) ? null : new Entry(key, value);
+    }
+
+    /**
+     * Creates a reference for a key.
+     */
+    Object referenceKey(K key) {
+        switch (keyReferenceType) {
+            case STRONG:
+                return key;
+            case SOFT:
+                return new SoftKeyReference(key);
+            case WEAK:
+                return new WeakKeyReference(key);
+            default:
+                throw new AssertionError();
+        }
+    }
+
+    /**
+     * Converts a reference to a key.
+     */
+    K dereferenceKey(Object o) {
+        return (K) dereference(keyReferenceType, o);
+    }
+
+    /**
+     * Converts a reference to a value.
+     */
+    V dereferenceValue(Object o) {
+        return (V) dereference(valueReferenceType, o);
+    }
+
+    /**
+     * Returns the refererent for reference given its reference type.
+     */
+    Object dereference(ReferenceType referenceType, Object reference) {
+        return referenceType == STRONG ? reference : ((Reference) reference).get();
+    }
+
+    /**
+     * Creates a reference for a value.
+     */
+    Object referenceValue(Object keyReference, Object value) {
+        switch (valueReferenceType) {
+            case STRONG:
+                return value;
+            case SOFT:
+                return new SoftValueReference(keyReference, value);
+            case WEAK:
+                return new WeakValueReference(keyReference, value);
+            default:
+                throw new AssertionError();
+        }
+    }
+
+    /**
+     * Dereferences a set of key references.
+     */
+    Set<K> dereferenceKeySet(Set keyReferences) {
+        return keyReferenceType == STRONG
+                ? keyReferences
+                : dereferenceCollection(keyReferenceType, keyReferences, new HashSet());
+    }
+
+    /**
+     * Dereferences a collection of value references.
+     */
+    Collection<V> dereferenceValues(Collection valueReferences) {
+        return valueReferenceType == STRONG
+                ? valueReferences
+                : dereferenceCollection(valueReferenceType, valueReferences,
+                new ArrayList(valueReferences.size()));
+    }
+
+    /**
+     * Wraps key so it can be compared to a referenced key for equality.
+     */
+    Object makeKeyReferenceAware(Object o) {
+        return keyReferenceType == STRONG ? o : new KeyReferenceAwareWrapper(o);
+    }
+
+    /**
+     * Wraps value so it can be compared to a referenced value for equality.
+     */
+    Object makeValueReferenceAware(Object o) {
+        return valueReferenceType == STRONG ? o : new ReferenceAwareWrapper(o);
+    }
+
+    /**
+     * Dereferences elements in {@code in} using
+     * {@code referenceType} and puts them in {@code out}. Returns
+     * {@code out}.
+     */
+    <T extends Collection<Object>> T dereferenceCollection(ReferenceType referenceType, T in, T out) {
+        for (Object reference : in) {
+            out.add(dereference(referenceType, reference));
+        }
+        return out;
+    }
+
+    /**
+     * Marker interface to differentiate external and internal references.
+     */
+    interface InternalReference {
+    }
+
+    static int keyHashCode(Object key) {
+        return System.identityHashCode(key);
+    }
+
+    /**
+     * Tests weak and soft references for identity equality. Compares references
+     * to other references and wrappers. If o is a reference, this returns true
+     * if r == o or if r and o reference the same non null object. If o is a
+     * wrapper, this returns true if r's referent is identical to the wrapped
+     * object.
+     */
+    static boolean referenceEquals(Reference r, Object o) {
+        // compare reference to reference.
+        if (o instanceof InternalReference) {
+            // are they the same reference? used in cleanup.
+            if (o == r) {
+                return true;
+            }
+
+            // do they reference identical values? used in conditional puts.
+            Object referent = ((Reference) o).get();
+            return referent != null && referent == r.get();
+        }
+
+        // is the wrapped object identical to the referent? used in lookups.
+        return ((ReferenceAwareWrapper) o).unwrap() == r.get();
+    }
+
+    /**
+     * Big hack. Used to compare keys and values to referenced keys and values
+     * without creating more references.
+     */
+    static class ReferenceAwareWrapper {
+
+        Object wrapped;
+
+        ReferenceAwareWrapper(Object wrapped) {
+            this.wrapped = wrapped;
+        }
 
-    public void finalizeReferent() {
-      delegate.remove(this);
+        Object unwrap() {
+            return wrapped;
+        }
+
+        @Override
+        public int hashCode() {
+            return wrapped.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            // defer to reference's equals() logic.
+            return obj.equals(this);
+        }
     }
 
-    @Override public int hashCode() {
-      return this.hashCode;
+    /**
+     * Used for keys. Overrides hash code to use identity hash code.
+     */
+    static class KeyReferenceAwareWrapper extends ReferenceAwareWrapper {
+
+        public KeyReferenceAwareWrapper(Object wrapped) {
+            super(wrapped);
+        }
+
+        @Override
+        public int hashCode() {
+            return System.identityHashCode(wrapped);
+        }
     }
 
-    @Override public boolean equals(Object o) {
-      return referenceEquals(this, o);
+    class SoftKeyReference extends FinalizableSoftReference<Object> implements InternalReference {
+
+        int hashCode;
+
+        public SoftKeyReference(Object key) {
+            super(key);
+            this.hashCode = keyHashCode(key);
+        }
+
+        public void finalizeReferent() {
+            delegate.remove(this);
+        }
+
+        @Override
+        public int hashCode() {
+            return this.hashCode;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            return referenceEquals(this, o);
+        }
     }
-  }
 
-  class SoftValueReference extends FinalizableSoftReference<Object>
-      implements InternalReference {
+    class WeakKeyReference extends FinalizableWeakReference<Object> implements InternalReference {
+
+        int hashCode;
+
+        public WeakKeyReference(Object key) {
+            super(key);
+            this.hashCode = keyHashCode(key);
+        }
 
-    Object keyReference;
+        public void finalizeReferent() {
+            delegate.remove(this);
+        }
 
-    public SoftValueReference(Object keyReference, Object value) {
-      super(value);
-      this.keyReference = keyReference;
+        @Override
+        public int hashCode() {
+            return this.hashCode;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            return referenceEquals(this, o);
+        }
     }
 
-    public void finalizeReferent() {
-      delegate.remove(keyReference, this);
+    class SoftValueReference extends FinalizableSoftReference<Object> implements InternalReference {
+
+        Object keyReference;
+
+        public SoftValueReference(Object keyReference, Object value) {
+            super(value);
+            this.keyReference = keyReference;
+        }
+
+        public void finalizeReferent() {
+            delegate.remove(keyReference, this);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return referenceEquals(this, obj);
+        }
     }
 
-    @Override public boolean equals(Object obj) {
-      return referenceEquals(this, obj);
+    class WeakValueReference extends FinalizableWeakReference<Object> implements InternalReference {
+
+        Object keyReference;
+
+        public WeakValueReference(Object keyReference, Object value) {
+            super(value);
+            this.keyReference = keyReference;
+        }
+
+        public void finalizeReferent() {
+            delegate.remove(keyReference, this);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return referenceEquals(this, obj);
+        }
     }
-  }
 
-  class WeakValueReference extends FinalizableWeakReference<Object>
-      implements InternalReference {
+    protected interface Strategy {
+        public Object execute(ReferenceMap map, Object keyReference, Object valueReference);
+    }
 
-    Object keyReference;
+    protected Strategy putStrategy() {
+        return PutStrategy.PUT;
+    }
 
-    public WeakValueReference(Object keyReference, Object value) {
-      super(value);
-      this.keyReference = keyReference;
+    protected Strategy putIfAbsentStrategy() {
+        return PutStrategy.PUT_IF_ABSENT;
     }
 
-    public void finalizeReferent() {
-      delegate.remove(keyReference, this);
+    protected Strategy replaceStrategy() {
+        return PutStrategy.REPLACE;
     }
 
-    @Override public boolean equals(Object obj) {
-      return referenceEquals(this, obj);
+    private enum PutStrategy implements Strategy {
+        PUT {
+            public Object execute(ReferenceMap map, Object keyReference, Object valueReference) {
+                return map.delegate.put(keyReference, valueReference);
+            }
+        },
+
+        REPLACE {
+            public Object execute(ReferenceMap map, Object keyReference, Object valueReference) {
+                return map.delegate.replace(keyReference, valueReference);
+            }
+        },
+
+        PUT_IF_ABSENT {
+            public Object execute(ReferenceMap map, Object keyReference, Object valueReference) {
+                return map.delegate.putIfAbsent(keyReference, valueReference);
+            }
+        };
     }
-  }
 
-  protected interface Strategy {
-    public Object execute(ReferenceMap map, Object keyReference,
-        Object valueReference);
-  }
+    private static PutStrategy defaultPutStrategy;
 
-  protected Strategy putStrategy() {
-    return PutStrategy.PUT;
-  }
+    protected PutStrategy getPutStrategy() {
+        return defaultPutStrategy;
+    }
 
-  protected Strategy putIfAbsentStrategy() {
-    return PutStrategy.PUT_IF_ABSENT;
-  }
 
-  protected Strategy replaceStrategy() {
-    return PutStrategy.REPLACE;
-  }
+    class Entry implements Map.Entry<K, V> {
 
-  private enum PutStrategy implements Strategy {
-    PUT {
-      public Object execute(ReferenceMap map, Object keyReference,
-          Object valueReference) {
-        return map.delegate.put(keyReference, valueReference);
-      }
-    },
+        K key;
+        V value;
 
-    REPLACE {
-      public Object execute(ReferenceMap map, Object keyReference,
-          Object valueReference) {
-        return map.delegate.replace(keyReference, valueReference);
-      }
-    },
+        public Entry(K key, V value) {
+            this.key = key;
+            this.value = value;
+        }
 
-    PUT_IF_ABSENT {
-      public Object execute(ReferenceMap map, Object keyReference,
-          Object valueReference) {
-        return map.delegate.putIfAbsent(keyReference, valueReference);
-      }
-    };
-  };
+        public K getKey() {
+            return this.key;
+        }
 
-  private static PutStrategy defaultPutStrategy;
+        public V getValue() {
+            return this.value;
+        }
 
-  protected PutStrategy getPutStrategy() {
-    return defaultPutStrategy;
-  }
+        public V setValue(V value) {
+            return put(key, value);
+        }
 
+        @Override
+        public int hashCode() {
+            return key.hashCode() * 31 + value.hashCode();
+        }
 
-  class Entry implements Map.Entry<K, V> {
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof ReferenceMap.Entry)) {
+                return false;
+            }
 
-    K key;
-    V value;
+            Entry entry = (Entry) o;
+            return key.equals(entry.key) && value.equals(entry.value);
+        }
 
-    public Entry(K key, V value) {
-      this.key = key;
-      this.value = value;
+        @Override
+        public String toString() {
+            return key + "=" + value;
+        }
     }
 
-    public K getKey() {
-      return this.key;
+    static void ensureNotNull(Object o) {
+        if (o == null) {
+            throw new NullPointerException();
+        }
     }
 
-    public V getValue() {
-      return this.value;
+    static void ensureNotNull(Object... array) {
+        for (int i = 0; i < array.length; i++) {
+            if (array[i] == null) {
+                throw new NullPointerException("Argument #" + i + " is null.");
+            }
+        }
     }
 
-    public V setValue(V value) {
-      return put(key, value);
-    }
+    private void writeObject(ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        out.writeInt(size());
+        for (Map.Entry<Object, Object> entry : delegate.entrySet()) {
+            Object key = dereferenceKey(entry.getKey());
+            Object value = dereferenceValue(entry.getValue());
 
-    @Override
-    public int hashCode() {
-      return key.hashCode() * 31 + value.hashCode();
+            // don't persist gc'ed entries.
+            if (key != null && value != null) {
+                out.writeObject(key);
+                out.writeObject(value);
+            }
+        }
+        out.writeObject(null);
     }
 
-    @Override
-    public boolean equals(Object o) {
-      if (!(o instanceof ReferenceMap.Entry)) {
-        return false;
-      }
-
-      Entry entry = (Entry) o;
-      return key.equals(entry.key) && value.equals(entry.value);
-    }
-
-    @Override
-    public String toString() {
-      return key + "=" + value;
-    }
-  }
-
-  static void ensureNotNull(Object o) {
-    if (o == null) {
-      throw new NullPointerException();
-    }
-  }
-
-  static void ensureNotNull(Object... array) {
-    for (int i = 0; i < array.length; i++) {
-      if (array[i] == null) {
-        throw new NullPointerException("Argument #" + i + " is null.");
-      }
-    }
-  }
-
-  private void writeObject(ObjectOutputStream out) throws IOException  {
-    out.defaultWriteObject();
-    out.writeInt(size());
-    for (Map.Entry<Object, Object> entry : delegate.entrySet()) {
-      Object key = dereferenceKey(entry.getKey());
-      Object value = dereferenceValue(entry.getValue());
-
-      // don't persist gc'ed entries.
-      if (key != null && value != null) {
-        out.writeObject(key);
-        out.writeObject(value);
-      }
-    }
-    out.writeObject(null);
-  }
-
-  private void readObject(ObjectInputStream in) throws IOException,
-      ClassNotFoundException {
-    in.defaultReadObject();
-    int size = in.readInt();
-    this.delegate = new ConcurrentHashMap<Object, Object>(size);
-    while (true) {
-      K key = (K) in.readObject();
-      if (key == null) {
-        break;
-      }
-      V value = (V) in.readObject();
-      put(key, value);
-    }
-  }
+    private void readObject(ObjectInputStream in) throws IOException,
+            ClassNotFoundException {
+        in.defaultReadObject();
+        int size = in.readInt();
+        this.delegate = new ConcurrentHashMap<Object, Object>(size);
+        while (true) {
+            K key = (K) in.readObject();
+            if (key == null) {
+                break;
+            }
+            V value = (V) in.readObject();
+            put(key, value);
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java
index f05a75c..7bd9499 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java
@@ -20,15 +20,15 @@ import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ValidationAware;
 import com.opensymphony.xwork2.XWorkConstants;
-import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
-import com.opensymphony.xwork2.util.ValueStack;
+import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.ClearableValueStack;
-import com.opensymphony.xwork2.util.ValueStackFactory;
 import com.opensymphony.xwork2.util.LocalizedTextUtil;
+import com.opensymphony.xwork2.util.ValueStack;
+import com.opensymphony.xwork2.util.ValueStackFactory;
 import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Map;
 
@@ -184,9 +184,7 @@ public class AliasInterceptor extends AbstractInterceptor {
                 if (clearableStack && (stack.getContext() != null) && (newStack.getContext() != null))
                     stack.getContext().put(ActionContext.CONVERSION_ERRORS, newStack.getContext().get(ActionContext.CONVERSION_ERRORS));
             } else {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("invalid alias expression:" + aliasesKey);
-                }
+                LOG.debug("invalid alias expression: {}", aliasesKey);
             }
         }
         

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ConversionErrorInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ConversionErrorInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ConversionErrorInterceptor.java
index 8022790..47d020a 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ConversionErrorInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ConversionErrorInterceptor.java
@@ -115,7 +115,7 @@ public class ConversionErrorInterceptor extends AbstractInterceptor {
                 }
 
                 if (fakie == null) {
-                    fakie = new HashMap<Object, Object>();
+                    fakie = new HashMap<>();
                 }
 
                 fakie.put(propertyName, getOverrideExpr(invocation, value));

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java
index a2ac59c..13cea0e 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/DefaultWorkflowInterceptor.java
@@ -19,8 +19,9 @@ import com.opensymphony.xwork2.Action;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ValidationAware;
 import com.opensymphony.xwork2.interceptor.annotations.InputConfig;
-import org.apache.logging.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.lang.reflect.Method;
 
@@ -185,7 +186,7 @@ public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {
         String resultName = currentResultName;
         InputConfig annotation = action.getClass().getMethod(method, EMPTY_CLASS_ARRAY).getAnnotation(InputConfig.class);
         if (annotation != null) {
-            if (!annotation.methodName().equals("")) {
+            if (StringUtils.isNotEmpty(annotation.methodName())) {
                 Method m = action.getClass().getMethod(annotation.methodName());
                 resultName = (String) m.invoke(action);
             } else {

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
index 99aadef..afdd534 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
@@ -18,8 +18,8 @@ package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.LocalizedTextUtil;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Locale;
 import java.util.Map;
@@ -103,9 +103,7 @@ public class I18nInterceptor extends AbstractInterceptor {
     protected enum Storage { SESSION, NONE }
 
     public I18nInterceptor() {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("new I18nInterceptor()");
-        }
+        LOG.debug("new I18nInterceptor()");
     }
 
     public void setParameterName(String parameterName) {
@@ -123,8 +121,7 @@ public class I18nInterceptor extends AbstractInterceptor {
     @Override
     public String intercept(ActionInvocation invocation) throws Exception {
         if (LOG.isDebugEnabled()) {
-            LOG.debug("Intercept '{}/{}' {",
-                invocation.getProxy().getNamespace(), invocation.getProxy().getActionName());
+            LOG.debug("Intercept '{}/{}' {", invocation.getProxy().getNamespace(), invocation.getProxy().getActionName());
         }
 
         LocaleFinder localeFinder = new LocaleFinder(invocation);

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/LoggingInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/LoggingInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/LoggingInterceptor.java
index 2ec655e..c82532f 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/LoggingInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/LoggingInterceptor.java
@@ -16,8 +16,8 @@
 package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 
 /**
@@ -79,9 +79,7 @@ public class LoggingInterceptor extends AbstractInterceptor {
             }
 
             message.append(invocation.getProxy().getActionName());
-            if (LOG.isInfoEnabled()) {
         	LOG.info(message.toString());
-            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptor.java
index 0cdedb0..a46cf34 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptor.java
@@ -18,8 +18,8 @@ package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.TextParseUtil;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Collections;
 import java.util.Set;
@@ -104,10 +104,8 @@ public abstract class MethodFilterInterceptor extends AbstractInterceptor {
         String method = invocation.getProxy().getMethod();
         // ValidationInterceptor
         boolean applyMethod = MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, method);
-        if (log.isDebugEnabled()) {
-        	if (!applyMethod) {
-        		log.debug("Skipping Interceptor... Method [" + method + "] found in exclude list.");
-        	}
+        if (!applyMethod) {
+            log.debug("Skipping Interceptor... Method [{}] found in exclude list.", method);
         }
         return applyMethod;
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptorUtil.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptorUtil.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptorUtil.java
index ce0dbef..987d782 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptorUtil.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/MethodFilterInterceptorUtil.java
@@ -86,7 +86,7 @@ public class MethodFilterInterceptorUtil {
         for (String pattern : includeMethods) {
             if (pattern.contains("*")) {
                 int[] compiledPattern = wildcard.compilePattern(pattern);
-                HashMap<String,String> matchedPatterns = new HashMap<String, String>();
+                HashMap<String, String> matchedPatterns = new HashMap<>();
                 boolean matches = wildcard.match(matchedPatterns, methodCopy, compiledPattern);
                 if (matches) {
                     return true; // run it, includeMethods takes precedence
@@ -106,7 +106,7 @@ public class MethodFilterInterceptorUtil {
         for ( String pattern : excludeMethods) {
             if (pattern.contains("*")) {
                 int[] compiledPattern = wildcard.compilePattern(pattern);
-                HashMap<String,String> matchedPatterns = new HashMap<String, String>();
+                HashMap<String, String> matchedPatterns = new HashMap<>();
                 boolean matches = wildcard.match(matchedPatterns, methodCopy, compiledPattern);
                 if (matches) {
                     // if found, and wasn't included earlier, don't run it

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterFilterInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterFilterInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterFilterInterceptor.java
index 1e4b036..46767d5 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterFilterInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterFilterInterceptor.java
@@ -17,8 +17,9 @@ package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.TextParseUtil;
-import org.apache.logging.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -106,7 +107,7 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
     public String intercept(ActionInvocation invocation) throws Exception {
 
         Map<String, Object> parameters = invocation.getInvocationContext().getParameters();
-        HashSet<String> paramsToRemove = new HashSet<String>();
+        HashSet<String> paramsToRemove = new HashSet<>();
 
         Map<String, Boolean> includesExcludesMap = getIncludesExcludesMap();
 
@@ -116,7 +117,7 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
             for (String currRule : includesExcludesMap.keySet()) {
                 if (param.startsWith(currRule)
                         && (param.length() == currRule.length()
-                        || isPropSeperator(param.charAt(currRule.length())))) {
+                        || isPropertySeparator(param.charAt(currRule.length())))) {
                     currentAllowed = includesExcludesMap.get(currRule).booleanValue();
                 }
             }
@@ -125,9 +126,7 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
             }
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Params to remove: " + paramsToRemove);
-        }
+        LOG.debug("Params to remove: {}", paramsToRemove);
 
         for (Object aParamsToRemove : paramsToRemove) {
             parameters.remove(aParamsToRemove);
@@ -137,18 +136,18 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
     }
 
     /**
-     * Tests if the given char is a property seperator char <code>.([</code>.
+     * Tests if the given char is a property separator char <code>.([</code>.
      *
      * @param c the char
      * @return <tt>true</tt>, if char is property separator, <tt>false</tt> otherwise.
      */
-    private static boolean isPropSeperator(char c) {
+    private static boolean isPropertySeparator(char c) {
         return c == '.' || c == '(' || c == '[';
     }
 
     private Map<String, Boolean> getIncludesExcludesMap() {
         if (this.includesExcludesMap == null) {
-            this.includesExcludesMap = new TreeMap<String, Boolean>();
+            this.includesExcludesMap = new TreeMap<>();
 
             if (getAllowedCollection() != null) {
                 for (String e : getAllowedCollection()) {
@@ -228,7 +227,7 @@ public class ParameterFilterInterceptor extends AbstractInterceptor {
      * @return A collection from the comma delimited String. Returns <tt>null</tt> if the string is empty.
      */
     private Collection<String> asCollection(String commaDelim) {
-        if (commaDelim == null || commaDelim.trim().length() == 0) {
+        if (StringUtils.isBlank(commaDelim)) {
             return null;
         }
         return TextParseUtil.commaDelimitedStringToSet(commaDelim);

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterRemoverInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterRemoverInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterRemoverInterceptor.java
index 523831c..68bb154 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterRemoverInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParameterRemoverInterceptor.java
@@ -18,8 +18,8 @@ package com.opensymphony.xwork2.interceptor;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.TextParseUtil;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Collections;
 import java.util.Map;
@@ -84,7 +84,6 @@ public class ParameterRemoverInterceptor extends AbstractInterceptor {
 	private static final long serialVersionUID = 1;
 
 	private Set<String> paramNames = Collections.emptySet();
-
 	private Set<String> paramValues = Collections.emptySet();
 
 	
@@ -107,18 +106,15 @@ public class ParameterRemoverInterceptor extends AbstractInterceptor {
                     if (parameters.containsKey(removeName)) {
 
                         try {
-                            String[] values = (String[]) parameters
-                                    .get(removeName);
-                            String value = values[0];
-                            if (null != value && this.paramValues.contains(value)) {
+							String[] values = (String[]) parameters.get(removeName);
+							String value = values[0];
+							if (null != value && this.paramValues.contains(value)) {
                                 parameters.remove(removeName);
                             }
                         } catch (Exception e) {
-                            if (LOG.isErrorEnabled()) {
-                                LOG.error("Failed to convert parameter to string", e);
-                            }
-                        }
-                    }
+							LOG.error("Failed to convert parameter to string", e);
+						}
+					}
                 }
 			}
 		}

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
index 78d873d..8496610 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
@@ -17,21 +17,18 @@ package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.security.AcceptedPatternsChecker;
-import com.opensymphony.xwork2.security.ExcludedPatternsChecker;
 import com.opensymphony.xwork2.ValidationAware;
 import com.opensymphony.xwork2.XWorkConstants;
 import com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler;
 import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
 import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.util.ClearableValueStack;
-import com.opensymphony.xwork2.util.LocalizedTextUtil;
-import com.opensymphony.xwork2.util.MemberAccessValueStack;
-import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.util.ValueStackFactory;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
+import com.opensymphony.xwork2.security.AcceptedPatternsChecker;
+import com.opensymphony.xwork2.security.ExcludedPatternsChecker;
+import com.opensymphony.xwork2.util.*;
 import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Collection;
 import java.util.Comparator;
@@ -155,7 +152,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
 
     @Inject(XWorkConstants.DEV_MODE)
     public void setDevMode(String mode) {
-        devMode = "true".equalsIgnoreCase(mode);
+        this.devMode = BooleanUtils.toBoolean(mode);
     }
 
     @Inject
@@ -207,7 +204,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
             final Map<String, Object> parameters = retrieveParameters(ac);
 
             if (LOG.isDebugEnabled()) {
-                LOG.debug("Setting params " + getParameterLogMap(parameters));
+                LOG.debug("Setting params {}", getParameterLogMap(parameters));
             }
 
             if (parameters != null) {
@@ -256,12 +253,12 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
         Map<String, Object> params;
         Map<String, Object> acceptableParameters;
         if (ordered) {
-            params = new TreeMap<String, Object>(getOrderedComparator());
-            acceptableParameters = new TreeMap<String, Object>(getOrderedComparator());
+            params = new TreeMap<>(getOrderedComparator());
+            acceptableParameters = new TreeMap<>(getOrderedComparator());
             params.putAll(parameters);
         } else {
-            params = new TreeMap<String, Object>(parameters);
-            acceptableParameters = new TreeMap<String, Object>();
+            params = new TreeMap<>(parameters);
+            acceptableParameters = new TreeMap<>();
         }
 
         for (Map.Entry<String, Object> entry : params.entrySet()) {
@@ -447,9 +444,7 @@ public class ParametersInterceptor extends MethodFilterInterceptor {
         if (devMode) {
             LOG.warn(message, parameters);
         } else {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug(message, parameters);
-            }
+            LOG.debug(message, parameters);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
index 8cf10ac..9d32fbe 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ScopedModelDrivenInterceptor.java
@@ -95,7 +95,7 @@ public class ScopedModelDrivenInterceptor extends AbstractInterceptor {
     }
     
     protected Object resolveModel(ObjectFactory factory, ActionContext actionContext, String modelClassName, String modelScope, String modelName) throws Exception {
-        Object model = null;
+        Object model;
         Map<String, Object> scopeMap = actionContext.getContextMap();
         if ("session".equals(modelScope)) {
             scopeMap = actionContext.getSession();

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java
index 67e121c..25fd8d6 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java
@@ -19,13 +19,14 @@ import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ValidationAware;
 import com.opensymphony.xwork2.XWorkConstants;
-import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.config.entities.Parameterizable;
+import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.*;
 import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
-import org.apache.logging.log4j.Logger;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.Collections;
 import java.util.Map;
@@ -84,8 +85,7 @@ public class StaticParametersInterceptor extends AbstractInterceptor {
     private boolean parse;
     private boolean overwrite;
     private boolean merge = true;
-
-    static boolean devMode = false;
+    private boolean devMode = false;
 
     private static final Logger LOG = LogManager.getLogger(StaticParametersInterceptor.class);
 
@@ -97,16 +97,16 @@ public class StaticParametersInterceptor extends AbstractInterceptor {
     }
 
     @Inject(XWorkConstants.DEV_MODE)
-    public static void setDevMode(String mode) {
-        devMode = "true".equals(mode);
+    public void setDevMode(String mode) {
+        devMode = BooleanUtils.toBoolean(mode);
     }    
 
     public void setParse(String value) {
-        this.parse = Boolean.valueOf(value).booleanValue();
+        this.parse = BooleanUtils.toBoolean(value);
     }
 
      public void setMerge(String value) {
-        this.merge = Boolean.valueOf(value).booleanValue();
+         this.merge = BooleanUtils.toBoolean(value);
     }
 
     /**
@@ -116,7 +116,7 @@ public class StaticParametersInterceptor extends AbstractInterceptor {
      * @param value
      */
     public void setOverwrite(String value) {
-        this.overwrite = Boolean.valueOf(value).booleanValue();
+        this.overwrite = BooleanUtils.toBoolean(value);
     }
 
     @Override
@@ -126,9 +126,7 @@ public class StaticParametersInterceptor extends AbstractInterceptor {
 
         final Map<String, String> parameters = config.getParams();
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Setting static parameters " + parameters);
-        }
+        LOG.debug("Setting static parameters: {}", parameters);
 
         // for actions marked as Parameterizable, pass the static parameters directly
         if (action instanceof Parameterizable) {
@@ -220,18 +218,18 @@ public class StaticParametersInterceptor extends AbstractInterceptor {
         Map<String, Object> combinedParams;
         if ( overwrite ) {
             if (previousParams != null) {
-                combinedParams = new TreeMap<String, Object>(previousParams);
+                combinedParams = new TreeMap<>(previousParams);
             } else {
-                combinedParams = new TreeMap<String, Object>();
+                combinedParams = new TreeMap<>();
             }
             if ( newParams != null) {
                 combinedParams.putAll(newParams);
             }
         } else {
             if (newParams != null) {
-                combinedParams = new TreeMap<String, Object>(newParams);
+                combinedParams = new TreeMap<>(newParams);
             } else {
-                combinedParams = new TreeMap<String, Object>();
+                combinedParams = new TreeMap<>();
             }
             if ( previousParams != null) {
                 combinedParams.putAll(previousParams);

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/TimerInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/TimerInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/TimerInterceptor.java
index a52c092..7cc4918 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/TimerInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/TimerInterceptor.java
@@ -16,8 +16,9 @@
 package com.opensymphony.xwork2.interceptor;
 
 import com.opensymphony.xwork2.ActionInvocation;
-import org.apache.logging.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * <!-- START SNIPPET: description -->
@@ -138,7 +139,7 @@ public class TimerInterceptor extends AbstractInterceptor {
         StringBuilder message = new StringBuilder(100);
         message.append("Executed action [");
         String namespace = invocation.getProxy().getNamespace();
-        if ((namespace != null) && (namespace.trim().length() > 0)) {
+        if (StringUtils.isNotBlank(namespace)) {
             message.append(namespace).append("/");
         }
         message.append(invocation.getProxy().getActionName());

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
index 1660b07..f978e46 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationParameterFilterIntereptor.java
@@ -43,8 +43,8 @@ public class AnnotationParameterFilterIntereptor extends AbstractInterceptor {
         }
 
         boolean blockByDefault = action.getClass().isAnnotationPresent(BlockByDefault.class);
-        List<Field> annotatedFields = new ArrayList<Field>();
-        HashSet<String> paramsToRemove = new HashSet<String>();
+        List<Field> annotatedFields = new ArrayList<>();
+        HashSet<String> paramsToRemove = new HashSet<>();
 
         if (blockByDefault) {
             AnnotationUtils.addAllFields(Allowed.class, action.getClass(), annotatedFields);
@@ -75,7 +75,6 @@ public class AnnotationParameterFilterIntereptor extends AbstractInterceptor {
             }
 
             for (String paramName : parameters.keySet()) {
-
                 for (Field field : annotatedFields) {
                     //TODO only matches exact field names.  need to change to it matches start of ognl expression
                     //i.e take param name up to first . (period) and match against that

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
index 648a65a..665ed1c 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/annotations/AnnotationWorkflowInterceptor.java
@@ -113,7 +113,7 @@ public class AnnotationWorkflowInterceptor extends AbstractInterceptor implement
     public String intercept(ActionInvocation invocation) throws Exception {
         final Object action = invocation.getAction();
         invocation.addPreResultListener(this);
-        List<Method> methods = new ArrayList<Method>(AnnotationUtils.getAnnotatedMethods(action.getClass(), Before.class));
+        List<Method> methods = new ArrayList<>(AnnotationUtils.getAnnotatedMethods(action.getClass(), Before.class));
         if (methods.size() > 0) {
             // methods are only sorted by priority
             Collections.sort(methods, new Comparator<Method>() {
@@ -123,8 +123,7 @@ public class AnnotationWorkflowInterceptor extends AbstractInterceptor implement
                 }
             });
             for (Method m : methods) {
-                final String resultCode = (String) m
-                        .invoke(action, (Object[]) null);
+                final String resultCode = (String) m.invoke(action, (Object[]) null);
                 if (resultCode != null) {
                     // shortcircuit execution
                     return resultCode;

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
index b67b4ff..0749689 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
@@ -40,8 +40,8 @@ public class MockActionInvocation implements ActionInvocation {
     private Result result;
     private String resultCode;
     private ValueStack stack;
-    
-    private List<PreResultListener> preResultListeners = new ArrayList<PreResultListener>();
+
+    private List<PreResultListener> preResultListeners = new ArrayList<>();
 
     public Object getAction() {
         return action;

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionProxy.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionProxy.java b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionProxy.java
index 9e8567c..f373591 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionProxy.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionProxy.java
@@ -20,6 +20,7 @@ import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ActionProxy;
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * Mock for an {@link ActionProxy}.
@@ -110,7 +111,7 @@ public class MockActionProxy implements ActionProxy {
 
     public void setMethod(String method) {
         this.method = method;
-        methodSpecified=method!=null && !"".equals(method);
+        methodSpecified = StringUtils.isNotEmpty(method);
     }
 
     public boolean isMethodSpecified()

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockResult.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockResult.java b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockResult.java
index 16b2a21..571469c 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockResult.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockResult.java
@@ -34,11 +34,7 @@ public class MockResult implements Result {
             return true;
         }
 
-        if (!(o instanceof MockResult)) {
-            return false;
-        }
-
-        return true;
+        return o instanceof MockResult;
     }
 
     public void execute(ActionInvocation invocation) throws Exception {

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
index 55a71be..ad79542 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java
@@ -26,12 +26,12 @@ import java.util.Map;
 public class OgnlTypeConverterWrapper implements ognl.TypeConverter {
 
     private TypeConverter typeConverter;
-    
-    public OgnlTypeConverterWrapper(TypeConverter conv) {
-        if (conv == null) {
+
+    public OgnlTypeConverterWrapper(TypeConverter converter) {
+        if (converter == null) {
             throw new IllegalArgumentException("Wrapped type converter cannot be null");
         }
-        this.typeConverter = conv;
+        this.typeConverter = converter;
     }
     
     public Object convertValue(Map context, Object target, Member member,

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
index a67ede9..45e9992 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
@@ -23,27 +23,18 @@ import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor;
 import com.opensymphony.xwork2.util.CompoundRoot;
 import com.opensymphony.xwork2.util.TextParseUtil;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
 import com.opensymphony.xwork2.util.reflection.ReflectionException;
-import ognl.ClassResolver;
-import ognl.Ognl;
-import ognl.OgnlContext;
-import ognl.OgnlException;
-import ognl.OgnlRuntime;
-import ognl.SimpleNode;
-import ognl.TypeConverter;
+import ognl.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.regex.Pattern;
@@ -58,16 +49,16 @@ import java.util.regex.Pattern;
 public class OgnlUtil {
 
     private static final Logger LOG = LogManager.getLogger(OgnlUtil.class);
-    private ConcurrentMap<String, Object> expressions = new ConcurrentHashMap<String, Object>();
-    private final ConcurrentMap<Class, BeanInfo> beanInfoCache = new ConcurrentHashMap<Class, BeanInfo>();
+    private ConcurrentMap<String, Object> expressions = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Class, BeanInfo> beanInfoCache = new ConcurrentHashMap<>();
     private TypeConverter defaultConverter;
 
     private boolean devMode = false;
     private boolean enableExpressionCache = true;
     private boolean enableEvalExpression;
 
-    private Set<Class<?>> excludedClasses = new HashSet<Class<?>>();
-    private Set<Pattern> excludedPackageNamePatterns = new HashSet<Pattern>();
+    private Set<Class<?>> excludedClasses = new HashSet<>();
+    private Set<Pattern> excludedPackageNamePatterns = new HashSet<>();
 
     private Container container;
     private boolean allowStaticMethodAccess;
@@ -79,12 +70,12 @@ public class OgnlUtil {
 
     @Inject(XWorkConstants.DEV_MODE)
     public void setDevMode(String mode) {
-        devMode = "true".equals(mode);
+        this.devMode = BooleanUtils.toBoolean(mode);
     }
 
     @Inject(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE)
     public void setEnableExpressionCache(String cache) {
-       enableExpressionCache = "true".equals(cache);
+        enableExpressionCache = BooleanUtils.toBoolean(cache);
     }
 
     @Inject(value = XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, required = false)
@@ -249,12 +240,9 @@ public class OgnlUtil {
 
             try {
                 for (Object target : cr) {
-                    if (
-                            OgnlRuntime.hasSetProperty((OgnlContext) context, target, property)
-                                    ||
-                                    OgnlRuntime.hasGetProperty((OgnlContext) context, target, property)
-                                    ||
-                                    OgnlRuntime.getIndexedPropertyType((OgnlContext) context, target.getClass(), property) != OgnlRuntime.INDEXED_PROPERTY_NONE
+                    if (OgnlRuntime.hasSetProperty((OgnlContext) context, target, property)
+                            || OgnlRuntime.hasGetProperty((OgnlContext) context, target, property)
+                            || OgnlRuntime.getIndexedPropertyType((OgnlContext) context, target.getClass(), property) != OgnlRuntime.INDEXED_PROPERTY_NONE
                             ) {
                         return target;
                     }
@@ -269,7 +257,6 @@ public class OgnlUtil {
         return root;
     }
 
-
     /**
      * Wrapper around Ognl.setValue() to handle type conversion for collection elements.
      * Ideally, this should be handled by OGNL directly.
@@ -373,18 +360,15 @@ public class OgnlUtil {
      */
     public void copy(final Object from, final Object to, final Map<String, Object> context, Collection<String> exclusions, Collection<String> inclusions) {
         if (from == null || to == null) {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Attempting to copy from or to a null source. This is illegal and is bein skipped. This may be due to an error in an OGNL expression, action chaining, or some other event.");
-            }
-
+            LOG.warn("Attempting to copy from or to a null source. This is illegal and is bein skipped. This may be due to an error in an OGNL expression, action chaining, or some other event.");
             return;
         }
 
-        TypeConverter conv = getTypeConverterFromContext(context);
+        TypeConverter converter = getTypeConverterFromContext(context);
         final Map contextFrom = createDefaultContext(from, null);
-        Ognl.setTypeConverter(contextFrom, conv);
+        Ognl.setTypeConverter(contextFrom, converter);
         final Map contextTo = createDefaultContext(to, null);
-        Ognl.setTypeConverter(contextTo, conv);
+        Ognl.setTypeConverter(contextTo, converter);
 
         PropertyDescriptor[] fromPds;
         PropertyDescriptor[] toPds;
@@ -393,13 +377,11 @@ public class OgnlUtil {
             fromPds = getPropertyDescriptors(from);
             toPds = getPropertyDescriptors(to);
         } catch (IntrospectionException e) {
-            if (LOG.isErrorEnabled()) {
-                LOG.error("An error occured", e);
-            }
+            LOG.error("An error occurred", e);
             return;
         }
 
-        Map<String, PropertyDescriptor> toPdHash = new HashMap<String, PropertyDescriptor>();
+        Map<String, PropertyDescriptor> toPdHash = new HashMap<>();
 
         for (PropertyDescriptor toPd : toPds) {
             toPdHash.put(toPd.getName(), toPd);
@@ -427,9 +409,7 @@ public class OgnlUtil {
                             });
 
                         } catch (OgnlException e) {
-                            if (LOG.isDebugEnabled()) {
-                                LOG.debug("Got OGNL exception", e);
-                            }
+                            LOG.debug("Got OGNL exception", e);
                         }
                     }
 
@@ -491,7 +471,7 @@ public class OgnlUtil {
      * @throws OgnlException          is thrown by OGNL if the property value could not be retrieved
      */
     public Map<String, Object> getBeanMap(final Object source) throws IntrospectionException, OgnlException {
-        Map<String, Object> beanMap = new HashMap<String, Object>();
+        Map<String, Object> beanMap = new HashMap<>();
         final Map sourceMap = createDefaultContext(source, null);
         PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(source);
         for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
index f4cc3fe..af7fbc5 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java
@@ -27,11 +27,11 @@ import com.opensymphony.xwork2.util.ClearableValueStack;
 import com.opensymphony.xwork2.util.CompoundRoot;
 import com.opensymphony.xwork2.util.MemberAccessValueStack;
 import com.opensymphony.xwork2.util.ValueStack;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-import com.opensymphony.xwork2.util.logging.LoggerUtils;
 import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
 import ognl.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -97,12 +97,12 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
 
     @Inject(XWorkConstants.DEV_MODE)
     public void setDevMode(String mode) {
-        devMode = "true".equalsIgnoreCase(mode);
+        this.devMode = BooleanUtils.toBoolean(mode);
     }
 
     @Inject(value = "logMissingProperties", required = false)
     public void setLogMissingProperties(String logMissingProperties) {
-        this.logMissingProperties = "true".equalsIgnoreCase(logMissingProperties);
+        this.logMissingProperties = BooleanUtils.toBoolean(logMissingProperties);
     }
 
     /**
@@ -207,11 +207,9 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
     	boolean shouldLog = shouldLogMissingPropertyWarning(e);
     	String msg = null;
     	if (throwExceptionOnFailure || shouldLog) {
-    		msg = ErrorMessageBuilder.create()
-                    .errorSettingExpressionWithValue(expr, value)
-                    .build();
-    	}
-    	if (shouldLog) {
+            msg = ErrorMessageBuilder.create().errorSettingExpressionWithValue(expr, value).build();
+        }
+        if (shouldLog) {
             LOG.warn(msg, e);
     	}
     	
@@ -451,7 +449,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS
         XWorkConverter xworkConverter = cont.getInstance(XWorkConverter.class);
         CompoundRootAccessor accessor = (CompoundRootAccessor) cont.getInstance(PropertyAccessor.class, CompoundRoot.class.getName());
         TextProvider prov = cont.getInstance(TextProvider.class, "system");
-        boolean allow = "true".equals(cont.getInstance(String.class, XWorkConstants.ALLOW_STATIC_METHOD_ACCESS));
+        boolean allow = BooleanUtils.toBoolean(cont.getInstance(String.class, XWorkConstants.ALLOW_STATIC_METHOD_ACCESS));
         OgnlValueStack aStack = new OgnlValueStack(xworkConverter, accessor, prov, allow);
         aStack.setOgnlUtil(cont.getInstance(OgnlUtil.class));
         aStack.setRoot(xworkConverter, accessor, this.root, allow);

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
index 2edfa9f..7617494 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java
@@ -28,6 +28,7 @@ import com.opensymphony.xwork2.util.ValueStackFactory;
 import ognl.MethodAccessor;
 import ognl.OgnlRuntime;
 import ognl.PropertyAccessor;
+import org.apache.commons.lang3.BooleanUtils;
 
 import java.util.Map;
 import java.util.Set;
@@ -44,8 +45,8 @@ public class OgnlValueStackFactory implements ValueStackFactory {
     private boolean allowStaticMethodAccess;
 
     @Inject
-    public void setXWorkConverter(XWorkConverter conv) {
-        this.xworkConverter = conv;
+    public void setXWorkConverter(XWorkConverter converter) {
+        this.xworkConverter = converter;
     }
     
     @Inject("system")
@@ -55,7 +56,7 @@ public class OgnlValueStackFactory implements ValueStackFactory {
     
     @Inject(value="allowStaticMethodAccess", required=false)
     public void setAllowStaticMethodAccess(String allowStaticMethodAccess) {
-        this.allowStaticMethodAccess = "true".equalsIgnoreCase(allowStaticMethodAccess);
+        this.allowStaticMethodAccess = BooleanUtils.toBoolean(allowStaticMethodAccess);
     }
 
     public ValueStack createValueStack() {

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
index 075237b..2afd3d6 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
@@ -15,9 +15,9 @@
  */
 package com.opensymphony.xwork2.ognl;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
 import ognl.DefaultMemberAccess;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.lang.reflect.Member;
 import java.lang.reflect.Modifier;
@@ -53,7 +53,7 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
     @Override
     public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
         if (checkEnumAccess(target, member)) {
-            LOG.trace("Allowing access to enum {}", target);
+            LOG.trace("Allowing access to enum: {}", target);
             return true;
         }
 
@@ -89,12 +89,12 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
         }
 
         //failed static test
-        if (!allow)
+        if (!allow) {
             return false;
+        }
 
         // Now check for standard scope rules
-        return super.isAccessible(context, target, member, propertyName)
-                && isAcceptableProperty(propertyName);
+        return super.isAccessible(context, target, member, propertyName) && isAcceptableProperty(propertyName);
     }
 
     protected boolean checkStaticMethodAccess(Member member) {
@@ -109,8 +109,9 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
     protected boolean checkEnumAccess(Object target, Member member) {
         if (target instanceof Class) {
             Class clazz = (Class) target;
-            if (Enum.class.isAssignableFrom(clazz) && member.getName().equals("values"))
+            if (Enum.class.isAssignableFrom(clazz) && member.getName().equals("values")) {
                 return true;
+            }
         }
         return false;
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/2e9df577/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
----------------------------------------------------------------------
diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
index d02e84b..3beb14a 100644
--- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
+++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java
@@ -21,9 +21,10 @@ import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.ognl.OgnlValueStack;
 import com.opensymphony.xwork2.util.CompoundRoot;
 import com.opensymphony.xwork2.util.ValueStack;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
 import ognl.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.beans.IntrospectionException;
 import java.beans.PropertyDescriptor;
@@ -58,13 +59,12 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
 
     private final static Logger LOG = LogManager.getLogger(CompoundRootAccessor.class);
     private final static Class[] EMPTY_CLASS_ARRAY = new Class[0];
-    private static Map<MethodCall, Boolean> invalidMethods = new ConcurrentHashMap<MethodCall, Boolean>();
-
-    static boolean devMode = false;
+    private static Map<MethodCall, Boolean> invalidMethods = new ConcurrentHashMap<>();
+    private boolean devMode = false;
 
     @Inject(XWorkConstants.DEV_MODE)
-    public static void setDevMode(String mode) {
-        devMode = "true".equals(mode);
+    public void setDevMode(String mode) {
+        this.devMode = BooleanUtils.toBoolean(mode);
     }
 
     public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException {
@@ -121,7 +121,6 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
 
         if (name instanceof Integer) {
             Integer index = (Integer) name;
-
             return root.cutStack(index);
         } else if (name instanceof String) {
             if ("top".equals(name)) {
@@ -187,7 +186,7 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
                     }
                 }
 
-                SortedSet<String> set = new TreeSet<String>();
+                SortedSet<String> set = new TreeSet<>();
                 StringBuffer sb = new StringBuffer();
                 for (PropertyDescriptor pd : descriptors.values()) {
 
@@ -209,12 +208,9 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C
                 }
 
                 return sb.toString();
-            } catch (IntrospectionException e) {
-                LOG.debug("Got exception in callMethod", e);
-            } catch (OgnlException e) {
+            } catch (IntrospectionException | OgnlException e) {
                 LOG.debug("Got exception in callMethod", e);
             }
-
             return null;
         }