You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/12/17 06:50:47 UTC

svn commit: r1720487 - in /jackrabbit/oak/trunk: oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/ oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/ oak-core...

Author: chetanm
Date: Thu Dec 17 05:50:47 2015
New Revision: 1720487

URL: http://svn.apache.org/viewvc?rev=1720487&view=rev
Log:
OAK-3802 - SessionMBean not getting registered due to MalformedObjectNameException

Moved the quote related logic to oak-commons. The quote logic is now made more robust to handle all possible cases and makes best effort to avoid unnecessary quoting

Added:
    jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java   (with props)
    jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtilTest.java
      - copied, changed from r1720389, jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java
Modified:
    jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtilsTest.java

Added: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java?rev=1720487&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java (added)
+++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java Thu Dec 17 05:50:47 2015
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.commons.jmx;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * Utility methods related to JMX
+ */
+public final class JmxUtil {
+
+    /**
+     * Checks if the passed value string can be used as is as part of
+     * JMX {@link javax.management.ObjectName} If it cannot be used then
+     * it would return a quoted string which is then safe to be used
+     * as part of ObjectName.
+     *
+     * <p>This is meant to avoid unnecessary quoting of value</p>
+     *
+     * @param unquotedValue to quote if required
+     * @return passed value or quoted value if required
+     */
+    public static String quoteValueIfRequired(String unquotedValue) {
+        String result;
+        String quotedValue = ObjectName.quote(unquotedValue);
+
+        //Check if some chars are escaped or not. In that case
+        //length of quoted string (excluding quotes) would differ
+        if (quotedValue.substring(1, quotedValue.length() - 1).equals(unquotedValue)) {
+            try {
+                //Quoting logic in ObjectName does not escape ',', '='
+                //etc. So try now by constructing ObjectName. If that
+                //passes then value can be used as safely
+
+                //Also we cannot just rely on ObjectName as it treats
+                //*, ? as pattern chars and which should ideally be escaped
+                new ObjectName("dummy", "dummy", unquotedValue);
+                result = unquotedValue;
+            } catch (MalformedObjectNameException e) {
+                result = quotedValue;
+            }
+        } else {
+            //Some escaping done. So do quote
+            result = quotedValue;
+        }
+        return result;
+    }
+
+
+}

Propchange: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java?rev=1720487&r1=1720486&r2=1720487&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java Thu Dec 17 05:50:47 2015
@@ -22,7 +22,7 @@
  *
  * @version 1.0
  */
-@Version("1.0")
+@Version("1.1.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.commons.jmx;
 

Copied: jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtilTest.java (from r1720389, jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtilTest.java?p2=jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtilTest.java&p1=jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java&r1=1720389&r2=1720487&rev=1720487&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/jmx/package-info.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/jmx/JmxUtilTest.java Thu Dec 17 05:50:47 2015
@@ -17,15 +17,27 @@
  * under the License.
  */
 
-/**
- * Provides annotation support to produce JMX metadata.
- *
- * @version 1.0
- */
-@Version("1.0")
-@Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.commons.jmx;
 
-import aQute.bnd.annotation.Export;
-import aQute.bnd.annotation.Version;
+import junit.framework.TestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class JmxUtilTest {
+
+    @Test
+    public void quotation() throws Exception{
+        assertEquals("text", JmxUtil.quoteValueIfRequired("text"));
+        TestCase.assertEquals("", JmxUtil.quoteValueIfRequired(""));
+        assertTrue(JmxUtil.quoteValueIfRequired("text*with?chars").startsWith("\""));
+    }
+
+    @Test
+    public void quoteAndComma() throws Exception{
+        assertTrue(JmxUtil.quoteValueIfRequired("text,withComma").startsWith("\""));
+        assertTrue(JmxUtil.quoteValueIfRequired("text=withEqual").startsWith("\""));
+    }
 
+}
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java?rev=1720487&r1=1720486&r2=1720487&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java Thu Dec 17 05:50:47 2015
@@ -40,6 +40,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
+import org.apache.jackrabbit.oak.commons.jmx.JmxUtil;
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.oak.stats.CounterStats;
@@ -239,7 +240,7 @@ public class MetricStatisticsProvider im
         public ObjectName createName(String type, String domain, String name) {
             Hashtable<String, String> table = new Hashtable<String, String>();
             table.put("type", JMX_TYPE_METRICS);
-            table.put("name", quoteIfRequired(name));
+            table.put("name", JmxUtil.quoteValueIfRequired(name));
             try {
                 return new ObjectName(domain, table);
             } catch (MalformedObjectNameException e) {
@@ -262,12 +263,5 @@ public class MetricStatisticsProvider im
         }
     }
 
-    static String quoteIfRequired(String text) {
-        String quoted = ObjectName.quote(text);
-        if (quoted.substring(1, quoted.length() - 1).equals(text)) {
-            return text;
-        }
-        return quoted;
-    }
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java?rev=1720487&r1=1720486&r2=1720487&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtils.java Thu Dec 17 05:50:47 2015
@@ -30,6 +30,7 @@ import javax.annotation.Nullable;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.apache.jackrabbit.oak.commons.jmx.JmxUtil;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
 
 import com.google.common.base.Predicate;
@@ -74,8 +75,8 @@ public class WhiteboardUtils {
         try {
 
             Hashtable<String, String> table = new Hashtable<String, String>(attrs);
-            table.put("type", quoteIfRequired(type));
-            table.put("name", quoteIfRequired(name));
+            table.put("type", JmxUtil.quoteValueIfRequired(type));
+            table.put("name", JmxUtil.quoteValueIfRequired(name));
             return whiteboard.register(iface, bean, ImmutableMap.of(
                     "jmx.objectname",
                     new ObjectName(JMX_OAK_DOMAIN, table)));
@@ -169,12 +170,4 @@ public class WhiteboardUtils {
 
     }
 
-    static String quoteIfRequired(String text) {
-        String quoted = ObjectName.quote(text);
-        if (quoted.substring(1, quoted.length() - 1).equals(text)) {
-            return text;
-        }
-        return quoted;
-    }
-
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtilsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtilsTest.java?rev=1720487&r1=1720486&r2=1720487&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtilsTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUtilsTest.java Thu Dec 17 05:50:47 2015
@@ -32,8 +32,6 @@ import org.apache.jackrabbit.oak.query.Q
 import org.junit.After;
 import org.junit.Test;
 
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertNotNull;
 
 public class WhiteboardUtilsTest {
@@ -68,13 +66,6 @@ public class WhiteboardUtilsTest {
     }
 
     @Test
-    public void quotation() throws Exception{
-        assertEquals("text", WhiteboardUtils.quoteIfRequired("text"));
-        assertEquals("", WhiteboardUtils.quoteIfRequired(""));
-        assertTrue(WhiteboardUtils.quoteIfRequired("text*with?chars").startsWith("\""));
-    }
-
-    @Test
     public void stdMBean() throws Exception{
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         Oak oak = new Oak().with(server);