You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2014/06/06 14:21:45 UTC

svn commit: r1600866 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/services/reflect/ optional/org/apache/derby/optional/lucene/ testing/org/apache/derbyTesting/functionTests/tests/lang/

Author: rhillegas
Date: Fri Jun  6 12:21:45 2014
New Revision: 1600866

URL: http://svn.apache.org/r1600866
Log:
DERBY-6600: Make Derby resolve custom Lucene Analyzers and QueryParsers by using the database classpath.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java   (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/JarLoader.java
    db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneQueryVTI.java
    db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneSupport.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSuite.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSupportPermsTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/myLuceneClasses.jar

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/JarLoader.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/JarLoader.java?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/JarLoader.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/reflect/JarLoader.java Fri Jun  6 12:21:45 2014
@@ -178,6 +178,7 @@ final class JarLoader extends SecureClas
                 && !className.startsWith("org.apache.derby.jdbc.")
                 && !className.startsWith("org.apache.derby.vti.")
                 && !className.startsWith("org.apache.derby.agg.")
+                && !className.startsWith("org.apache.derby.optional.")
                 && !className.startsWith("org.apache.derby.impl.tools.optional.")
             )
         {

Modified: db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneQueryVTI.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneQueryVTI.java?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneQueryVTI.java (original)
+++ db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneQueryVTI.java Fri Jun  6 12:21:45 2014
@@ -34,6 +34,7 @@ import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.Properties;
 
+import org.apache.derby.iapi.services.loader.ClassInspector;
 import org.apache.derby.io.StorageFile;
 import org.apache.derby.shared.common.reference.SQLState;
 import org.apache.derby.optional.api.LuceneUtils;
@@ -526,17 +527,21 @@ public class LuceneQueryVTI extends Stri
          final String fieldName,
          final Analyzer analyzer
          )
-        throws PrivilegedActionException
+        throws PrivilegedActionException, SQLException
     {
         return AccessController.doPrivileged
             (
              new PrivilegedExceptionAction<QueryParser>()
              {
                  public QueryParser run()
-                     throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
+                     throws ClassNotFoundException, IllegalAccessException,
+                     InvocationTargetException, NoSuchMethodException,
+                     SQLException
                  {
                      int    lastDotIdx = queryParserMaker.lastIndexOf( "." );
-                     Class<? extends Object>  klass = Class.forName( queryParserMaker.substring( 0, lastDotIdx ) );
+                     String className = queryParserMaker.substring( 0, lastDotIdx );
+                     ClassInspector  ci = LuceneSupport.getClassFactory().getClassInspector();
+                     Class<? extends Object>  klass = ci.getClass( className );
                      String methodName = queryParserMaker.substring( lastDotIdx + 1, queryParserMaker.length() );
                      Method method = klass.getDeclaredMethod( methodName, Version.class, String.class, Analyzer.class );
                      
@@ -595,14 +600,16 @@ public class LuceneQueryVTI extends Stri
      * The method has no arguments.
 	 */
 	private static Analyzer getAnalyzer( final String analyzerMaker )
-        throws PrivilegedActionException
+        throws PrivilegedActionException, SQLException
     {
         return AccessController.doPrivileged
             (
              new PrivilegedExceptionAction<Analyzer>()
              {
                  public Analyzer run()
-                     throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
+                     throws ClassNotFoundException, IllegalAccessException,
+                     InvocationTargetException, NoSuchMethodException,
+                     SQLException
                  {
                      return LuceneSupport.getAnalyzerNoPrivs( analyzerMaker );
                  }

Modified: db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneSupport.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneSupport.java?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneSupport.java (original)
+++ db/derby/code/trunk/java/optional/org/apache/derby/optional/lucene/LuceneSupport.java Fri Jun  6 12:21:45 2014
@@ -52,6 +52,8 @@ import org.apache.derby.iapi.sql.diction
 import org.apache.derby.iapi.error.PublicAPI;
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.reference.Property;
+import org.apache.derby.iapi.services.loader.ClassFactory;
+import org.apache.derby.iapi.services.loader.ClassInspector;
 import org.apache.derby.iapi.services.monitor.Monitor;
 import org.apache.derby.iapi.store.raw.data.DataFactory;
 import org.apache.derby.iapi.util.IdUtil;
@@ -1678,14 +1680,16 @@ public class LuceneSupport implements Op
      * The method has no arguments.
 	 */
 	private static Analyzer getAnalyzer( final String analyzerMaker )
-        throws PrivilegedActionException
+        throws PrivilegedActionException, SQLException
     {
         return AccessController.doPrivileged
             (
              new PrivilegedExceptionAction<Analyzer>()
              {
                  public Analyzer run()
-                     throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
+                     throws ClassNotFoundException, IllegalAccessException,
+                     InvocationTargetException, NoSuchMethodException,
+                     SQLException
                  {
                      return getAnalyzerNoPrivs( analyzerMaker );
                  }
@@ -1699,10 +1703,12 @@ public class LuceneSupport implements Op
 	 */
 	static Analyzer getAnalyzerNoPrivs( String analyzerMaker )
         throws ClassNotFoundException, IllegalAccessException, InvocationTargetException,
-               NoSuchMethodException
+               NoSuchMethodException, SQLException
     {
         int    lastDotIdx = analyzerMaker.lastIndexOf( "." );
-        Class<? extends Object>  klass = Class.forName( analyzerMaker.substring( 0, lastDotIdx ) );
+        String  className = analyzerMaker.substring( 0, lastDotIdx );
+        ClassInspector  ci = getClassFactory().getClassInspector();
+        Class<? extends Object>  klass = ci.getClass( className );
         String methodName = analyzerMaker.substring( lastDotIdx + 1, analyzerMaker.length() );
         Method method = klass.getDeclaredMethod( methodName );
                      
@@ -1776,5 +1782,13 @@ public class LuceneSupport implements Op
         catch (StandardException se) { throw wrap( se ); }
     }
 
+	/**
+		Get the ClassFactory to use with this database.
+	*/
+	static  ClassFactory getClassFactory()
+        throws SQLException
+    {
+		return ConnectionUtil.getCurrentLCC().getLanguageConnectionFactory().getClassFactory();
+	}
 	
 }

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java?rev=1600866&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java Fri Jun  6 12:21:45 2014
@@ -0,0 +1,199 @@
+/*
+
+   Derby - Class org.apache.derbyTesting.functionTests.tests.lang.LuceneJarLoadingTest
+
+   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.derbyTesting.functionTests.tests.lang;
+
+import java.io.File;
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.DatabasePropertyTestSetup;
+import org.apache.derbyTesting.junit.SecurityManagerSetup;
+import org.apache.derbyTesting.junit.TestConfiguration;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+import org.apache.derbyTesting.junit.SupportFilesSetup;
+
+/**
+ * <p>
+ * Test backup and restore of databases with Lucene indexes.
+ * </p>
+ */
+public class LuceneJarLoadingTest extends GeneratedColumnsHelper
+{
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // CONSTANTS
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    private static  final   String      DB_NAME = "lucenejarloadingdb";
+
+    private static  final   String      TEST_DBO = "TEST_DBO";
+    private static  final   String      RUTH = "RUTH";
+    private static  final   String      ALICE = "ALICE";
+    private static  final   String      FRANK = "FRANK";
+    private static  final   String[]    LEGAL_USERS = { TEST_DBO, ALICE, RUTH, FRANK  };
+
+    private static  final   String      POLICY_FILE = "org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy";
+
+    /** the jar file which contains the custom Analyzer and QueryParser */
+    private static  final   String      EXTERNAL_JAR_NAME = "myLuceneClasses.jar";
+    private static  final   String      INTERNAL_JAR_NAME = "TEST_DBO.myLuceneClasses";
+    private static  final   String[]    SUPPORT_FILES = { "functionTests/tests/lang/" + EXTERNAL_JAR_NAME };
+
+    private static  final   String      LOAD_TOOL = "call syscs_util.syscs_register_tool( 'luceneSupport', true )";
+    private static  final   String      UNLOAD_TOOL = "call syscs_util.syscs_register_tool( 'luceneSupport', false )";
+    private static  final   String      MY_ANALYZER = "MyAnalyzer.makeMyAnalyzer";
+    private static  final   String      INDEX_TEXT_TABLE =
+        "call LuceneSupport.createIndex( 'ruth', 'textTable', 'textCol', '" + MY_ANALYZER + "' )";
+    private static  final   String      DROP_TEXT_INDEX = "call LuceneSupport.dropIndex( 'ruth', 'textTable', 'textCol' )";
+
+    private static  final   String      READ_TEXT_INDEX =
+        "select * from table\n" +
+        "(\n" +
+        "  ruth.textTable__textCol\n" +
+        "  (\n" +
+        "    'one two three four five six seven eight nine ten',\n" +
+        "    'MyQueryParser.makeMyQueryParser',\n" +
+        "    100, null\n" +
+        "  )\n" +
+        ") t\n";
+    private static  final   String[][]  READ_TEXT_RESULT =
+        new String[][]
+        {
+            { "10", "9", "2.2791052" },   
+            { "9", "8", "1.6305782" },
+            { "8", "7", "1.1616905" },   
+            { "7", "6", "0.97469425" }, 
+            { "6", "5", "0.6597747" },  
+            { "5", "4", "0.49575216" },
+            { "4", "3", "0.33803377" }, 
+            { "3", "2", "0.17799875" },     
+            { "2", "1", "0.09289266" },
+            { "1", "0", "0.035006654" },   
+        };
+
+    private static  final   String  GOOD_SHUTDOWN = "08006";
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // STATE
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // CONSTRUCTOR
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Create a new instance.
+     */
+
+    public LuceneJarLoadingTest( String name )
+    {
+        super( name );
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // JUnit BEHAVIOR
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+
+    /**
+     * Construct top level suite in this JUnit test
+     */
+    public static Test suite()
+    {
+        TestSuite suite = (TestSuite) TestConfiguration.embeddedSuite( LuceneJarLoadingTest.class );
+
+        Test        secureTest = new SecurityManagerSetup( suite, POLICY_FILE );
+        Test        authenticatedTest = DatabasePropertyTestSetup.builtinAuthentication
+            ( secureTest, LEGAL_USERS, "LuceneJarLoadingPermissions" );
+        Test        authorizedTest = TestConfiguration.sqlAuthorizationDecoratorSingleUse( authenticatedTest, DB_NAME, true );
+        Test        supportFilesTest = new SupportFilesSetup( authorizedTest, SUPPORT_FILES );
+
+        return supportFilesTest;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    //
+    // TESTS
+    //
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * <p>
+     * Test that you can use Analyzers and QueryParsers which live inside jar files
+     * stored in the database.
+     * </p>
+     */
+    public  void    test_001_basic()
+        throws Exception
+    {
+        Connection  dboConnection = openUserConnection( TEST_DBO );
+        Connection  ruthConnection = openUserConnection( RUTH );
+
+        goodStatement( dboConnection, "create table dummyJustToCreateSchema( a int )" );
+
+        // load the jar file
+        URL jar = SupportFilesSetup.getReadOnlyURL( EXTERNAL_JAR_NAME );
+        goodStatement( dboConnection, "call sqlj.install_jar( '" + jar.toExternalForm() + "', '" + INTERNAL_JAR_NAME + "', 0 )" );
+        goodStatement
+            (
+             dboConnection,
+             "call syscs_util.syscs_set_database_property( 'derby.database.classpath', '" + INTERNAL_JAR_NAME + "' )"
+             );
+
+        LuceneSupportPermsTest.loadTestTable( ruthConnection );
+
+        goodStatement( dboConnection, LOAD_TOOL );
+        goodStatement( ruthConnection, INDEX_TEXT_TABLE );
+
+        // verify that everything looks good
+        assertResults
+            (
+             ruthConnection,
+             READ_TEXT_INDEX,
+             READ_TEXT_RESULT,
+             false
+             );
+
+        // cleanup
+        goodStatement( ruthConnection, DROP_TEXT_INDEX );
+        goodStatement( dboConnection, UNLOAD_TOOL );
+        LuceneSupportPermsTest.unloadTestTable( ruthConnection );
+    }
+
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneJarLoadingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSuite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSuite.java?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSuite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSuite.java Fri Jun  6 12:21:45 2014
@@ -66,6 +66,7 @@ public class LuceneSuite extends BaseTes
             suite.addTest(LuceneCoarseAuthorizationTest.suite());
             suite.addTest(LuceneInMemoryTest.suite());
             suite.addTest(LuceneBackupTest.suite());
+            suite.addTest(LuceneJarLoadingTest.suite());
         }
 
         return suite;

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSupportPermsTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSupportPermsTest.java?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSupportPermsTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/LuceneSupportPermsTest.java Fri Jun  6 12:21:45 2014
@@ -928,16 +928,14 @@ public class LuceneSupportPermsTest exte
         goodStatement( dboConnection, UNLOAD_TOOL );
         unloadTestTable( ruthConnection );
     }
-    private void    loadTestTable( Connection conn ) throws Exception
+    static  void    loadTestTable( Connection conn ) throws Exception
     {
-        goodStatement
+        conn.prepareStatement
             (
-             conn,
              "create table textTable( keyCol int primary key, textCol clob )"
-             );
-        goodStatement
+             ).execute();
+        conn.prepareStatement
             (
-             conn,
              "insert into textTable values\n" +
              "( 1, 'one' ),\n" +
              "( 2, 'one two' ),\n" +
@@ -959,15 +957,14 @@ public class LuceneSupportPermsTest exte
              "( 108, 'bricks and mortar, tea, tears, turtle, soup, when in the course of human events' ),\n" +
              "( 109, 'bricks and mortar, tea, tears, turtle, soup, when in the course of human events you want' ),\n" +
              "( 110, 'bricks and mortar, tea, tears, turtle, soup, when in the course of human events you want better cell coverage' )\n"
-             );
+             ).execute();
     }
-    private void    unloadTestTable( Connection conn ) throws Exception
+    static  void    unloadTestTable( Connection conn ) throws Exception
     {
-        goodStatement
+        conn.prepareStatement
             (
-             conn,
              "drop table textTable"
-             );
+             ).execute();
     }
 
    /**

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/luceneSupport.policy Fri Jun  6 12:21:45 2014
@@ -458,6 +458,8 @@ grant codeBase "${derbyTesting.codejar}d
   permission java.io.FilePermission "${derby.system.home}${/}lucenesupportpermsdb${/}LUCENE${/}-", "read,write,delete";
   permission java.io.FilePermission "${derby.system.home}${/}lucenebackupdb${/}LUCENE", "read,write,delete";
   permission java.io.FilePermission "${derby.system.home}${/}lucenebackupdb${/}LUCENE${/}-", "read,write,delete";
+  permission java.io.FilePermission "${derby.system.home}${/}lucenejarloadingdb${/}LUCENE", "read,write,delete";
+  permission java.io.FilePermission "${derby.system.home}${/}lucenejarloadingdb${/}LUCENE${/}-", "read,write,delete";
 
   permission java.io.FilePermission "${derbyTesting.lucene.core.jar.file}", "read";
   permission java.util.PropertyPermission "user.dir", "read";
@@ -474,6 +476,8 @@ grant codeBase "${derbyTesting.lucene.co
   permission java.io.FilePermission "${derby.system.home}${/}lucenesupportpermsdb${/}LUCENE${/}-", "read,write,delete";
   permission java.io.FilePermission "${derby.system.home}${/}lucenebackupdb${/}LUCENE", "read,write,delete";
   permission java.io.FilePermission "${derby.system.home}${/}lucenebackupdb${/}LUCENE${/}-", "read,write,delete";
+  permission java.io.FilePermission "${derby.system.home}${/}lucenejarloadingdb${/}LUCENE", "read,write,delete";
+  permission java.io.FilePermission "${derby.system.home}${/}lucenejarloadingdb${/}LUCENE${/}-", "read,write,delete";
   
   // Basic permissions needed for Lucene to work:
   permission java.util.PropertyPermission "user.dir", "read";

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/myLuceneClasses.jar
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/myLuceneClasses.jar?rev=1600866&r1=1600865&r2=1600866&view=diff
==============================================================================
Binary files - no diff available.