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.