implemented dictionary manager which ties into the HTML Checker
This commit is contained in:
parent
92a569cbbd
commit
11be5128bf
|
@ -145,6 +145,7 @@
|
||||||
<copy todir="workingarea/dynamo-framework">
|
<copy todir="workingarea/dynamo-framework">
|
||||||
<fileset dir="src/dynamo-framework" includes="**/*.properties"/>
|
<fileset dir="src/dynamo-framework" includes="**/*.properties"/>
|
||||||
<fileset dir="src/dynamo-framework" includes="**/*.ini"/>
|
<fileset dir="src/dynamo-framework" includes="**/*.ini"/>
|
||||||
|
<fileset dir="src/dynamo-framework" includes="**/*.dict"/>
|
||||||
</copy>
|
</copy>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,14 @@
|
||||||
<database connection="data" namespaces="nscache"/>
|
<database connection="data" namespaces="nscache"/>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
|
<object name="dictionary" classname="com.silverwrist.dynamo.dict.DictionarySubsystem" priority="6">
|
||||||
|
<dictionary name="BASE" classname="com.silverwrist.dynamo.dict.ResourceDictionary" resource="en-us.dict"/>
|
||||||
|
<dictionary name="SUPP" classname="com.silverwrist.dynamo.dict.ResourceDictionary" resource="supplemental.dict"/>
|
||||||
|
<dictionary name="DB" classname="com.silverwrist.dynamo.dict.DatabaseDictionary">
|
||||||
|
<database connection="data"/>
|
||||||
|
</dictionary>
|
||||||
|
</object>
|
||||||
|
|
||||||
<!-- Presentation and interface objects -->
|
<!-- Presentation and interface objects -->
|
||||||
<object name="remapper" classname="com.silverwrist.dynamo.servlet.RemapperData" priority="0">
|
<object name="remapper" classname="com.silverwrist.dynamo.servlet.RemapperData" priority="0">
|
||||||
<remap path="/verifyemail">
|
<remap path="/verifyemail">
|
||||||
|
|
|
@ -85,6 +85,14 @@
|
||||||
<database connection="data" namespaces="nscache"/>
|
<database connection="data" namespaces="nscache"/>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
|
<object name="dictionary" classname="com.silverwrist.dynamo.dict.DictionarySubsystem" priority="6">
|
||||||
|
<dictionary name="BASE" classname="com.silverwrist.dynamo.dict.ResourceDictionary" resource="en-us.dict"/>
|
||||||
|
<dictionary name="SUPP" classname="com.silverwrist.dynamo.dict.ResourceDictionary" resource="supplemental.dict"/>
|
||||||
|
<dictionary name="DB" classname="com.silverwrist.dynamo.dict.DatabaseDictionary">
|
||||||
|
<database connection="data"/>
|
||||||
|
</dictionary>
|
||||||
|
</object>
|
||||||
|
|
||||||
<!-- Presentation and interface objects -->
|
<!-- Presentation and interface objects -->
|
||||||
<object name="remapper" classname="com.silverwrist.dynamo.servlet.RemapperData" priority="0">
|
<object name="remapper" classname="com.silverwrist.dynamo.servlet.RemapperData" priority="0">
|
||||||
<remap path="/verifyemail">
|
<remap path="/verifyemail">
|
||||||
|
|
|
@ -235,6 +235,11 @@ CREATE TABLE htmltagsets (
|
||||||
PRIMARY KEY (profid, tagset)
|
PRIMARY KEY (profid, tagset)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
# Dictionary table.
|
||||||
|
CREATE TABLE dictionary (
|
||||||
|
word VARCHAR(128) NOT NULL PRIMARY KEY # the word
|
||||||
|
);
|
||||||
|
|
||||||
#### following this line are Venice-specific tables ####
|
#### following this line are Venice-specific tables ####
|
||||||
|
|
||||||
# The table which defines menus.
|
# The table which defines menus.
|
||||||
|
|
|
@ -80,4 +80,10 @@ public interface Namespaces
|
||||||
public static final String HTMLCHECKER_PROPERTIES_NAMESPACE =
|
public static final String HTMLCHECKER_PROPERTIES_NAMESPACE =
|
||||||
"http://www.silverwrist.com/NS/dynamo/2003/06/05/htmlchecker.properties";
|
"http://www.silverwrist.com/NS/dynamo/2003/06/05/htmlchecker.properties";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Namespace for the spelling checker properties.
|
||||||
|
*/
|
||||||
|
public static final String SPELLCHECKER_PROPERTIES_NAMESPACE =
|
||||||
|
"http://www.silverwrist.com/NS/dynamo/2003/06/07/spellchecker.properties";
|
||||||
|
|
||||||
} // end interface Namespaces
|
} // end interface Namespaces
|
||||||
|
|
|
@ -359,70 +359,6 @@ public class ApplicationContainer
|
||||||
|
|
||||||
} // end getUltimateComponent
|
} // end getUltimateComponent
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds an instance of the {@link com.silverwrist.dynamo.iface.ComponentInitialize ComponentInitialize} interface
|
|
||||||
* associated with the given object, either through implementation of the interface, or by querying its
|
|
||||||
* {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider} implementation.
|
|
||||||
*
|
|
||||||
* @param obj The object to be queried.
|
|
||||||
* @return The instance of <CODE>ComponentInitialize</CODE> associated with the object, or <CODE>null</CODE>
|
|
||||||
* if there is no such instance.
|
|
||||||
*/
|
|
||||||
private static final ComponentInitialize getComponentInitialize(Object obj)
|
|
||||||
{
|
|
||||||
if (obj instanceof ComponentInitialize)
|
|
||||||
return (ComponentInitialize)obj;
|
|
||||||
if (obj instanceof ServiceProvider)
|
|
||||||
{ // it may be a service provider interface
|
|
||||||
try
|
|
||||||
{ // look for ComponentInitialize as a service
|
|
||||||
ServiceProvider sp = (ServiceProvider)obj;
|
|
||||||
ComponentInitialize rc = (ComponentInitialize)(sp.queryService(ComponentInitialize.class));
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
} // end try
|
|
||||||
catch (NoSuchServiceException e)
|
|
||||||
{ // do nothing here
|
|
||||||
} // end catch
|
|
||||||
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
return null; // no dice!
|
|
||||||
|
|
||||||
} // end getComponentInitialize
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds an instance of the {@link com.silverwrist.dynamo.iface.ComponentShutdown ComponentShutdown} interface
|
|
||||||
* associated with the given object, either through implementation of the interface, or by querying its
|
|
||||||
* {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider} implementation.
|
|
||||||
*
|
|
||||||
* @param obj The object to be queried.
|
|
||||||
* @return The instance of <CODE>ComponentShutdown</CODE> associated with the object, or <CODE>null</CODE>
|
|
||||||
* if there is no such instance.
|
|
||||||
*/
|
|
||||||
private static final ComponentShutdown getComponentShutdown(Object obj)
|
|
||||||
{
|
|
||||||
if (obj instanceof ComponentShutdown)
|
|
||||||
return (ComponentShutdown)obj;
|
|
||||||
if (obj instanceof ServiceProvider)
|
|
||||||
{ // it may be a service provider interface
|
|
||||||
try
|
|
||||||
{ // look for ComponentShutdown as a service
|
|
||||||
ServiceProvider sp = (ServiceProvider)obj;
|
|
||||||
ComponentShutdown rc = (ComponentShutdown)(sp.queryService(ComponentShutdown.class));
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
} // end try
|
|
||||||
catch (NoSuchServiceException e)
|
|
||||||
{ // do nothing here
|
|
||||||
} // end catch
|
|
||||||
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
return null; // no dice!
|
|
||||||
|
|
||||||
} // end getComponentShutdown
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys all data associated with this <CODE>ApplicationContainer</CODE>.
|
* Destroys all data associated with this <CODE>ApplicationContainer</CODE>.
|
||||||
*/
|
*/
|
||||||
|
@ -555,94 +491,19 @@ public class ApplicationContainer
|
||||||
|
|
||||||
} // end processControlSection
|
} // end processControlSection
|
||||||
|
|
||||||
private final NamedObject createNamedObject(Element config_root, ServiceProvider services,
|
private final NamedObject createNamedObject(Element config_root, ServiceProvider services, Class extratest,
|
||||||
Class extratest, String extratest_msg)
|
String extratest_msg) throws ConfigException
|
||||||
throws ConfigException
|
|
||||||
{
|
{
|
||||||
XMLLoader loader = XMLLoader.get();
|
NamedObject nobj = LoaderUtils.loadObject(config_root,services,extratest);
|
||||||
String klassname = null;
|
|
||||||
try
|
|
||||||
{ // get the classname and load it, and create an object
|
|
||||||
klassname = loader.getAttribute(config_root,"classname");
|
|
||||||
if (logger.isDebugEnabled())
|
|
||||||
{ // output a proper debug message
|
|
||||||
Class desired = (extratest==null) ? NamedObject.class : extratest;
|
|
||||||
logger.debug("createNamedObject: Creating new NamedObject of class " + klassname
|
|
||||||
+ ", which should implement " + desired.getName());
|
|
||||||
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
Class klass = Class.forName(klassname);
|
|
||||||
if (!(NamedObject.class.isAssignableFrom(klass)))
|
|
||||||
{ // this object is not a valid NamedObject
|
|
||||||
logger.error("object " + klassname + " does not implement NamedObject");
|
|
||||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
|
||||||
"no.notDynamo");
|
|
||||||
ce.setParameter(0,klassname);
|
|
||||||
throw ce;
|
|
||||||
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
if ((extratest!=null) && !(extratest.isAssignableFrom(klass)))
|
|
||||||
{ // this object is not a valid (whatever)
|
|
||||||
logger.error("object " + klassname + " does not implement " + extratest.getName());
|
|
||||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
|
||||||
extratest_msg);
|
|
||||||
ce.setParameter(0,klassname);
|
|
||||||
throw ce;
|
|
||||||
|
|
||||||
} // end if
|
|
||||||
|
|
||||||
// instantiate the object, and initialize it as needed
|
|
||||||
Object rc = klass.newInstance();
|
|
||||||
ComponentInitialize init = getComponentInitialize(rc);
|
|
||||||
if (init!=null)
|
|
||||||
init.initialize(config_root,services);
|
|
||||||
|
|
||||||
synchronized (this)
|
synchronized (this)
|
||||||
{ // save its shutdown hook for later
|
{ // save its shutdown hook for later
|
||||||
ComponentShutdown sd = getComponentShutdown(rc);
|
ComponentShutdown sd = (ComponentShutdown)(LoaderUtils.query(ComponentShutdown.class,nobj));
|
||||||
if (sd!=null)
|
if (sd!=null)
|
||||||
m_shutdown_list.addFirst(sd);
|
m_shutdown_list.addFirst(sd);
|
||||||
|
|
||||||
} // end synchronized block
|
} // end synchronized block
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
return nobj;
|
||||||
logger.debug("Object \"" + ((NamedObject)rc).getName() + "\" (of class " + klassname + ") created");
|
|
||||||
|
|
||||||
return (NamedObject)rc;
|
|
||||||
|
|
||||||
} // end try
|
|
||||||
catch (XMLLoadException e)
|
|
||||||
{ // error getting class name - throw the ConfigException
|
|
||||||
logger.error("XML loader failure",e);
|
|
||||||
throw new ConfigException(e);
|
|
||||||
|
|
||||||
} // end catch
|
|
||||||
catch (ClassNotFoundException e)
|
|
||||||
{ // the class was not found
|
|
||||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
|
||||||
"no.classNotFound");
|
|
||||||
ce.setParameter(0,klassname);
|
|
||||||
throw ce;
|
|
||||||
|
|
||||||
} // end catch
|
|
||||||
catch (IllegalAccessException e)
|
|
||||||
{ // unable to create this object
|
|
||||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
|
||||||
"no.createError");
|
|
||||||
ce.setParameter(0,klassname);
|
|
||||||
throw ce;
|
|
||||||
|
|
||||||
} // end catch
|
|
||||||
catch (InstantiationException e)
|
|
||||||
{ // unable to create this object
|
|
||||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
|
||||||
"no.createError");
|
|
||||||
ce.setParameter(0,klassname);
|
|
||||||
throw ce;
|
|
||||||
|
|
||||||
} // end catch
|
|
||||||
|
|
||||||
} // end createNamedObject
|
} // end createNamedObject
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.db.OpsBase;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
abstract class DatabaseDictOps extends OpsBase
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected DatabaseDictOps(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract int getSize() throws DatabaseException;
|
||||||
|
|
||||||
|
abstract boolean checkWord(String word) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract boolean addWord(String word) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract boolean removeWord(String word) throws DatabaseException;
|
||||||
|
|
||||||
|
abstract void clearDictionary() throws DatabaseException;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static DatabaseDictOps get(DBConnectionPool pool) throws ConfigException
|
||||||
|
{
|
||||||
|
return (DatabaseDictOps)get(pool,DatabaseDictOps.class.getClassLoader(),DatabaseDictOps.class.getName() + "_",
|
||||||
|
"DatabaseDictOps");
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
} // end class DatabaseDictOps
|
|
@ -0,0 +1,225 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
public class DatabaseDictOps_mysql extends DatabaseDictOps
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public DatabaseDictOps_mysql(DBConnectionPool pool)
|
||||||
|
{
|
||||||
|
super(pool);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Abstract implementations from class DatabaseDictOps
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
int getSize() throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
Statement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// execute the count statement
|
||||||
|
stmt = conn.createStatement();
|
||||||
|
rs = stmt.executeQuery("SELECT COUNT(*) FROM dictionary;");
|
||||||
|
return SQLUtils.getReturnCountInt(rs,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 getSize
|
||||||
|
|
||||||
|
boolean checkWord(String word) throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
PreparedStatement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// prepare and execute a statement
|
||||||
|
stmt = conn.prepareStatement("SELECT word FROM dictionary WHERE word = ?;");
|
||||||
|
stmt.setString(1,word);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
return rs.next();
|
||||||
|
|
||||||
|
} // 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 checkWord
|
||||||
|
|
||||||
|
boolean addWord(String word) 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 dictionary WRITE;");
|
||||||
|
|
||||||
|
// see if the word's in the database
|
||||||
|
stmt = conn.prepareStatement("SELECT word FROM dictionary WHERE word = ?;");
|
||||||
|
stmt.setString(1,word);
|
||||||
|
rs = stmt.executeQuery();
|
||||||
|
if (rs.next())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SQLUtils.shutdown(rs);
|
||||||
|
rs = null;
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
|
||||||
|
stmt = conn.prepareStatement("INSERT INTO dictionary (word) VALUES (?);");
|
||||||
|
stmt.setString(1,word);
|
||||||
|
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 addWord
|
||||||
|
|
||||||
|
boolean removeWord(String word) 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 dictionary WRITE;");
|
||||||
|
|
||||||
|
// prepare and execute the delete statement
|
||||||
|
stmt = conn.prepareStatement("DELETE FROM dictionary WHERE word = ?;");
|
||||||
|
stmt.setString(1,word);
|
||||||
|
int rows = stmt.executeUpdate();
|
||||||
|
return (rows>0);
|
||||||
|
|
||||||
|
} // 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 removeWord
|
||||||
|
|
||||||
|
void clearDictionary() throws DatabaseException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
Statement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
try
|
||||||
|
{ // get a connection
|
||||||
|
conn = getConnection();
|
||||||
|
|
||||||
|
// lock the table
|
||||||
|
stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES dictionary WRITE;");
|
||||||
|
SQLUtils.shutdown(stmt);
|
||||||
|
|
||||||
|
// execute the statement
|
||||||
|
stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("DELETE FROM dictionary;");
|
||||||
|
|
||||||
|
} // 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(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end clearDictionary
|
||||||
|
|
||||||
|
} // end class DatabaseDictOps_mysql
|
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.xml.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
import com.silverwrist.dynamo.util.*;
|
||||||
|
|
||||||
|
public class DatabaseDictionary
|
||||||
|
implements NamedObject, ComponentInitialize, ComponentShutdown, DynamoModifiableDictionary
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(DatabaseDictionary.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_name; // name of this object
|
||||||
|
private DatabaseDictOps m_ops; // database operations object
|
||||||
|
private int m_cache_size = -1; // cached size
|
||||||
|
private WeakHashMap m_cache_yes; // words in dictionary
|
||||||
|
private WeakHashMap m_cache_no; // words not in dictionary
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public DatabaseDictionary()
|
||||||
|
{
|
||||||
|
m_cache_yes = new WeakHashMap();
|
||||||
|
m_cache_no = new WeakHashMap();
|
||||||
|
|
||||||
|
} // 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
|
||||||
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
String conn_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");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (XMLLoadException e)
|
||||||
|
{ // error loading XML config data
|
||||||
|
throw new ConfigException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// Get the database connection pool.
|
||||||
|
DBConnectionPool pool = GetObjectUtils.getDatabaseConnection(services,conn_name);
|
||||||
|
|
||||||
|
// Get the operations object.
|
||||||
|
m_ops = DatabaseDictOps.get(pool);
|
||||||
|
|
||||||
|
} // end initialize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ComponentShutdown
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void shutdown()
|
||||||
|
{
|
||||||
|
m_ops.dispose();
|
||||||
|
m_ops = null;
|
||||||
|
|
||||||
|
} // end shutdown
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface DynamoDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized int size()
|
||||||
|
{
|
||||||
|
if (m_cache_size<0)
|
||||||
|
{ // need to get the dictionary size
|
||||||
|
try
|
||||||
|
{ // get the size from the database
|
||||||
|
m_cache_size = m_ops.getSize();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // whoops! error
|
||||||
|
logger.warn("DatabaseDictionary.size(): database error",e);
|
||||||
|
m_cache_size = -1;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return m_cache_size;
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
public synchronized boolean check(String word)
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
if (m_cache_yes.containsKey(real_word))
|
||||||
|
return true;
|
||||||
|
else if (m_cache_no.containsKey(real_word))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
boolean rc = false;
|
||||||
|
try
|
||||||
|
{ // check the database, stash result in cache
|
||||||
|
rc = m_ops.checkWord(real_word);
|
||||||
|
if (rc)
|
||||||
|
m_cache_yes.put(real_word,Boolean.TRUE);
|
||||||
|
else
|
||||||
|
m_cache_no.put(real_word,Boolean.FALSE);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException e)
|
||||||
|
{ // database error
|
||||||
|
logger.warn("DatabaseDictionary.check(): database error",e);
|
||||||
|
rc = false;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end check
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface DynamoModifiableDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized void add(String word) throws DictionaryException
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
try
|
||||||
|
{ // add to the dictionary
|
||||||
|
boolean added = m_ops.addWord(real_word);
|
||||||
|
if (added && (m_cache_size>=0))
|
||||||
|
m_cache_size++;
|
||||||
|
m_cache_yes.put(real_word,Boolean.TRUE);
|
||||||
|
m_cache_no.remove(real_word);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException de)
|
||||||
|
{ // error adding to the database
|
||||||
|
throw new DictionaryException(DatabaseDictionary.class,"DatabaseDictionaryMessages","add.failed",de);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end add
|
||||||
|
|
||||||
|
public void remove(String word) throws DictionaryException
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
try
|
||||||
|
{ // add to the dictionary
|
||||||
|
boolean removed = m_ops.removeWord(real_word);
|
||||||
|
if (removed && (m_cache_size>=0))
|
||||||
|
m_cache_size--;
|
||||||
|
m_cache_no.put(real_word,Boolean.FALSE);
|
||||||
|
m_cache_yes.remove(real_word);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException de)
|
||||||
|
{ // error adding to the database
|
||||||
|
throw new DictionaryException(DatabaseDictionary.class,"DatabaseDictionaryMessages","remove.failed",de);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end remove
|
||||||
|
|
||||||
|
public void clear() throws DictionaryException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // zap it
|
||||||
|
m_ops.clearDictionary();
|
||||||
|
m_cache_size = 0;
|
||||||
|
m_cache_yes.clear();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DatabaseException de)
|
||||||
|
{ // error adding to the database
|
||||||
|
throw new DictionaryException(DatabaseDictionary.class,"DatabaseDictionaryMessages","clear.failed",de);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end clear
|
||||||
|
|
||||||
|
} // end class DatabaseDictionary
|
|
@ -0,0 +1,20 @@
|
||||||
|
# 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
|
||||||
|
add.failed=Unable to add word to database.
|
||||||
|
remove.failed=Unable to remove word from database.
|
||||||
|
clear.failed=Unable to clear database dictionary.
|
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.util.xml.*;
|
||||||
|
import com.silverwrist.dynamo.Namespaces;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
import com.silverwrist.dynamo.util.*;
|
||||||
|
|
||||||
|
public class DictionarySubsystem
|
||||||
|
implements NamedObject, ComponentInitialize, ComponentShutdown, HTMLCheckerConfigurator
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(DictionarySubsystem.class);
|
||||||
|
|
||||||
|
private static final String DEFAULT_BEGIN_ERROR = "<span class=\"spellingerror\">";
|
||||||
|
private static final String DEFAULT_END_ERROR = "</span>";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_name; // name of this object
|
||||||
|
private LinkedList m_shutdown_list; // object shutdown list
|
||||||
|
private Hashtable m_dictionaries; // current dictionaries
|
||||||
|
private Hashtable m_modifiable_dictionaries; // current modifiable dictionaries
|
||||||
|
private ComponentShutdown m_htmlchecker; // HTML checker configurator
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public DictionarySubsystem()
|
||||||
|
{
|
||||||
|
m_shutdown_list = new LinkedList();
|
||||||
|
m_dictionaries = new Hashtable();
|
||||||
|
m_modifiable_dictionaries = new Hashtable();
|
||||||
|
|
||||||
|
} // 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("DictionarySubsystem initializing");
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
List subobjects = 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 subobject nodes to load
|
||||||
|
subobjects = loader.getMatchingSubElements(config_root,"dictionary");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (XMLLoadException e)
|
||||||
|
{ // error loading XML config data
|
||||||
|
throw new ConfigException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// load and initialize the dictionary subobjects
|
||||||
|
Iterator it = subobjects.iterator();
|
||||||
|
while (it.hasNext())
|
||||||
|
{ // initialize all the dictionary subobjects
|
||||||
|
Element droot = (Element)(it.next());
|
||||||
|
DynamoDictionary dict = (DynamoDictionary)(LoaderUtils.loadObject(droot,services,DynamoDictionary.class));
|
||||||
|
ComponentShutdown cs = (ComponentShutdown)(LoaderUtils.query(ComponentShutdown.class,dict));
|
||||||
|
if (cs!=null)
|
||||||
|
m_shutdown_list.addFirst(cs);
|
||||||
|
String dictname = ((NamedObject)dict).getName();
|
||||||
|
m_dictionaries.put(dictname,dict);
|
||||||
|
if (dict instanceof DynamoModifiableDictionary)
|
||||||
|
m_modifiable_dictionaries.put(dictname,dict);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
// Link us into the HTML Checker's configurators list.
|
||||||
|
HTMLCheckerConfigRegister creg =
|
||||||
|
(HTMLCheckerConfigRegister)(services.queryService(HTMLCheckerConfigRegister.class));
|
||||||
|
m_htmlchecker = creg.registerConfigurator(this);
|
||||||
|
|
||||||
|
} // end initialize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ComponentShutdown
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void shutdown()
|
||||||
|
{
|
||||||
|
m_htmlchecker.shutdown();
|
||||||
|
m_htmlchecker = null;
|
||||||
|
m_dictionaries.clear();
|
||||||
|
m_modifiable_dictionaries.clear();
|
||||||
|
while (m_shutdown_list.size()>0)
|
||||||
|
{ // shut down all the components
|
||||||
|
ComponentShutdown cs = (ComponentShutdown)(m_shutdown_list.removeFirst());
|
||||||
|
cs.shutdown();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end shutdown
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface HTMLCheckerConfigurator
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void configure(HTMLCheckerProfile profile)
|
||||||
|
{
|
||||||
|
boolean enable =
|
||||||
|
((Boolean)(PropertyUtils.getPropertyDefault(profile,Namespaces.SPELLCHECKER_PROPERTIES_NAMESPACE,
|
||||||
|
"enable",Boolean.FALSE))).booleanValue();
|
||||||
|
if (enable)
|
||||||
|
{ // get the list of dictionaries
|
||||||
|
String dictnames = PropertyUtils.getPropertyDefault(profile,Namespaces.SPELLCHECKER_PROPERTIES_NAMESPACE,
|
||||||
|
"dictionaries","").toString();
|
||||||
|
String[] dictname_list = StringUtils.split1(dictnames,',');
|
||||||
|
ArrayList dict_list = new ArrayList();
|
||||||
|
for (int i=0; i<dictname_list.length; i++)
|
||||||
|
{ // locate the dictionaries and plug them in
|
||||||
|
DynamoDictionary d = (DynamoDictionary)(m_dictionaries.get(dictname_list[i].trim()));
|
||||||
|
if (d!=null)
|
||||||
|
dict_list.add(d);
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
DynamoDictionary[] dicts = new DynamoDictionary[dict_list.size()];
|
||||||
|
dict_list.toArray(dicts);
|
||||||
|
|
||||||
|
// get the begin error and end error sequences
|
||||||
|
String begin_error = PropertyUtils.getPropertyDefault(profile,Namespaces.SPELLCHECKER_PROPERTIES_NAMESPACE,
|
||||||
|
"begin.error",DEFAULT_BEGIN_ERROR).toString();
|
||||||
|
String end_error = PropertyUtils.getPropertyDefault(profile,Namespaces.SPELLCHECKER_PROPERTIES_NAMESPACE,
|
||||||
|
"end.error",DEFAULT_END_ERROR).toString();
|
||||||
|
|
||||||
|
// load a spellchucker, ready to go!
|
||||||
|
profile.addWordRewriter(new Spellchecker(dicts,begin_error,end_error));
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end configure
|
||||||
|
|
||||||
|
} // end class DictionarySubsystem
|
|
@ -0,0 +1,288 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.util.xml.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
public class ResourceDictionary implements NamedObject, ComponentInitialize, ComponentShutdown, DynamoDictionary
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class that loads the trie
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static class TrieLoader implements BackgroundTask
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Attributes
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Reader m_rdr;
|
||||||
|
private String m_rdrname;
|
||||||
|
private volatile Trie m_trie = null;
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
TrieLoader(Reader rdr, String rdrname)
|
||||||
|
{
|
||||||
|
m_rdr = rdr;
|
||||||
|
m_rdrname = rdrname;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Implementations from interface BackgroundTask
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the background task.
|
||||||
|
*
|
||||||
|
* @param services A {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider} which provides all
|
||||||
|
* services that the <CODE>BackgroundTask</CODE> is permitted to use.
|
||||||
|
*/
|
||||||
|
public void run(ServiceProvider services)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("now loading resource " + m_rdrname);
|
||||||
|
Trie trie = new Trie();
|
||||||
|
try
|
||||||
|
{ // create the appropriate reader
|
||||||
|
BufferedReader r = new BufferedReader(m_rdr);
|
||||||
|
int counter = 0;
|
||||||
|
String word = r.readLine();
|
||||||
|
while (word!=null)
|
||||||
|
{ // load words into the lexicon
|
||||||
|
trie.add(word);
|
||||||
|
word = r.readLine();
|
||||||
|
if (((++counter % 1000)==0) && logger.isDebugEnabled())
|
||||||
|
logger.debug("loaded " + counter + " words");
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
r.close();
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("finished loading resource " + m_rdrname + ", " + counter + " words loaded");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // trap it and go on to the next one
|
||||||
|
logger.error("IOException loading resource " + m_rdrname,e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
synchronized (this)
|
||||||
|
{ // save off the trie
|
||||||
|
m_trie = trie;
|
||||||
|
m_rdr = null;
|
||||||
|
notifyAll();
|
||||||
|
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
System.gc(); // clean up any crap left over from the load
|
||||||
|
|
||||||
|
} // end run
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* External operations
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
synchronized Trie getTrie()
|
||||||
|
{
|
||||||
|
while (m_trie==null)
|
||||||
|
{ // not loaded yet - wait for it
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("waiting for trie to load...");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // park the thread here until we know what's up
|
||||||
|
wait();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (InterruptedException e)
|
||||||
|
{ // do nothing
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
return m_trie;
|
||||||
|
|
||||||
|
} // end getTrie
|
||||||
|
|
||||||
|
} // end class TrieLoader
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(ResourceDictionary.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_name; // name of this object
|
||||||
|
private TrieLoader m_loader; // contains the trie we're loading
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public ResourceDictionary()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final boolean checkHyphenates(Trie trie, String word)
|
||||||
|
{
|
||||||
|
if (word.indexOf('-')<0)
|
||||||
|
return false; // no hyphenates
|
||||||
|
|
||||||
|
String[] parts = StringUtils.split1(word,'-');
|
||||||
|
boolean ok = true;
|
||||||
|
for (int i=0; ok && (i<parts.length); i++)
|
||||||
|
if (parts[i].length()>1)
|
||||||
|
ok = trie.check(parts[i]);
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
|
||||||
|
} // end checkHyphenates
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* 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
|
||||||
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
String resource_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 name of the resource to load
|
||||||
|
resource_name = loader.getAttribute(config_root,"resource");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (XMLLoadException e)
|
||||||
|
{ // error loading XML config data
|
||||||
|
throw new ConfigException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// Create the loader object.
|
||||||
|
m_loader = new TrieLoader(new InputStreamReader(getClass().getResourceAsStream(resource_name)),resource_name);
|
||||||
|
|
||||||
|
// Queue the loader up as a background task.
|
||||||
|
BackgroundScheduler sched = (BackgroundScheduler)(services.queryService(BackgroundScheduler.class));
|
||||||
|
sched.runTaskLater(m_loader,false);
|
||||||
|
|
||||||
|
} // end initialize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ComponentShutdown
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void shutdown()
|
||||||
|
{
|
||||||
|
m_loader = null;
|
||||||
|
|
||||||
|
} // end shutdown
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface DynamoDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return m_loader.getTrie().size();
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
public boolean check(String word)
|
||||||
|
{
|
||||||
|
if (word==null)
|
||||||
|
return false;
|
||||||
|
if (word.length()<=1)
|
||||||
|
return true;
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
Trie trie = m_loader.getTrie();
|
||||||
|
if (trie.check(real_word))
|
||||||
|
return true;
|
||||||
|
if (real_word.endsWith("'s"))
|
||||||
|
{ // check the non-possessive form
|
||||||
|
String base = real_word.substring(0,real_word.length()-2);
|
||||||
|
if (trie.check(base))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return checkHyphenates(trie,base);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // check all hyphenates
|
||||||
|
return checkHyphenates(trie,real_word);
|
||||||
|
|
||||||
|
} // end check
|
||||||
|
|
||||||
|
} // end class ResourceDictionary
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
import com.silverwrist.dynamo.Namespaces;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.htmlcheck.MarkupData;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
import com.silverwrist.dynamo.util.*;
|
||||||
|
|
||||||
|
class Spellchecker implements HTMLRewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static QualifiedNameKey NAME = new QualifiedNameKey(Namespaces.SPELLCHECKER_PROPERTIES_NAMESPACE,"errors");
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private DynamoDictionary[] m_dicts;
|
||||||
|
private String m_begin_error;
|
||||||
|
private String m_end_error;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
Spellchecker(DynamoDictionary[] dicts, String begin_error, String end_error)
|
||||||
|
{
|
||||||
|
m_dicts = dicts;
|
||||||
|
m_begin_error = begin_error;
|
||||||
|
m_end_error = end_error;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface HTMLRewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public QualifiedNameKey getName()
|
||||||
|
{
|
||||||
|
return NAME;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, String prefix, String suffix, HTMLRewriterSite site)
|
||||||
|
{
|
||||||
|
for (int i=0; i<m_dicts.length; i++)
|
||||||
|
{ // check word against all the dictionaries we have
|
||||||
|
if (m_dicts[i].check(data))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
// not found - return word with error highlighted
|
||||||
|
return new MarkupData(prefix,m_begin_error,data,m_end_error,suffix);
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
} // end class Spellchecker
|
204
src/dynamo-framework/com/silverwrist/dynamo/dict/Trie.java
Normal file
204
src/dynamo-framework/com/silverwrist/dynamo/dict/Trie.java
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* 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.dict;
|
||||||
|
|
||||||
|
class Trie
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal node class
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final class Node
|
||||||
|
{
|
||||||
|
/*====================================================================
|
||||||
|
* Attributes
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
private boolean m_term = false;
|
||||||
|
private Node[] m_ptr = null;
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* Constructor
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
Node()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* External operations
|
||||||
|
*====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
final Node getRef(char ltr)
|
||||||
|
{
|
||||||
|
if (m_ptr==null)
|
||||||
|
return null;
|
||||||
|
int x = permute(ltr);
|
||||||
|
return (x<m_ptr.length) ? m_ptr[x] : null;
|
||||||
|
|
||||||
|
} // end getRef
|
||||||
|
|
||||||
|
final void setRef(char ltr, Node node)
|
||||||
|
{
|
||||||
|
int x = permute(ltr);
|
||||||
|
if ((m_ptr==null) || (x>=m_ptr.length))
|
||||||
|
{ // the internal array needs to be expanded
|
||||||
|
Node[] new_array = new Node[x+1];
|
||||||
|
int i = 0;
|
||||||
|
if (m_ptr!=null)
|
||||||
|
{ // copy the old portion of the array over
|
||||||
|
System.arraycopy(m_ptr,0,new_array,0,m_ptr.length);
|
||||||
|
i = m_ptr.length;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
while (i<new_array.length)
|
||||||
|
new_array[i++] = null; // null out the new portion of the array
|
||||||
|
|
||||||
|
m_ptr = new_array; // save off the new reference
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
m_ptr[x] = node; // save reference
|
||||||
|
|
||||||
|
} // end setRef
|
||||||
|
|
||||||
|
final boolean isTerminal()
|
||||||
|
{
|
||||||
|
return m_term;
|
||||||
|
|
||||||
|
} // end isTerminal
|
||||||
|
|
||||||
|
final void setTerminal()
|
||||||
|
{
|
||||||
|
m_term = true;
|
||||||
|
|
||||||
|
} // end setTerminal
|
||||||
|
|
||||||
|
} // end class Node
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final int[] PERMUTE_TAB =
|
||||||
|
{ 8, 22, 13, 10, 2, 14, 19, 11, 6, 26, 24, 12, 17, 4, 7, 15, 25, 5, 9, 3, 16, 21, 20, 23, 18, 27 };
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Node m_root;
|
||||||
|
private int m_count;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
Trie()
|
||||||
|
{
|
||||||
|
m_root = new Node();
|
||||||
|
m_count = 0;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final boolean validchar(char ch)
|
||||||
|
{
|
||||||
|
return ((ch>='a') && (ch<='z')) || (ch=='\'') || (ch=='-');
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int permute(char ltr)
|
||||||
|
{
|
||||||
|
if (ltr=='-')
|
||||||
|
return 0;
|
||||||
|
else if (ltr=='\'')
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return PERMUTE_TAB[ltr - 'a'];
|
||||||
|
|
||||||
|
} // end permute
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
int size()
|
||||||
|
{
|
||||||
|
return m_count;
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
boolean check(String s)
|
||||||
|
{
|
||||||
|
char[] arr = s.toLowerCase().toCharArray();
|
||||||
|
Node cur = m_root;
|
||||||
|
for (int i=0; i<arr.length; i++)
|
||||||
|
{ // navigate down the trie
|
||||||
|
if (!validchar(arr[i]))
|
||||||
|
return false;
|
||||||
|
cur = cur.getRef(arr[i]);
|
||||||
|
if (cur==null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return cur.isTerminal();
|
||||||
|
|
||||||
|
} // end check
|
||||||
|
|
||||||
|
void add(String s)
|
||||||
|
{
|
||||||
|
char[] arr = s.toLowerCase().toCharArray();
|
||||||
|
Node cur = m_root;
|
||||||
|
for (int i=0; i<arr.length; i++)
|
||||||
|
{ // navigate down the trie
|
||||||
|
if (!validchar(arr[i]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// navigate down one level
|
||||||
|
Node next = cur.getRef(arr[i]);
|
||||||
|
if (next==null)
|
||||||
|
{ // create a new node and set its reference
|
||||||
|
next = new Node();
|
||||||
|
cur.setRef(arr[i],next);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
cur = next;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
cur.setTerminal();
|
||||||
|
m_count++;
|
||||||
|
|
||||||
|
} // end add
|
||||||
|
|
||||||
|
} // end class Trie
|
45375
src/dynamo-framework/com/silverwrist/dynamo/dict/en-us.dict
Normal file
45375
src/dynamo-framework/com/silverwrist/dynamo/dict/en-us.dict
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,135 @@
|
||||||
|
acmecity
|
||||||
|
advogato
|
||||||
|
ain't
|
||||||
|
anime
|
||||||
|
anla'shok
|
||||||
|
bajor
|
||||||
|
bios
|
||||||
|
boitano
|
||||||
|
boromax
|
||||||
|
bungee
|
||||||
|
can't
|
||||||
|
cartman
|
||||||
|
cdt
|
||||||
|
checkouts
|
||||||
|
communityware
|
||||||
|
couldn't
|
||||||
|
crewmember
|
||||||
|
crewmembers
|
||||||
|
cst
|
||||||
|
deflector
|
||||||
|
deflectors
|
||||||
|
delenn
|
||||||
|
didn't
|
||||||
|
dilithium
|
||||||
|
docking
|
||||||
|
doesn't
|
||||||
|
don't
|
||||||
|
downtime
|
||||||
|
edt
|
||||||
|
email
|
||||||
|
eminds
|
||||||
|
entil'zha
|
||||||
|
eps
|
||||||
|
erbo
|
||||||
|
est
|
||||||
|
faux
|
||||||
|
fett
|
||||||
|
followup
|
||||||
|
franklin
|
||||||
|
fucking
|
||||||
|
gamey
|
||||||
|
hairstyle
|
||||||
|
hairstyles
|
||||||
|
hasn't
|
||||||
|
haven't
|
||||||
|
he'd
|
||||||
|
html
|
||||||
|
i'd
|
||||||
|
i'll
|
||||||
|
i'm
|
||||||
|
i've
|
||||||
|
inducers
|
||||||
|
it'd
|
||||||
|
khan
|
||||||
|
kubla
|
||||||
|
kyle
|
||||||
|
lafou
|
||||||
|
ma'am
|
||||||
|
maddog
|
||||||
|
marillion
|
||||||
|
mdt
|
||||||
|
minbar
|
||||||
|
minbari
|
||||||
|
mom
|
||||||
|
mp
|
||||||
|
mr
|
||||||
|
mst
|
||||||
|
mustn't
|
||||||
|
nacelle
|
||||||
|
nacelles
|
||||||
|
navigational
|
||||||
|
ops
|
||||||
|
padd
|
||||||
|
paperclip
|
||||||
|
pdt
|
||||||
|
peachy
|
||||||
|
pic
|
||||||
|
planitia
|
||||||
|
planum
|
||||||
|
predation
|
||||||
|
predators
|
||||||
|
privs
|
||||||
|
psi
|
||||||
|
pst
|
||||||
|
refit
|
||||||
|
refitting
|
||||||
|
replicator
|
||||||
|
repost
|
||||||
|
reposted
|
||||||
|
rom
|
||||||
|
runabout
|
||||||
|
salchow
|
||||||
|
salchows
|
||||||
|
sarcastically
|
||||||
|
shouldn't
|
||||||
|
silverwrist
|
||||||
|
snarf
|
||||||
|
snarfage
|
||||||
|
snarfer
|
||||||
|
snarfing
|
||||||
|
snazzy
|
||||||
|
sourceforge
|
||||||
|
spaceport
|
||||||
|
spellchecker
|
||||||
|
spellchucker
|
||||||
|
spelunker
|
||||||
|
spelunkers
|
||||||
|
st
|
||||||
|
starbase
|
||||||
|
starfleet
|
||||||
|
starship
|
||||||
|
straightening
|
||||||
|
stunted
|
||||||
|
terrence
|
||||||
|
they're
|
||||||
|
turbolift
|
||||||
|
tuzanor
|
||||||
|
umbilical
|
||||||
|
umbilicals
|
||||||
|
unread
|
||||||
|
url
|
||||||
|
utne
|
||||||
|
valen
|
||||||
|
veni
|
||||||
|
we'll
|
||||||
|
we're
|
||||||
|
we've
|
||||||
|
webb
|
||||||
|
webbme
|
||||||
|
won't
|
||||||
|
wouldn't
|
||||||
|
wow
|
||||||
|
you'd
|
||||||
|
you'll
|
||||||
|
you're
|
|
@ -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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.dynamo.except;
|
||||||
|
|
||||||
|
public class DictionaryException extends ExternalException
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <CODE>DictionaryException</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 DictionaryException(Class caller, String bundle, String message_id)
|
||||||
|
{
|
||||||
|
super(caller,bundle,message_id);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <CODE>DictionaryException</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 DictionaryException(Class caller, String bundle, String message_id, Throwable inner)
|
||||||
|
{
|
||||||
|
super(caller,bundle,message_id,inner);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class DictionaryException
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* 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 DynamoDictionary
|
||||||
|
{
|
||||||
|
public int size();
|
||||||
|
|
||||||
|
public boolean check(String word);
|
||||||
|
|
||||||
|
} // end interface DynamoDictionary
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* 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.DictionaryException;
|
||||||
|
|
||||||
|
public interface DynamoModifiableDictionary extends DynamoDictionary
|
||||||
|
{
|
||||||
|
public void add(String word) throws DictionaryException;
|
||||||
|
|
||||||
|
public void remove(String word) throws DictionaryException;
|
||||||
|
|
||||||
|
public void clear() throws DictionaryException;
|
||||||
|
|
||||||
|
} // end interface DynamoModifiableDictionary
|
|
@ -0,0 +1,21 @@
|
||||||
|
# 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 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
# This file has been localized for the en_US locale
|
||||||
|
no.classNotFound=The object class {0} was not found.
|
||||||
|
no.createError=Unable to create new object of class {0}.
|
||||||
|
no.notDynamo=The object class {0} is not a valid Dynamo NamedObject,
|
||||||
|
no.notClass=The object class {0} is not a valid instance of {1}.
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* 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.util;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.xml.*;
|
||||||
|
import com.silverwrist.dynamo.except.*;
|
||||||
|
import com.silverwrist.dynamo.iface.*;
|
||||||
|
|
||||||
|
public class LoaderUtils
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(LoaderUtils.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public LoaderUtils()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static final Object query(Class iface, Object obj)
|
||||||
|
{
|
||||||
|
if (iface.isInstance(obj))
|
||||||
|
return obj;
|
||||||
|
if (obj instanceof ServiceProvider)
|
||||||
|
{ // try querying it for the service
|
||||||
|
try
|
||||||
|
{ // query the service
|
||||||
|
return ((ServiceProvider)obj).queryService(iface);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NoSuchServiceException e)
|
||||||
|
{ // just fall out and return null
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end query
|
||||||
|
|
||||||
|
public static final NamedObject loadObject(Element config, ServiceProvider services, Class extratest)
|
||||||
|
throws ConfigException
|
||||||
|
{
|
||||||
|
XMLLoader loader = XMLLoader.get();
|
||||||
|
String klassname = null;
|
||||||
|
try
|
||||||
|
{ // get the class name for the object
|
||||||
|
klassname = loader.getAttribute(config,"classname");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
{ // output a proper debug message
|
||||||
|
Class desired = (extratest==null) ? NamedObject.class : extratest;
|
||||||
|
logger.debug("loadObject: Creating new NamedObject of class " + klassname + ", which should implement "
|
||||||
|
+ desired.getName());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// load the class
|
||||||
|
Class klass = Class.forName(klassname);
|
||||||
|
|
||||||
|
// make sure the class represents a valid Dynamo NamedObject
|
||||||
|
if (!(NamedObject.class.isAssignableFrom(klass)))
|
||||||
|
{ // this object is not a valid NamedObject
|
||||||
|
logger.error("object " + klassname + " does not implement NamedObject");
|
||||||
|
ConfigException ce = new ConfigException(LoaderUtils.class,"LoaderMessages","no.notDynamo");
|
||||||
|
ce.setParameter(0,klassname);
|
||||||
|
throw ce;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// make sure it implements the class we want, too
|
||||||
|
if ((extratest!=null) && !(extratest.isAssignableFrom(klass)))
|
||||||
|
{ // this object is not a valid (whatever)
|
||||||
|
logger.error("object " + klassname + " does not implement " + extratest.getName());
|
||||||
|
ConfigException ce = new ConfigException(LoaderUtils.class,"LoaderMessages","no.notClass");
|
||||||
|
ce.setParameter(0,klassname);
|
||||||
|
ce.setParameter(1,extratest.getName());
|
||||||
|
throw ce;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// instantiate the object
|
||||||
|
Object rc = klass.newInstance();
|
||||||
|
|
||||||
|
// initialize the object
|
||||||
|
ComponentInitialize init = (ComponentInitialize)query(ComponentInitialize.class,rc);
|
||||||
|
if (init!=null)
|
||||||
|
init.initialize(config,services);
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Object \"" + ((NamedObject)rc).getName() + "\" (of class " + klassname + ") created");
|
||||||
|
|
||||||
|
return (NamedObject)rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (XMLLoadException e)
|
||||||
|
{ // error getting class name - throw the ConfigException
|
||||||
|
logger.error("XML loader failure",e);
|
||||||
|
throw new ConfigException(e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ClassNotFoundException e)
|
||||||
|
{ // the class was not found
|
||||||
|
ConfigException ce = new ConfigException(LoaderUtils.class,"LoaderMessages","no.classNotFound");
|
||||||
|
ce.setParameter(0,klassname);
|
||||||
|
throw ce;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IllegalAccessException e)
|
||||||
|
{ // unable to create this object
|
||||||
|
ConfigException ce = new ConfigException(LoaderUtils.class,"LoaderMessages","no.createError");
|
||||||
|
ce.setParameter(0,klassname);
|
||||||
|
throw ce;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (InstantiationException e)
|
||||||
|
{ // unable to create this object
|
||||||
|
ConfigException ce = new ConfigException(LoaderUtils.class,"LoaderMessages","no.createError");
|
||||||
|
ce.setParameter(0,klassname);
|
||||||
|
throw ce;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end loadObject
|
||||||
|
|
||||||
|
} // end class LoaderUtils
|
|
@ -139,3 +139,8 @@ td.sidebox {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-color: red;
|
font-color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPAN.spellingerror {
|
||||||
|
font-weight: bold;
|
||||||
|
font-color: red;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user