added the start of the Index Manager, which integrates Lucene indexing into
the base Dynamo framework
This commit is contained in:
parent
172ec3b314
commit
60f24d8412
|
@ -59,5 +59,10 @@ velocity.base=/usr/local/jakarta/velocity-1.3.1
|
||||||
# velocity.lib=${velocity.base}
|
# velocity.lib=${velocity.base}
|
||||||
velocity.jarfile=velocity-1.3.1.jar
|
velocity.jarfile=velocity-1.3.1.jar
|
||||||
|
|
||||||
|
# [Location of Lucene 1.3RC1]
|
||||||
|
lucene.base=/usr/local/jakarta/lucene-1.3-rc1
|
||||||
|
# lucene.lib=${lucene.base}
|
||||||
|
lucene.jarfile=lucene-1.3-rc1.jar
|
||||||
|
|
||||||
# [Location of SourceID SSO 1.0b7/1.0 (optional)]
|
# [Location of SourceID SSO 1.0b7/1.0 (optional)]
|
||||||
# sourceid.base=${user.home}/sso
|
# sourceid.base=${user.home}/sso
|
||||||
|
|
10
build.xml
10
build.xml
|
@ -72,6 +72,11 @@
|
||||||
<property name="velocity.lib" value="${velocity.base}"/>
|
<property name="velocity.lib" value="${velocity.base}"/>
|
||||||
<property name="velocity.jarfile" value="velocity.jar"/>
|
<property name="velocity.jarfile" value="velocity.jar"/>
|
||||||
|
|
||||||
|
<!-- [Location of Lucene 1.3RC1] -->
|
||||||
|
<property name="lucene.base" value="../lucene"/>
|
||||||
|
<property name="lucene.lib" value="${lucene.base}"/>
|
||||||
|
<property name="lucene.jarfile" value="lucene.jar"/>
|
||||||
|
|
||||||
<!-- [Location of SourceID SSO 1.0b7/1.0 (optional)] -->
|
<!-- [Location of SourceID SSO 1.0b7/1.0 (optional)] -->
|
||||||
<!-- <property name="sourceid.base" value=""/> -->
|
<!-- <property name="sourceid.base" value=""/> -->
|
||||||
|
|
||||||
|
@ -85,6 +90,7 @@
|
||||||
<fileset dir="${commlang.lib}" includes="${commlang.jarfile}"/>
|
<fileset dir="${commlang.lib}" includes="${commlang.jarfile}"/>
|
||||||
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
||||||
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
||||||
|
<fileset dir="${lucene.lib}" includes="${lucene.jarfile}"/>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- ============================================================================
|
<!-- ============================================================================
|
||||||
|
@ -291,6 +297,7 @@
|
||||||
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
||||||
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
||||||
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
||||||
|
<fileset dir="${lucene.lib}" includes="${lucene.jarfile}"/>
|
||||||
</copy>
|
</copy>
|
||||||
<copy file="jars/dynamo-test-module.jar" todir="assembly/testapp/WEB-INF/modules"/>
|
<copy file="jars/dynamo-test-module.jar" todir="assembly/testapp/WEB-INF/modules"/>
|
||||||
<copy file="conf/dynamo-test.xml" tofile="assembly/testapp/WEB-INF/dynamo.xml"/>
|
<copy file="conf/dynamo-test.xml" tofile="assembly/testapp/WEB-INF/dynamo.xml"/>
|
||||||
|
@ -325,6 +332,7 @@
|
||||||
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
||||||
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
||||||
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
||||||
|
<fileset dir="${lucene.lib}" includes="${lucene.jarfile}"/>
|
||||||
</copy>
|
</copy>
|
||||||
<copy file="conf/dynamo-venice.xml" tofile="assembly/venice/WEB-INF/dynamo.xml"/>
|
<copy file="conf/dynamo-venice.xml" tofile="assembly/venice/WEB-INF/dynamo.xml"/>
|
||||||
<copy file="conf/logging-venice.xml" tofile="assembly/venice/WEB-INF/logging.xml">
|
<copy file="conf/logging-venice.xml" tofile="assembly/venice/WEB-INF/logging.xml">
|
||||||
|
@ -368,6 +376,7 @@
|
||||||
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
<fileset dir="${rhino.lib}" includes="${rhino.jarfile}"/>
|
||||||
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
|
||||||
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
<fileset dir="${velocity.lib}" includes="${velocity.jarfile}"/>
|
||||||
|
<fileset dir="${lucene.lib}" includes="${lucene.jarfile}"/>
|
||||||
<fileset dir="${sourceid.base}" includes="sourceid-sso.jar"/>
|
<fileset dir="${sourceid.base}" includes="sourceid-sso.jar"/>
|
||||||
<fileset dir="${sourceid.base}/webapp/WEB-INF/lib">
|
<fileset dir="${sourceid.base}/webapp/WEB-INF/lib">
|
||||||
<include name="axis-ant.jar"/>
|
<include name="axis-ant.jar"/>
|
||||||
|
@ -451,6 +460,7 @@
|
||||||
<link href="http://jakarta.apache.org/commons/lang/api/"/>
|
<link href="http://jakarta.apache.org/commons/lang/api/"/>
|
||||||
<link href="http://jakarta.apache.org/log4j/docs/api/"/>
|
<link href="http://jakarta.apache.org/log4j/docs/api/"/>
|
||||||
<link href="http://jakarta.apache.org/velocity/api/"/>
|
<link href="http://jakarta.apache.org/velocity/api/"/>
|
||||||
|
<link href="http://jakarta.apache.org/lucene/docs/api/"/>
|
||||||
</javadoc>
|
</javadoc>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,10 @@
|
||||||
<database connection="data"/>
|
<database connection="data"/>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
|
<object name="index" classname="com.silverwrist.dynamo.index.IndexManagerObject" priority="1">
|
||||||
|
<database connection="data" namespaces="nscache"/>
|
||||||
|
</object>
|
||||||
|
|
||||||
<object name="srm" classname="com.silverwrist.dynamo.security.SRMObject" priority="1">
|
<object name="srm" classname="com.silverwrist.dynamo.security.SRMObject" priority="1">
|
||||||
<database connection="data" namespaces="nscache"/>
|
<database connection="data" namespaces="nscache"/>
|
||||||
<user-manager cpoint="srm_proxy"/>
|
<user-manager cpoint="srm_proxy"/>
|
||||||
|
|
|
@ -313,6 +313,32 @@ CREATE TABLE us_binary_prop (
|
||||||
PRIMARY KEY (msgid, part, nsid, prop_name)
|
PRIMARY KEY (msgid, part, nsid, prop_name)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# Listing of registered indexes.
|
||||||
|
CREATE TABLE ndx_main (
|
||||||
|
ndxid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, # index ID
|
||||||
|
nsid INT NOT NULL, # namespace ID of index
|
||||||
|
name VARCHAR(255) BINARY NOT NULL, # index name
|
||||||
|
analyzer VARCHAR(255) NOT NULL, # name of analyzer class to construct
|
||||||
|
UNIQUE INDEX by_name (nsid, name)
|
||||||
|
);
|
||||||
|
|
||||||
|
# The "files" that make up an index.
|
||||||
|
CREATE TABLE ndx_files (
|
||||||
|
ndxid INT NOT NULL, # index ID
|
||||||
|
name VARCHAR(255) BINARY NOT NULL, # file name
|
||||||
|
length INT NOT NULL DEFAULT 0, # file length
|
||||||
|
mtime BIGINT NOT NULL DEFAULT 0, # modification time
|
||||||
|
data LONGBLOB, # the file data
|
||||||
|
PRIMARY KEY (ndxid, name)
|
||||||
|
);
|
||||||
|
|
||||||
|
# The locks created on an index.
|
||||||
|
CREATE TABLE ndx_locks (
|
||||||
|
ndxid INT NOT NULL, # index ID
|
||||||
|
name VARCHAR(255) BINARY NOT NULL, # lock name
|
||||||
|
PRIMARY KEY (ndxid, name)
|
||||||
|
);
|
||||||
|
|
||||||
############################ following this line are Venice-specific tables ############################
|
############################ following this line are Venice-specific tables ############################
|
||||||
|
|
||||||
# The table which defines menus.
|
# The table which defines menus.
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2002-03 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.except;
|
||||||
|
|
||||||
|
public class IndexException extends ExternalException
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <CODE>IndexException</CODE> instance.
|
||||||
|
*
|
||||||
|
* @param caller The classname of the class that's creating the exception. Its class loader
|
||||||
|
* and package name will be used, together with <CODE>bundle</CODE>, to find the
|
||||||
|
* resource bundle.
|
||||||
|
* @param bundle The name of the resource bundle to be loaded.
|
||||||
|
* @param message_id The identifier of the message to be loaded from the bundle.
|
||||||
|
*/
|
||||||
|
public IndexException(Class caller, String bundle, String message_id)
|
||||||
|
{
|
||||||
|
super(caller,bundle,message_id);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <CODE>IndexException</CODE> instance.
|
||||||
|
*
|
||||||
|
* @param caller The classname of the class that's creating the exception. Its class loader
|
||||||
|
* and package name will be used, together with <CODE>bundle</CODE>, to find the
|
||||||
|
* resource bundle.
|
||||||
|
* @param bundle The name of the resource bundle to be loaded.
|
||||||
|
* @param message_id The identifier of the message to be loaded from the bundle.
|
||||||
|
* @param inner The exception to be nested inside this one.
|
||||||
|
*/
|
||||||
|
public IndexException(Class caller, String bundle, String message_id, Throwable inner)
|
||||||
|
{
|
||||||
|
super(caller,bundle,message_id,inner);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class IndexException
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.iface;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.except.DatabaseException;
|
||||||
|
import com.silverwrist.dynamo.except.IndexException;
|
||||||
|
|
||||||
|
public interface IndexManager
|
||||||
|
{
|
||||||
|
public Object resolveObjectReference(String namespace, String name, String tag) throws IndexException;
|
||||||
|
|
||||||
|
public IndexService openIndex(String namespace, String name) throws DatabaseException, IndexException;
|
||||||
|
|
||||||
|
} // end interface IndexManager
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.iface;
|
||||||
|
|
||||||
|
public interface IndexManagerConfig
|
||||||
|
{
|
||||||
|
public ComponentShutdown registerResolver(String namespace, String name, IndexedObjectResolver res);
|
||||||
|
|
||||||
|
} // end interface IndexManagerConfig
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.iface;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.except.IndexException;
|
||||||
|
|
||||||
|
public interface IndexService
|
||||||
|
{
|
||||||
|
public void addItem(String item_namespace, String item_name, Object item, String scope, java.util.Date date,
|
||||||
|
DynamoUser owner, String text) throws IndexException;
|
||||||
|
|
||||||
|
public boolean deleteItem(String item_namespace, String item_name, Object item) throws IndexException;
|
||||||
|
|
||||||
|
} // end interface IndexService
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.iface;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.except.IndexException;
|
||||||
|
|
||||||
|
public interface IndexedObjectResolver
|
||||||
|
{
|
||||||
|
public String getResolverTag(Object obj) throws IndexException;
|
||||||
|
|
||||||
|
public Object resolveObject(String tag) throws IndexException;
|
||||||
|
|
||||||
|
} // end interface IndexedObjectResolver
|
|
@ -0,0 +1,290 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.apache.lucene.store.*;
|
||||||
|
|
||||||
|
class CurrentFile
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class implementing the random-access write capability
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private class MyOutput extends org.apache.lucene.store.OutputStream
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Attributes
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
private RandomAccessFile m_fptr;
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
MyOutput() throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
m_fptr = new RandomAccessFile(m_file,"rw");
|
||||||
|
addRef();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Abstract implementations from class OutputStream
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void flushBuffer(byte[] b, int len) throws IOException
|
||||||
|
{
|
||||||
|
if ((len>0) && (b!=null))
|
||||||
|
{ // write data
|
||||||
|
m_fptr.write(b,0,len);
|
||||||
|
m_mtime = System.currentTimeMillis();
|
||||||
|
m_length = m_fptr.length();
|
||||||
|
m_modified = true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end flushBuffer
|
||||||
|
|
||||||
|
public long length() throws IOException
|
||||||
|
{
|
||||||
|
return m_fptr.length();
|
||||||
|
|
||||||
|
} // end length
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Overrides from class OutputStream
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
super.close();
|
||||||
|
m_fptr.close();
|
||||||
|
release();
|
||||||
|
|
||||||
|
} // end close
|
||||||
|
|
||||||
|
public void seek(long pos) throws IOException
|
||||||
|
{
|
||||||
|
super.seek(pos);
|
||||||
|
m_fptr.seek(pos);
|
||||||
|
|
||||||
|
} // end seek
|
||||||
|
|
||||||
|
} // end class MyOutput
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class implementing the random-access read capability
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private class MyInput extends org.apache.lucene.store.InputStream
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Attributes
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
private RandomAccessFile m_fptr;
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
MyInput() throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
m_fptr = new RandomAccessFile(m_file,"r");
|
||||||
|
addRef();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Abstract implementations from class InputStream
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void readInternal(byte[] b, int offset, int length) throws IOException
|
||||||
|
{
|
||||||
|
m_fptr.readFully(b,offset,length);
|
||||||
|
|
||||||
|
} // end readInternal
|
||||||
|
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
m_fptr.close();
|
||||||
|
release();
|
||||||
|
|
||||||
|
} // end close
|
||||||
|
|
||||||
|
protected void seekInternal(long pos) throws IOException
|
||||||
|
{
|
||||||
|
m_fptr.seek(pos);
|
||||||
|
|
||||||
|
} // end seekInternal
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Overrides from class InputStream
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Object clone()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // return a new input object
|
||||||
|
return new MyInput();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // whoops!
|
||||||
|
logger.error("CurrentFile.MyInput.clone(): unable to clone file",e);
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end clone
|
||||||
|
|
||||||
|
} // end class MyInput
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(CurrentFile.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private IndexDirectoryImpl m_base;
|
||||||
|
private File m_file;
|
||||||
|
private String m_name;
|
||||||
|
private long m_length;
|
||||||
|
private long m_mtime;
|
||||||
|
private int m_refcount = 1;
|
||||||
|
private boolean m_modified = false;
|
||||||
|
private boolean m_noupdate = true;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
CurrentFile(IndexDirectoryImpl base, File file, String name, long length, long mtime)
|
||||||
|
{
|
||||||
|
m_base = base;
|
||||||
|
m_file = file;
|
||||||
|
m_name = name;
|
||||||
|
m_length = length;
|
||||||
|
m_mtime = mtime;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
synchronized int addRef()
|
||||||
|
{
|
||||||
|
return ++m_refcount;
|
||||||
|
|
||||||
|
} // end addRef
|
||||||
|
|
||||||
|
synchronized int release() throws IOException
|
||||||
|
{
|
||||||
|
int rc = --m_refcount;
|
||||||
|
if (rc==0)
|
||||||
|
{ // dump this file back to the database
|
||||||
|
if (m_modified && !m_noupdate)
|
||||||
|
m_base.storeFile(m_name,m_mtime,m_file);
|
||||||
|
m_base.detach(m_name);
|
||||||
|
m_base = null;
|
||||||
|
m_file.delete();
|
||||||
|
m_file = null;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end release
|
||||||
|
|
||||||
|
void abandon()
|
||||||
|
{
|
||||||
|
m_base.detach(m_name);
|
||||||
|
m_base = null;
|
||||||
|
m_file.delete();
|
||||||
|
m_file = null;
|
||||||
|
|
||||||
|
} // end abandon
|
||||||
|
|
||||||
|
org.apache.lucene.store.OutputStream openOutput() throws IOException
|
||||||
|
{
|
||||||
|
return new MyOutput();
|
||||||
|
|
||||||
|
} // end openOutput
|
||||||
|
|
||||||
|
org.apache.lucene.store.InputStream openInput() throws IOException
|
||||||
|
{
|
||||||
|
return new MyInput();
|
||||||
|
|
||||||
|
} // end openInput
|
||||||
|
|
||||||
|
long getModTime()
|
||||||
|
{
|
||||||
|
return m_mtime;
|
||||||
|
|
||||||
|
} // end getModTime
|
||||||
|
|
||||||
|
void setModTime(long val)
|
||||||
|
{
|
||||||
|
m_mtime = val;
|
||||||
|
m_modified = true;
|
||||||
|
|
||||||
|
} // end setModTime
|
||||||
|
|
||||||
|
void noUpdate()
|
||||||
|
{
|
||||||
|
m_noupdate = true;
|
||||||
|
|
||||||
|
} // end noUpdate
|
||||||
|
|
||||||
|
void setName(String s)
|
||||||
|
{
|
||||||
|
m_name = s;
|
||||||
|
|
||||||
|
} // end setName
|
||||||
|
|
||||||
|
long length()
|
||||||
|
{
|
||||||
|
return m_length;
|
||||||
|
|
||||||
|
} // end length
|
||||||
|
|
||||||
|
} // end class CurrentFile
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.ref.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
class DirectoryAutoCleanup extends PhantomReference
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(DirectoryAutoCleanup.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private IndexDirectoryImpl m_directory;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
DirectoryAutoCleanup(IndexServiceImpl service, IndexDirectoryImpl directory, ReferenceQueue rq)
|
||||||
|
{
|
||||||
|
super(service,rq);
|
||||||
|
m_directory = directory;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Overrides from class Reference
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
m_directory = null;
|
||||||
|
super.clear();
|
||||||
|
|
||||||
|
} // end clear
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // close the directory!
|
||||||
|
if (m_directory!=null)
|
||||||
|
m_directory.close();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // whoops!
|
||||||
|
logger.warn("DirectoryAutoCleanup.cleanup(): close failed",e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end cleanup
|
||||||
|
|
||||||
|
} // end class DirectoryAutoCleanup
|
|
@ -0,0 +1,431 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.apache.lucene.store.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
class IndexDirectoryImpl extends Directory
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class implementing the Lock object
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private class MyLock extends Lock
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Attributes
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_name;
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
MyLock(String name)
|
||||||
|
{
|
||||||
|
m_name = name;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Abstract implementations from class Lock
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
public boolean obtain() throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
return m_ops.obtainLock(m_ndx,m_name);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end obtain
|
||||||
|
|
||||||
|
public void release()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
m_ops.releaseLock(m_ndx,m_name);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // just log the exception
|
||||||
|
logger.warn("IndexDirectoryImpl.MyLock.release(): failed operation",e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end release
|
||||||
|
|
||||||
|
} // end class MyLock
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(IndexDirectoryImpl.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private IndexOps m_ops;
|
||||||
|
private int m_ndx;
|
||||||
|
private Hashtable m_current = new Hashtable();
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
IndexDirectoryImpl(int ndx, IndexOps ops)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
m_ops = ops;
|
||||||
|
m_ndx = ndx;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final IOException translateException(DatabaseException e)
|
||||||
|
{
|
||||||
|
logger.info("database operation threw exception",e);
|
||||||
|
IOException ie = new IOException("Database error on file operation");
|
||||||
|
ie.initCause(e);
|
||||||
|
return ie;
|
||||||
|
|
||||||
|
} // end translateException
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract implementations from class Directory
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String[] list() throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
return m_ops.listFiles(m_ndx);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end list
|
||||||
|
|
||||||
|
public boolean fileExists(String name) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf!=null)
|
||||||
|
return true;
|
||||||
|
return (m_ops.getModTime(m_ndx,name)>=0);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end fileExists
|
||||||
|
|
||||||
|
public long fileModified(String name) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf!=null)
|
||||||
|
return cf.getModTime();
|
||||||
|
return m_ops.getModTime(m_ndx,name);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end fileModified
|
||||||
|
|
||||||
|
public void touchFile(String name) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
long mtime = System.currentTimeMillis();
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf!=null)
|
||||||
|
cf.setModTime(mtime);
|
||||||
|
else
|
||||||
|
m_ops.setModTime(m_ndx,name,mtime);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end touchFile
|
||||||
|
|
||||||
|
public void deleteFile(String name) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
m_ops.deleteFile(m_ndx,name);
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf!=null)
|
||||||
|
{ // detach file from current and make sure we don't update
|
||||||
|
m_current.remove(name);
|
||||||
|
cf.noUpdate();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end deleteFile
|
||||||
|
|
||||||
|
public void renameFile(String from, String to) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
m_ops.renameFile(m_ndx,from,to);
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(to));
|
||||||
|
if (cf!=null)
|
||||||
|
{ // this file was deleted - detach file from current and make sure we don't update
|
||||||
|
m_current.remove(to);
|
||||||
|
cf.noUpdate();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
cf = (CurrentFile)(m_current.get(from));
|
||||||
|
if (cf!=null)
|
||||||
|
{ // reset the name and juggle things
|
||||||
|
m_current.remove(from);
|
||||||
|
cf.setName(to);
|
||||||
|
m_current.put(to,cf);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end renameFile
|
||||||
|
|
||||||
|
public long fileLength(String name) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
CurrentFile cf = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf!=null)
|
||||||
|
return cf.length();
|
||||||
|
return m_ops.getLength(m_ndx,name);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end fileLength
|
||||||
|
|
||||||
|
public org.apache.lucene.store.OutputStream createFile(String name) throws IOException
|
||||||
|
{
|
||||||
|
long mtime = -1L;
|
||||||
|
CurrentFile cf = null;
|
||||||
|
try
|
||||||
|
{ // create the file entry
|
||||||
|
mtime = m_ops.createNewEntry(m_ndx,name);
|
||||||
|
if (mtime==-1L)
|
||||||
|
throw new IOException("file " + name + " already exists");
|
||||||
|
|
||||||
|
// now create a CurrentFile object
|
||||||
|
cf = new CurrentFile(this,File.createTempFile("dynamo-index",null),name,0L,mtime);
|
||||||
|
m_current.put(name,cf);
|
||||||
|
|
||||||
|
// and open it for writing
|
||||||
|
org.apache.lucene.store.OutputStream rc = cf.openOutput();
|
||||||
|
cf.release();
|
||||||
|
cf = null;
|
||||||
|
mtime = -1L;
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // if we screwed up, back out of stuff
|
||||||
|
try
|
||||||
|
{ // but do it without raising any more exceptions
|
||||||
|
if (cf!=null)
|
||||||
|
cf.abandon();
|
||||||
|
if (mtime>=0)
|
||||||
|
m_ops.deleteFile(m_ndx,name);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // just ignore exceptions here
|
||||||
|
logger.warn("IndexDirectoryImpl.createFile(): error recovery threw exception",e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
|
||||||
|
public org.apache.lucene.store.InputStream openFile(String name) throws IOException
|
||||||
|
{
|
||||||
|
File tempfile = null;
|
||||||
|
CurrentFile cf = null;
|
||||||
|
try
|
||||||
|
{ // first see if the file's already open
|
||||||
|
CurrentFile cf2 = (CurrentFile)(m_current.get(name));
|
||||||
|
if (cf2!=null)
|
||||||
|
return cf2.openInput(); // open it again
|
||||||
|
|
||||||
|
// load the file data
|
||||||
|
tempfile = File.createTempFile("dynamo-index",null);
|
||||||
|
long mtime = m_ops.loadFile(m_ndx,name,tempfile);
|
||||||
|
if (mtime==-1)
|
||||||
|
throw new IOException("file " + name + " does not exist");
|
||||||
|
|
||||||
|
// now create a CurrentFile object
|
||||||
|
cf = new CurrentFile(this,tempfile,name,tempfile.length(),mtime);
|
||||||
|
tempfile = null; // done with tempfile
|
||||||
|
m_current.put(name,cf);
|
||||||
|
|
||||||
|
// and open it for reading
|
||||||
|
org.apache.lucene.store.InputStream rc = cf.openInput();
|
||||||
|
cf.release();
|
||||||
|
cf = null;
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // if we screwed up, back out of stuff
|
||||||
|
if (cf!=null)
|
||||||
|
cf.abandon();
|
||||||
|
if (tempfile!=null)
|
||||||
|
tempfile.delete();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end openFile
|
||||||
|
|
||||||
|
public Lock makeLock(String name)
|
||||||
|
{
|
||||||
|
return new MyLock(name);
|
||||||
|
|
||||||
|
} // end makeLock
|
||||||
|
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // Get all the "current" files and close them.
|
||||||
|
LinkedList files = new LinkedList(m_current.values());
|
||||||
|
m_current.clear();
|
||||||
|
while (!(files.isEmpty()))
|
||||||
|
{ // get each file in turn and release it till it dies
|
||||||
|
CurrentFile cf = (CurrentFile)(files.removeFirst());
|
||||||
|
int foo = 1;
|
||||||
|
while (foo>0)
|
||||||
|
foo = cf.release();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
// release any outstanding locks
|
||||||
|
m_ops.releaseAllLocks(m_ndx);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end close
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void storeFile(String name, long mtime, File data) throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // call through to the database
|
||||||
|
m_ops.storeFile(m_ndx,name,mtime,data);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // turn it into an I/O exception
|
||||||
|
throw translateException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end storeFile
|
||||||
|
|
||||||
|
void detach(String name)
|
||||||
|
{
|
||||||
|
m_current.remove(name);
|
||||||
|
|
||||||
|
} // end detach
|
||||||
|
|
||||||
|
} // end class IndexDirectoryImpl
|
|
@ -0,0 +1,272 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.lang.ref.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.commons.collections.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.xml.*;
|
||||||
|
import com.silverwrist.dynamo.db.NamespaceCache;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
import com.silverwrist.dynamo.util.*;
|
||||||
|
|
||||||
|
public class IndexManagerObject
|
||||||
|
implements NamedObject, ComponentInitialize, ComponentShutdown, IndexManager, IndexManagerConfig
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class which scans the cleanup queue
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private class CleanupQueueTask implements BackgroundTask
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
CleanupQueueTask()
|
||||||
|
{
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Implementations from itnerface BackgroundTask
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void run(ServiceProvider services)
|
||||||
|
{
|
||||||
|
Reference r = null;
|
||||||
|
while ((r = m_cleanupqueue.poll())!=null)
|
||||||
|
{ // do the cleanup!
|
||||||
|
DirectoryAutoCleanup dac = (DirectoryAutoCleanup)r;
|
||||||
|
dac.cleanup();
|
||||||
|
dac.clear();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end run
|
||||||
|
|
||||||
|
} // end class CleanupQueueTask
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(IndexManagerObject.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_name; // name of this object
|
||||||
|
private IndexManagerOps m_ops; // database operations object
|
||||||
|
private NamespaceCache m_ns_cache; // namespace cache object
|
||||||
|
private ComponentShutdown m_shut_runtime; // shutdown runtime service
|
||||||
|
private ComponentShutdown m_shut_init; // shutdown init service
|
||||||
|
private ComponentShutdown m_shut_task; // shutdown background task
|
||||||
|
private Hashtable m_resolvers; // resolvers list
|
||||||
|
private ReferenceMap m_indexcache; // index cache
|
||||||
|
private ReferenceQueue m_cleanupqueue; // cleanup object queue
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public IndexManagerObject()
|
||||||
|
{
|
||||||
|
m_resolvers = new Hashtable();
|
||||||
|
m_indexcache = new ReferenceMap(ReferenceMap.HARD,ReferenceMap.SOFT);
|
||||||
|
m_cleanupqueue = new ReferenceQueue();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface NamedObject
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return m_name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ComponentInitialize
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the component.
|
||||||
|
*
|
||||||
|
* @param config_root Pointer to the section of the Dynamo XML configuration file that configures this
|
||||||
|
* particular component. This is to be considered "read-only" by the component.
|
||||||
|
* @param services An implementation of {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider}
|
||||||
|
* which provides initialization services to the component. This will include an implementation
|
||||||
|
* of {@link com.silverwrist.dynamo.iface.ObjectProvider ObjectProvider} which may be used to
|
||||||
|
* get information about other objects previously initialized by the application.
|
||||||
|
* @exception com.silverwrist.dynamo.except.ConfigException If an error is encountered in the component
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
public void initialize(Element config_root, ServiceProvider services) throws ConfigException
|
||||||
|
{
|
||||||
|
logger.info("IndexManagerObject initializing");
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
String conn_name = null;
|
||||||
|
String nscache_name = null;
|
||||||
|
try
|
||||||
|
{ // verify the right node name
|
||||||
|
loader.verifyNodeName(config_root,"object");
|
||||||
|
|
||||||
|
// get the object's name
|
||||||
|
m_name = loader.getAttribute(config_root,"name");
|
||||||
|
|
||||||
|
// get the database configuration connection
|
||||||
|
DOMElementHelper config_root_h = new DOMElementHelper(config_root);
|
||||||
|
Element elt = loader.getSubElement(config_root_h,"database");
|
||||||
|
conn_name = loader.getAttribute(elt,"connection");
|
||||||
|
nscache_name = loader.getAttribute(elt,"namespaces");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (XMLLoadException e)
|
||||||
|
{ // error loading XML config data
|
||||||
|
throw new ConfigException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// Get the database connection pool and namespace cache.
|
||||||
|
DBConnectionPool pool = GetObjectUtils.getDatabaseConnection(services,conn_name);
|
||||||
|
m_ns_cache =
|
||||||
|
(NamespaceCache)(GetObjectUtils.getDynamoComponent(services,NamespaceCache.class,nscache_name));
|
||||||
|
|
||||||
|
// Get the database access object.
|
||||||
|
m_ops = IndexManagerOps.get(pool);
|
||||||
|
|
||||||
|
// Hook up IndexManager as a runtime service.
|
||||||
|
SingletonServiceProvider ssp = new SingletonServiceProvider("IndexManagerObject",IndexManager.class,this);
|
||||||
|
HookServiceProviders hooker = (HookServiceProviders)(services.queryService(HookServiceProviders.class));
|
||||||
|
m_shut_runtime = hooker.hookRuntimeServiceProvider(ssp);
|
||||||
|
|
||||||
|
// Hook up IndexManagerConfig as an initialization service.
|
||||||
|
ssp = new SingletonServiceProvider("IndexManagerObject",IndexManagerConfig.class,this);
|
||||||
|
m_shut_init = hooker.hookInitServiceProvider(ssp);
|
||||||
|
|
||||||
|
// Set up a background task to poll the reference queue.
|
||||||
|
BackgroundScheduler sched = (BackgroundScheduler)(services.queryService(BackgroundScheduler.class));
|
||||||
|
m_shut_task = sched.runTaskPeriodic(new CleanupQueueTask(),5000,5000);
|
||||||
|
|
||||||
|
} // end initialize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ComponentShutdown
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void shutdown()
|
||||||
|
{
|
||||||
|
m_shut_task.shutdown();
|
||||||
|
m_shut_task = null;
|
||||||
|
m_shut_init.shutdown();
|
||||||
|
m_shut_init = null;
|
||||||
|
m_shut_runtime.shutdown();
|
||||||
|
m_shut_runtime = null;
|
||||||
|
m_ns_cache = null;
|
||||||
|
m_ops.dispose();
|
||||||
|
m_ops = null;
|
||||||
|
|
||||||
|
} // end shutdown
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface IndexManager
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Object resolveObjectReference(String namespace, String name, String tag) throws IndexException
|
||||||
|
{
|
||||||
|
return getResolver(namespace,name).resolveObject(tag);
|
||||||
|
|
||||||
|
} // end resolveObjectReference
|
||||||
|
|
||||||
|
public synchronized IndexService openIndex(String namespace, String name) throws DatabaseException, IndexException
|
||||||
|
{
|
||||||
|
PropertyKey key = new PropertyKey(m_ns_cache.namespaceNameToId(namespace),name);
|
||||||
|
IndexServiceImpl rc = (IndexServiceImpl)(m_indexcache.get(key));
|
||||||
|
if (rc==null)
|
||||||
|
{ // look up the index of the particular index service
|
||||||
|
int ndx = m_ops.getIndexID(key.getNamespaceID(),key.getName());
|
||||||
|
if (ndx==-1)
|
||||||
|
{ // the index is not present - bail out
|
||||||
|
IndexException ie = new IndexException(IndexManagerObject.class,"IndexMessages","no.such.index");
|
||||||
|
ie.setParameter(0,namespace);
|
||||||
|
ie.setParameter(1,name);
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
rc = new IndexServiceImpl(this,new QualifiedNameKey(namespace,name),ndx,m_ops.getIndexOps(),m_cleanupqueue);
|
||||||
|
m_indexcache.put(key,rc);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end openIndex
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface IndexManagerConfig
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public ComponentShutdown registerResolver(String namespace, String name, IndexedObjectResolver res)
|
||||||
|
{
|
||||||
|
QualifiedNameKey key = new QualifiedNameKey(namespace,name);
|
||||||
|
m_resolvers.put(key,res);
|
||||||
|
return new ShutdownHashtableRemove(m_resolvers,key);
|
||||||
|
|
||||||
|
} // end registerResolver
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
IndexedObjectResolver getResolver(String namespace, String name) throws IndexException
|
||||||
|
{
|
||||||
|
QualifiedNameKey key = new QualifiedNameKey(namespace,name);
|
||||||
|
IndexedObjectResolver res = (IndexedObjectResolver)(m_resolvers.get(key));
|
||||||
|
if (res==null)
|
||||||
|
{ // the resolver could not be found
|
||||||
|
IndexException e = new IndexException(IndexManagerObject.class,"IndexMessages","no.such.resolver");
|
||||||
|
e.setParameter(0,namespace);
|
||||||
|
e.setParameter(1,name);
|
||||||
|
throw e;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return res;
|
||||||
|
|
||||||
|
} // end getResolver
|
||||||
|
|
||||||
|
} // end class IndexManagerObject
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.db.OpsBase;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
abstract class IndexManagerOps extends OpsBase
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private IndexOps m_indexops = null;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected IndexManagerOps(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Overrides from class OpsBase
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void dispose()
|
||||||
|
{
|
||||||
|
if (m_indexops!=null)
|
||||||
|
m_indexops.dispose();
|
||||||
|
m_indexops = null;
|
||||||
|
super.dispose();
|
||||||
|
|
||||||
|
} // end dispose
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected abstract IndexOps createIndexOps(DBConnectionPool pool);
|
||||||
|
|
||||||
|
abstract int getIndexID(int nsid, String name) throws DatabaseException;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
synchronized IndexOps getIndexOps()
|
||||||
|
{
|
||||||
|
if (m_indexops==null)
|
||||||
|
m_indexops = createIndexOps(getPool());
|
||||||
|
return m_indexops;
|
||||||
|
|
||||||
|
} // end getIndexOps
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static IndexManagerOps get(DBConnectionPool pool) throws ConfigException
|
||||||
|
{
|
||||||
|
return (IndexManagerOps)get(pool,IndexManagerOps.class.getClassLoader(),IndexManagerOps.class.getName() + "_",
|
||||||
|
"IndexManagerOps");
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
} // end class IndexManagerOps
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
public class IndexManagerOps_mysql extends IndexManagerOps
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public IndexManagerOps_mysql(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract implementations from class IndexManagerOps
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected IndexOps createIndexOps(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
return new IndexOps_mysql(pool);
|
||||||
|
|
||||||
|
} // end createIndexOps
|
||||||
|
|
||||||
|
int getIndexID(int nsid, String name) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("SELECT ndxid FROM ndx_main WHERE nsid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,nsid);
|
||||||
|
stmt.setString(2,name);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return rs.getInt(1);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getIndexID
|
||||||
|
|
||||||
|
} // end class IndexManagerOps_mysql
|
|
@ -0,0 +1,24 @@
|
||||||
|
# The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
# (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.mozilla.org/MPL/>.
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
# WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
# language governing rights and limitations under the License.
|
||||||
|
#
|
||||||
|
# The Original Code is the Venice Web Communities System.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
# for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
# Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# This file has been localized for the en_US locale
|
||||||
|
no.such.resolver=No resolver has been registered for namespace {0}, name {1}.
|
||||||
|
no.such.index=No index has been defined with namespace {0} and name {1}.
|
||||||
|
analyzer.class.notfound=Unable to load the analyzer class {0}.
|
||||||
|
analyzer.noCreate=Unable to create an instance of the analyzer class {0}.
|
||||||
|
analyzer.badType=The specified analyzer class {0} is of the wrong type.
|
||||||
|
addItem.fail=Unable to add a new item (namespace {0}, name {1}) to index {2}.
|
||||||
|
deleteItem.fail=Unable to remove an item (namespace {0}, name {1}) from index {2}.
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import com.silverwrist.dynamo.db.OpsBase;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
abstract class IndexOps extends OpsBase
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected IndexOps(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract String getAnalyzerClassName(int ndx) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract String[] listFiles(int ndx) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract long getModTime(int ndx, String file) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void setModTime(int ndx, String file, long mtime) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void deleteFile(int ndx, String file) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void renameFile(int ndx, String oldfile, String newfile) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract int getLength(int ndx, String file) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract long createNewEntry(int ndx, String file) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract long loadFile(int ndx, String file, File output) throws DatabaseException, IOException;
|
||||||
|
|
||||||
|
abstract void storeFile(int ndx, String file, long mtime, File input) throws DatabaseException, IOException;
|
||||||
|
|
||||||
|
abstract boolean obtainLock(int ndx, String lock) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void releaseLock(int ndx, String lock) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void releaseAllLocks(int ndx) throws DatabaseException;
|
||||||
|
|
||||||
|
} // end class IndexOps
|
|
@ -0,0 +1,576 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
class IndexOps_mysql extends IndexOps
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public IndexOps_mysql(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract implementations from class IndexOps
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
String getAnalyzerClassName(int ndx) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("SELECT analyzer FROM ndx_main WHERE ndxid = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return rs.getString(1);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getAnalyzerClassName
|
||||||
|
|
||||||
|
String[] listFiles(int ndx) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// set up and execute the statement
|
||||||
|
stmt = conn.prepareStatement("SELECT name FROM ndx_files WHERE ndxid = ? ORDER BY name;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
|
||||||
|
// create the return value
|
||||||
|
ArrayList tmp = new ArrayList();
|
||||||
|
while (rs.next())
|
||||||
|
tmp.add(rs.getString(1));
|
||||||
|
String[] rc = new String[tmp.size()];
|
||||||
|
tmp.toArray(rc);
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end listFiles
|
||||||
|
|
||||||
|
long getModTime(int ndx, String file) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("SELECT mtime FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return rs.getLong(1);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getModTime
|
||||||
|
|
||||||
|
void setModTime(int ndx, String file, long mtime) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_files WRITE;");
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt = conn.prepareStatement("UPDATE ndx_files SET mtime = ? WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setLong(1,mtime);
|
||||||
|
stmt.setInt(2,ndx);
|
||||||
|
stmt.setString(3,file);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setModTime
|
||||||
|
|
||||||
|
void deleteFile(int ndx, String file) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_files WRITE;");
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("DELETE FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end deleteFile
|
||||||
|
|
||||||
|
void renameFile(int ndx, String oldfile, String newfile) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_files WRITE;");
|
||||||
|
|
||||||
|
// see if the "newfile" is present
|
||||||
|
stmt = conn.prepareStatement("SELECT mtime FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,newfile);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
boolean exists = rs.next();
|
||||||
|
rs.close();
|
||||||
|
rs = null;
|
||||||
|
stmt.close();
|
||||||
|
|
||||||
|
if (exists)
|
||||||
|
{ // delete the existing "newfile"
|
||||||
|
stmt = conn.prepareStatement("DELETE FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,newfile);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
stmt.close();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// rename the old file to the new filename
|
||||||
|
stmt = conn.prepareStatement("UPDATE ndx_files SET name = ? WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setString(1,newfile);
|
||||||
|
stmt.setInt(2,ndx);
|
||||||
|
stmt.setString(3,oldfile);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end renameFile
|
||||||
|
|
||||||
|
int getLength(int ndx, String file) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("SELECT length FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return rs.getInt(1);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getLength
|
||||||
|
|
||||||
|
long createNewEntry(int ndx, String file) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_files WRITE;");
|
||||||
|
|
||||||
|
// see if the entry exists already
|
||||||
|
stmt = conn.prepareStatement("SELECT mtime FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return -1L;
|
||||||
|
|
||||||
|
rs.close();
|
||||||
|
rs = null;
|
||||||
|
stmt.close();
|
||||||
|
|
||||||
|
// insert the new row
|
||||||
|
stmt = conn.prepareStatement("INSERT INTO ndx_files (ndxid, name, mtime) VALUES (?, ?, ?);");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
long rc = System.currentTimeMillis();
|
||||||
|
stmt.setLong(3,rc);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end createNewEntry
|
||||||
|
|
||||||
|
long loadFile(int ndx, String file, File output) throws DatabaseException, IOException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// get the modification time and data stream
|
||||||
|
stmt = conn.prepareStatement("SELECT mtime, data FROM ndx_files WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,file);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (!(rs.next()))
|
||||||
|
return -1L;
|
||||||
|
|
||||||
|
long rc = rs.getLong(1); // get the mod time
|
||||||
|
|
||||||
|
// Copy the file data to the output file.
|
||||||
|
FileOutputStream fstm = new FileOutputStream(output);
|
||||||
|
IOUtils.copy(rs.getBinaryStream(2),fstm);
|
||||||
|
fstm.close();
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end loadFile
|
||||||
|
|
||||||
|
void storeFile(int ndx, String file, long mtime, File input) throws DatabaseException, IOException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_files WRITE;");
|
||||||
|
|
||||||
|
// create and execute the statement
|
||||||
|
stmt = conn.prepareStatement("UPDATE ndx_files SET length = ?, mtime = ?, data = ? WHERE ndxid = ? "
|
||||||
|
+ "AND name = ?;");
|
||||||
|
int len = (int)(input.length());
|
||||||
|
stmt.setInt(1,len);
|
||||||
|
stmt.setLong(2,mtime);
|
||||||
|
stmt.setBinaryStream(3,new FileInputStream(input),len);
|
||||||
|
stmt.setInt(4,ndx);
|
||||||
|
stmt.setString(5,file);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end storeFile
|
||||||
|
|
||||||
|
boolean obtainLock(int ndx, String lock) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_locks WRITE;");
|
||||||
|
|
||||||
|
// see if the lock is already present
|
||||||
|
stmt = conn.prepareStatement("SELECT ndxid FROM ndx_locks WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,lock);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return false; // lock already present
|
||||||
|
rs.close();
|
||||||
|
rs = null;
|
||||||
|
stmt.close();
|
||||||
|
|
||||||
|
// insert the lock and return success
|
||||||
|
stmt = conn.prepareStatement("INSERT INTO ndx_locks (ndxid, name) VALUES (?, ?);");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,lock);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end obtain lock
|
||||||
|
|
||||||
|
void releaseLock(int ndx, String lock) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_locks WRITE;");
|
||||||
|
|
||||||
|
// remove the lock row
|
||||||
|
stmt = conn.prepareStatement("DELETE FROM ndx_locks WHERE ndxid = ? AND name = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.setString(2,lock);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end releaseLock
|
||||||
|
|
||||||
|
void releaseAllLocks(int ndx) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
Statement stmt2 = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt2 = conn.createStatement();
|
||||||
|
stmt2.executeUpdate("LOCK TABLES ndx_locks WRITE;");
|
||||||
|
|
||||||
|
// remove the lock row
|
||||||
|
stmt = conn.prepareStatement("DELETE FROM ndx_locks WHERE ndxid = ?;");
|
||||||
|
stmt.setInt(1,ndx);
|
||||||
|
stmt.executeUpdate();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate to a general DatabaseException
|
||||||
|
throw generalException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut everything down
|
||||||
|
MySQLUtils.unlockTables(conn);
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
SQLUtils.shutdown(stmt2);
|
||||||
|
SQLUtils.shutdown(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end releaseAllLocks
|
||||||
|
|
||||||
|
} // end class IndexOps_mysql
|
|
@ -0,0 +1,166 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.index;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.ref.*;
|
||||||
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
|
import org.apache.lucene.document.*;
|
||||||
|
import org.apache.lucene.index.*;
|
||||||
|
import org.apache.lucene.store.Directory;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
import com.silverwrist.dynamo.util.*;
|
||||||
|
|
||||||
|
class IndexServiceImpl implements IndexService
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private QualifiedNameKey m_identity;
|
||||||
|
private IndexManagerObject m_base;
|
||||||
|
private Analyzer m_analyzer;
|
||||||
|
private IndexDirectoryImpl m_directory;
|
||||||
|
private DirectoryAutoCleanup m_cleanup;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
IndexServiceImpl(IndexManagerObject base, QualifiedNameKey identity, int ndx, IndexOps ops, ReferenceQueue rq)
|
||||||
|
throws DatabaseException, IndexException
|
||||||
|
{
|
||||||
|
String ana_klass = null;
|
||||||
|
try
|
||||||
|
{ // Create the analyzer class.
|
||||||
|
ana_klass = ops.getAnalyzerClassName(ndx);
|
||||||
|
m_analyzer = (Analyzer)(Class.forName(ana_klass).newInstance());
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassNotFoundException e)
|
||||||
|
{ // unable to find the Analyzer class
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","analyzer.class.notfound",e);
|
||||||
|
ie.setParameter(0,ana_klass);
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IllegalAccessException e)
|
||||||
|
{ // problem creating the analyzer class
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","analyzer.noCreate",e);
|
||||||
|
ie.setParameter(0,ana_klass);
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (InstantiationException e)
|
||||||
|
{ // unable to instantiate the class
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","analyzer.noCreate",e);
|
||||||
|
ie.setParameter(0,ana_klass);
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ClassCastException e)
|
||||||
|
{ // bad class specified
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","analyzer.badType",e);
|
||||||
|
ie.setParameter(0,ana_klass);
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
m_base = base;
|
||||||
|
m_identity = identity;
|
||||||
|
m_directory = new IndexDirectoryImpl(ndx,ops);
|
||||||
|
m_cleanup = new DirectoryAutoCleanup(this,m_directory,rq);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private final String createTag(String namespace, String name, Object obj) throws IndexException
|
||||||
|
{
|
||||||
|
String objtag = m_base.getResolver(namespace,name).getResolverTag(obj);
|
||||||
|
return namespace + "|" + name + "|" + objtag;
|
||||||
|
|
||||||
|
} // end createTag
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface IndexService
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void addItem(String item_namespace, String item_name, Object item, String scope, java.util.Date date,
|
||||||
|
DynamoUser owner, String text) throws IndexException
|
||||||
|
{
|
||||||
|
// Create a new Lucene Document containing the item information.
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(Field.Keyword("id",createTag(item_namespace,item_name,item)));
|
||||||
|
doc.add(Field.Keyword("date",date));
|
||||||
|
doc.add(Field.Keyword("owner",owner.getName()));
|
||||||
|
doc.add(Field.Keyword("scope",scope));
|
||||||
|
doc.add(Field.UnStored("text",text));
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // Use an IndexWriter to write it to the index.
|
||||||
|
IndexWriter iwr = new IndexWriter(m_directory,m_analyzer,false);
|
||||||
|
iwr.addDocument(doc);
|
||||||
|
iwr.close();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // translate Lucene's IOException here
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","addItem.fail",e);
|
||||||
|
ie.setParameter(0,item_namespace);
|
||||||
|
ie.setParameter(1,item_name);
|
||||||
|
ie.setParameter(2,m_identity.toString());
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end addItem
|
||||||
|
|
||||||
|
public boolean deleteItem(String item_namespace, String item_name, Object item) throws IndexException
|
||||||
|
{
|
||||||
|
// Create a Lucene Term matching the given document.
|
||||||
|
Term term = new Term("id",createTag(item_namespace,item_name,item));
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // Use an IndexReader to delete the appropriate document.
|
||||||
|
IndexReader irdr = IndexReader.open(m_directory);
|
||||||
|
int ndel = irdr.delete(term);
|
||||||
|
irdr.close();
|
||||||
|
return (ndel>0);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // translate Lucene's IOException here
|
||||||
|
IndexException ie = new IndexException(IndexServiceImpl.class,"IndexMessages","deleteItem.fail",e);
|
||||||
|
ie.setParameter(0,item_namespace);
|
||||||
|
ie.setParameter(1,item_name);
|
||||||
|
ie.setParameter(2,m_identity.toString());
|
||||||
|
throw ie;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end deleteItem
|
||||||
|
|
||||||
|
} // end class IndexServiceImpl
|
Loading…
Reference in New Issue
Block a user