*** empty log message ***
This commit is contained in:
parent
cb2d194940
commit
946f3fb493
264829
etc/webster2.dict
Normal file
264829
etc/webster2.dict
Normal file
File diff suppressed because it is too large
Load Diff
2
lib/README.lib
Normal file
2
lib/README.lib
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
When you download the MySQL JDBC driver, put the "mysql.jar" file in this
|
||||||
|
directory.
|
4
setup/context-add.xml
Normal file
4
setup/context-add.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<Context path="/venice"
|
||||||
|
docBase="/home/erbo/venice"
|
||||||
|
crossContext="false" debug="0" reloadable="true" trusted="false">
|
||||||
|
</Context>
|
1429
setup/database.sql
Normal file
1429
setup/database.sql
Normal file
File diff suppressed because it is too large
Load Diff
4
setup/tomcat.policy.add
Normal file
4
setup/tomcat.policy.add
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
grant codebase "file:/home/erbo/venice" {
|
||||||
|
permission java.security.AllPermission;
|
||||||
|
};
|
||||||
|
|
115
src/com/silverwrist/util/DOMElementHelper.java
Normal file
115
src/com/silverwrist/util/DOMElementHelper.java
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.util;
|
||||||
|
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
|
||||||
|
public class DOMElementHelper
|
||||||
|
{
|
||||||
|
private Element elt; // element housed by this helper class
|
||||||
|
|
||||||
|
public DOMElementHelper(Element elt)
|
||||||
|
{
|
||||||
|
this.elt = elt;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected void finalize()
|
||||||
|
{
|
||||||
|
elt = null;
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
private static String getTextOfElement(Element e)
|
||||||
|
{
|
||||||
|
NodeList kids = e.getChildNodes();
|
||||||
|
if (kids==null)
|
||||||
|
return null; // no text?
|
||||||
|
|
||||||
|
StringBuffer b = null;
|
||||||
|
for (int i=0; i<kids.getLength(); i++)
|
||||||
|
{ // look for an ELEMENT_NODE node matching the desired name
|
||||||
|
Node t = kids.item(i);
|
||||||
|
if ((t.getNodeType()==Node.TEXT_NODE) || (t.getNodeType()==Node.CDATA_SECTION_NODE))
|
||||||
|
{ // append to the string under construction
|
||||||
|
if (b==null)
|
||||||
|
b = new StringBuffer();
|
||||||
|
else
|
||||||
|
b.append(' ');
|
||||||
|
b.append(t.getNodeValue());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
if (b==null)
|
||||||
|
return null; // no TEXT nodes
|
||||||
|
else
|
||||||
|
return b.toString(); // return the concatenation
|
||||||
|
|
||||||
|
} // end getTextOfElement
|
||||||
|
|
||||||
|
public Element getElement()
|
||||||
|
{
|
||||||
|
return elt;
|
||||||
|
|
||||||
|
} // end getElement
|
||||||
|
|
||||||
|
public Element getSubElement(String name)
|
||||||
|
{
|
||||||
|
NodeList kids = elt.getChildNodes();
|
||||||
|
if (kids==null)
|
||||||
|
return null; // no children?
|
||||||
|
for (int i=0; i<kids.getLength(); i++)
|
||||||
|
{ // look for an ELEMENT_NODE node matching the desired name
|
||||||
|
Node t = kids.item(i);
|
||||||
|
if ((t.getNodeType()==Node.ELEMENT_NODE) && (t.getNodeName().equals(name)))
|
||||||
|
return (Element)t;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return null; // not found
|
||||||
|
|
||||||
|
} // end getSubElement
|
||||||
|
|
||||||
|
public String getElementText()
|
||||||
|
{
|
||||||
|
return getTextOfElement(elt);
|
||||||
|
|
||||||
|
} // end getElementText
|
||||||
|
|
||||||
|
public String getSubElementText(String name)
|
||||||
|
{
|
||||||
|
Element se = getSubElement(name);
|
||||||
|
if (se==null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return getTextOfElement(se);
|
||||||
|
|
||||||
|
} // end getSubElementText
|
||||||
|
|
||||||
|
public boolean hasChildElement(String name)
|
||||||
|
{
|
||||||
|
Element tmp = getSubElement(name);
|
||||||
|
return (tmp==null) ? false : true;
|
||||||
|
|
||||||
|
} // end hasChildElement
|
||||||
|
|
||||||
|
} // end DOMElementHelper
|
||||||
|
|
||||||
|
|
64
src/com/silverwrist/util/ServletMultipartException.java
Normal file
64
src/com/silverwrist/util/ServletMultipartException.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.util;
|
||||||
|
|
||||||
|
public class ServletMultipartException extends Exception
|
||||||
|
{
|
||||||
|
// Attributes
|
||||||
|
private Exception e = null; // internal "root cause" exception
|
||||||
|
|
||||||
|
public ServletMultipartException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ServletMultipartException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ServletMultipartException(Exception e)
|
||||||
|
{
|
||||||
|
super(e.getMessage());
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ServletMultipartException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
e = null;
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
public Exception getException()
|
||||||
|
{
|
||||||
|
return e;
|
||||||
|
|
||||||
|
} // end getException
|
||||||
|
|
||||||
|
} // end class ServletMultipartException
|
379
src/com/silverwrist/util/ServletMultipartHandler.java
Normal file
379
src/com/silverwrist/util/ServletMultipartHandler.java
Normal file
|
@ -0,0 +1,379 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.util;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.sql.Blob;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.activation.DataSource;
|
||||||
|
import javax.mail.*;
|
||||||
|
import javax.mail.internet.*;
|
||||||
|
import javax.servlet.*;
|
||||||
|
|
||||||
|
// This class was built in a process I call "Java Junkyard Wars," in which I put together
|
||||||
|
// a bunch of APIs in ways that their designers would never have anticipated. It's
|
||||||
|
// absolutely bodge-tastic!
|
||||||
|
|
||||||
|
public class ServletMultipartHandler
|
||||||
|
{
|
||||||
|
private MimeMultipart multipart; // holds all the multipart data
|
||||||
|
private Hashtable param_byname; // parameters by name
|
||||||
|
private Vector param_order; // parameters in order
|
||||||
|
|
||||||
|
class ServletDataSource implements DataSource
|
||||||
|
{
|
||||||
|
private ServletRequest request;
|
||||||
|
private InputStream istm = null;
|
||||||
|
|
||||||
|
public ServletDataSource(ServletRequest request)
|
||||||
|
{
|
||||||
|
this.request = request;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public InputStream getInputStream() throws IOException
|
||||||
|
{
|
||||||
|
if (istm==null)
|
||||||
|
istm = request.getInputStream();
|
||||||
|
return istm;
|
||||||
|
|
||||||
|
} // end getInputStream
|
||||||
|
|
||||||
|
public OutputStream getOutputStream() throws IOException
|
||||||
|
{
|
||||||
|
throw new IOException("tried to get OutputStream on servlet input?!?!?");
|
||||||
|
|
||||||
|
} // end getOutputStream
|
||||||
|
|
||||||
|
public String getContentType()
|
||||||
|
{
|
||||||
|
return request.getContentType();
|
||||||
|
|
||||||
|
} // end getContentType
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return "servlet";
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
} // end class ServletDataSource
|
||||||
|
|
||||||
|
static class MultipartDataValue implements Blob
|
||||||
|
{
|
||||||
|
private byte[] actual_data; // the actual data we contain
|
||||||
|
|
||||||
|
public MultipartDataValue(MimeBodyPart part) throws MessagingException, IOException
|
||||||
|
{
|
||||||
|
InputStream in = part.getInputStream();
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
byte[] copybuf = new byte[1024];
|
||||||
|
int ct = in.read(copybuf);
|
||||||
|
while (ct>=0)
|
||||||
|
{ // do a simple read and write
|
||||||
|
if (ct>0)
|
||||||
|
out.write(copybuf,0,ct);
|
||||||
|
ct = in.read(copybuf);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
actual_data = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public long length()
|
||||||
|
{
|
||||||
|
return actual_data.length;
|
||||||
|
|
||||||
|
} // end length
|
||||||
|
|
||||||
|
public byte[] getBytes(long pos, int length)
|
||||||
|
{
|
||||||
|
byte[] rc = new byte[length];
|
||||||
|
System.arraycopy(actual_data,(int)pos,rc,0,length);
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end getBytes
|
||||||
|
|
||||||
|
public InputStream getBinaryStream()
|
||||||
|
{
|
||||||
|
return new ByteArrayInputStream(actual_data);
|
||||||
|
|
||||||
|
} // end getBinaryStream
|
||||||
|
|
||||||
|
public long position(byte[] pattern, long start) throws SQLException
|
||||||
|
{
|
||||||
|
throw new SQLException("function not implemented");
|
||||||
|
|
||||||
|
} // end position
|
||||||
|
|
||||||
|
public long position(Blob pattern, long start) throws SQLException
|
||||||
|
{
|
||||||
|
return position(pattern.getBytes(0,(int)(pattern.length())),start);
|
||||||
|
|
||||||
|
} // end position
|
||||||
|
|
||||||
|
} // end class MultipartDataValue
|
||||||
|
|
||||||
|
class MultipartParameter
|
||||||
|
{
|
||||||
|
private MimeBodyPart part; // the actual body part data
|
||||||
|
private String name; // the parameter name
|
||||||
|
private String filename; // the filename
|
||||||
|
private MultipartDataValue cached_value = null;
|
||||||
|
|
||||||
|
public MultipartParameter(MimeBodyPart part) throws MessagingException
|
||||||
|
{
|
||||||
|
this.part = part; // save part reference
|
||||||
|
|
||||||
|
// Parse the Content-Disposition header.
|
||||||
|
String[] cdstr = part.getHeader("Content-Disposition");
|
||||||
|
ContentDisposition cdisp = new ContentDisposition(cdstr[0]);
|
||||||
|
name = cdisp.getParameter("name");
|
||||||
|
filename = cdisp.getParameter("filename");
|
||||||
|
|
||||||
|
if (filename!=null)
|
||||||
|
{ // Strip off everything but the base filename, if the browser happened to pass that.
|
||||||
|
int sep = filename.lastIndexOf('\\');
|
||||||
|
if (sep>=0)
|
||||||
|
filename = filename.substring(sep+1);
|
||||||
|
sep = filename.lastIndexOf('/');
|
||||||
|
if (sep>=0)
|
||||||
|
filename = filename.substring(sep+1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public boolean isFile()
|
||||||
|
{
|
||||||
|
return (filename!=null);
|
||||||
|
|
||||||
|
} // end isFile
|
||||||
|
|
||||||
|
public String getValue()
|
||||||
|
{
|
||||||
|
if (filename!=null)
|
||||||
|
return filename;
|
||||||
|
try
|
||||||
|
{ // Retrieve the part's actual content and convert it to a String. (Since non-file
|
||||||
|
// fields are of type text/plain, the Object "val" should actually be a String, in
|
||||||
|
// which case the toString() call is actually a no-op. But this is safe.)
|
||||||
|
Object val = part.getContent();
|
||||||
|
return val.toString();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // turn any exception returns here into null returns
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end getValue
|
||||||
|
|
||||||
|
public String getContentType()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // pass through to the interior part
|
||||||
|
return part.getContentType();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // just dump a null on error
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end getContentType
|
||||||
|
|
||||||
|
public int getSize()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // pass through to the interior part
|
||||||
|
return part.getSize();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // just dump a -1 on error
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end getSize
|
||||||
|
|
||||||
|
public MultipartDataValue getContent() throws ServletMultipartException
|
||||||
|
{
|
||||||
|
if (filename==null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (cached_value==null)
|
||||||
|
{ // we don't have the value cached yet
|
||||||
|
try
|
||||||
|
{ // extract the value
|
||||||
|
cached_value = new MultipartDataValue(part);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException me)
|
||||||
|
{ // translate exception here
|
||||||
|
throw new ServletMultipartException("Error getting data content: " + me.getMessage(),me);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IOException ioe)
|
||||||
|
{ // translate exception here
|
||||||
|
throw new ServletMultipartException("Error getting data content: " + ioe.getMessage(),ioe);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return cached_value;
|
||||||
|
|
||||||
|
} // end getContent
|
||||||
|
|
||||||
|
} // end class MultipartParameter
|
||||||
|
|
||||||
|
public ServletMultipartHandler(ServletRequest request) throws ServletMultipartException
|
||||||
|
{
|
||||||
|
if (!canHandle(request))
|
||||||
|
throw new ServletMultipartException("not a multipart/form-data request");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // build the MimeMultipart based on the ServletDataSource
|
||||||
|
multipart = new MimeMultipart(new ServletDataSource(request));
|
||||||
|
int count = multipart.getCount();
|
||||||
|
|
||||||
|
// allocate the multipart parameters and slot them into our arrays
|
||||||
|
param_byname = new Hashtable();
|
||||||
|
param_order = new Vector();
|
||||||
|
for (int i=0; i<count; i++)
|
||||||
|
{ // create the MultipartParameter structures and stash them for later use
|
||||||
|
MultipartParameter parm = new MultipartParameter((MimeBodyPart)(multipart.getBodyPart(i)));
|
||||||
|
param_byname.put(parm.getName(),parm);
|
||||||
|
param_order.addElement(parm);
|
||||||
|
|
||||||
|
} // end count
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException me)
|
||||||
|
{ // translate a MessagingException into the nicer ServletMultipartException
|
||||||
|
throw new ServletMultipartException("Error parsing request data: " + me.getMessage(),me);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns <CODE>true</CODE> if the given <CODE>ServletRequest</CODE> can be handled by
|
||||||
|
* the <CODE>ServletMultipartHandler</CODE>, <CODE>false</CODE> if not.
|
||||||
|
*
|
||||||
|
* @param request The <CODE>ServletRequest</CODE> to be checked.
|
||||||
|
* @return <CODE>true</CODE> if the given <CODE>ServletRequest</CODE> can be handled by
|
||||||
|
* the <CODE>ServletMultipartHandler</CODE>, <CODE>false</CODE> if not.
|
||||||
|
*/
|
||||||
|
public static boolean canHandle(ServletRequest request)
|
||||||
|
{
|
||||||
|
String ctype = request.getContentType();
|
||||||
|
return (ctype.startsWith("multipart/form-data"));
|
||||||
|
|
||||||
|
} // end canHandle
|
||||||
|
|
||||||
|
public Enumeration getNames()
|
||||||
|
{
|
||||||
|
Vector tmp_vector = new Vector();
|
||||||
|
Enumeration enum = param_order.elements();
|
||||||
|
while (enum.hasMoreElements())
|
||||||
|
{ // add each name to the temporary vector
|
||||||
|
MultipartParameter parm = (MultipartParameter)(enum.nextElement());
|
||||||
|
tmp_vector.addElement(parm.getName());
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
return tmp_vector.elements(); // and enumerate it
|
||||||
|
|
||||||
|
} // end getNames
|
||||||
|
|
||||||
|
public boolean isFileParam(String name)
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return parm.isFile();
|
||||||
|
|
||||||
|
} // end isFileParam
|
||||||
|
|
||||||
|
public String getValue(String name)
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return parm.getValue();
|
||||||
|
|
||||||
|
} // end getValue
|
||||||
|
|
||||||
|
public String getContentType(String name)
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return parm.getContentType();
|
||||||
|
|
||||||
|
} // end getContentType
|
||||||
|
|
||||||
|
public int getContentSize(String name)
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return parm.getSize();
|
||||||
|
|
||||||
|
} // end getContentSize
|
||||||
|
|
||||||
|
public Blob getFileContentBlob(String name) throws ServletMultipartException
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return parm.getContent();
|
||||||
|
|
||||||
|
} // end getFileContentBlob
|
||||||
|
|
||||||
|
public InputStream getFileContentStream(String name) throws ServletMultipartException
|
||||||
|
{
|
||||||
|
MultipartParameter parm = (MultipartParameter)(param_byname.get(name));
|
||||||
|
if (parm==null)
|
||||||
|
return null;
|
||||||
|
MultipartDataValue val = parm.getContent();
|
||||||
|
return val.getBinaryStream();
|
||||||
|
|
||||||
|
} // end getFileContentStream
|
||||||
|
|
||||||
|
} // end class ServletMultipartHandler
|
122
src/com/silverwrist/util/StringUtil.java
Normal file
122
src/com/silverwrist/util/StringUtil.java
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.util;
|
||||||
|
|
||||||
|
public class StringUtil
|
||||||
|
{
|
||||||
|
public static String encodeStringSQL(String str)
|
||||||
|
{
|
||||||
|
if (str==null)
|
||||||
|
return null;
|
||||||
|
int ndx = str.indexOf('\'');
|
||||||
|
if (ndx<0)
|
||||||
|
return str;
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
while (ndx>=0)
|
||||||
|
{ // convert each single quote mark to a pair of them
|
||||||
|
if (ndx>0)
|
||||||
|
buf.append(str.substring(0,ndx));
|
||||||
|
buf.append("''");
|
||||||
|
str = str.substring(ndx+1);
|
||||||
|
ndx = str.indexOf('\'');
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
buf.append(str);
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end encodeStringSQL
|
||||||
|
|
||||||
|
public static String encodeHTML(String str)
|
||||||
|
{
|
||||||
|
if (str==null)
|
||||||
|
return null;
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int i=0; i<str.length(); i++)
|
||||||
|
{ // loop through the string encoding each character in turn
|
||||||
|
switch (str.charAt(i))
|
||||||
|
{
|
||||||
|
case '"':
|
||||||
|
buf.append(""");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '&':
|
||||||
|
buf.append("&");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '<':
|
||||||
|
buf.append("<");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '>':
|
||||||
|
buf.append(">");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
buf.append(str.charAt(i));
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end encodeHTML
|
||||||
|
|
||||||
|
public static boolean isStringEmpty(String s)
|
||||||
|
{
|
||||||
|
return ((s==null) || (s.length()==0));
|
||||||
|
|
||||||
|
} // end isStringEmpty
|
||||||
|
|
||||||
|
public static String replaceAllInstances(String base, String find, String replace)
|
||||||
|
{
|
||||||
|
String work = base;
|
||||||
|
int ndx = work.indexOf(find);
|
||||||
|
if (ndx<0)
|
||||||
|
return work; // trivial case
|
||||||
|
StringBuffer b = new StringBuffer();
|
||||||
|
while (ndx>=0)
|
||||||
|
{ // break off the first part of the string, then insert the replacement
|
||||||
|
if (ndx>0)
|
||||||
|
b.append(work.substring(0,ndx));
|
||||||
|
b.append(replace);
|
||||||
|
|
||||||
|
// break off the tail end
|
||||||
|
ndx += find.length();
|
||||||
|
if (ndx==work.length())
|
||||||
|
work = null;
|
||||||
|
else
|
||||||
|
work = work.substring(ndx);
|
||||||
|
|
||||||
|
// do the next find
|
||||||
|
if (work!=null)
|
||||||
|
ndx = work.indexOf(find);
|
||||||
|
else
|
||||||
|
ndx = -1;
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
if (work!=null)
|
||||||
|
b.append(work);
|
||||||
|
return b.toString();
|
||||||
|
|
||||||
|
} // end replaceAllInstances
|
||||||
|
|
||||||
|
} // end class StringUtil
|
132
src/com/silverwrist/util/test/FormDataTest.java
Normal file
132
src/com/silverwrist/util/test/FormDataTest.java
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
package com.silverwrist.util.test;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.http.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
|
||||||
|
public class FormDataTest extends HttpServlet
|
||||||
|
{
|
||||||
|
public void doGet(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws IOException, ServletException
|
||||||
|
{
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<HTML><HEAD><TITLE>Form Test</TITLE></HEAD><BODY>");
|
||||||
|
out.println("<H1>Form Test</H1>");
|
||||||
|
out.println("<FORM METHOD=POST ENCTYPE=\"multipart/form-data\" ACTION=\"/venice/testformdata\">");
|
||||||
|
out.println("Text field: <INPUT TYPE=TEXT NAME=\"text\" VALUE=\"foo\" SIZE=32 MAXLENGTH=128><P>");
|
||||||
|
out.println("File field: <INPUT TYPE=FILE NAME=\"file\" SIZE=32 MAXLENGTH=255><P>");
|
||||||
|
out.println("<INPUT TYPE=SUBMIT VALUE=\"sumbit\">");
|
||||||
|
out.println("</FORM></BODY></HTML>");
|
||||||
|
|
||||||
|
} // end doGet
|
||||||
|
|
||||||
|
private void old_doPost(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws IOException, ServletException
|
||||||
|
{
|
||||||
|
TestMultiHandler tmh = null;
|
||||||
|
String errmsg = null;
|
||||||
|
int count = -1;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // attempt to launch the multi handler
|
||||||
|
tmh = new TestMultiHandler(request);
|
||||||
|
count = tmh.getCount();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // we got an error from the parser
|
||||||
|
errmsg = e.getMessage();
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<HTML><HEAD><TITLE>Form Test Results</TITLE></HEAD><BODY>");
|
||||||
|
out.println("<H1>Form Test Results</H1>");
|
||||||
|
if (errmsg==null)
|
||||||
|
out.println("Success!<P>");
|
||||||
|
else
|
||||||
|
out.println("ERROR: " + errmsg + "<P>");
|
||||||
|
out.println("Data count was: " + String.valueOf(count) + "<P>");
|
||||||
|
out.println("<PRE>");
|
||||||
|
tmh.dump(out);
|
||||||
|
out.println("</PRE>");
|
||||||
|
out.println("<A HREF=\"/venice/testformdata\">Go back.</A>");
|
||||||
|
out.println("</BODY></HTML>");
|
||||||
|
|
||||||
|
} // end old_doPost
|
||||||
|
|
||||||
|
public void doPost(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws IOException, ServletException
|
||||||
|
{
|
||||||
|
final String save_dir = "/home/erbo";
|
||||||
|
String errmsg = null;
|
||||||
|
ServletMultipartHandler smh = null;
|
||||||
|
boolean file_check = false;
|
||||||
|
String text_value = null;
|
||||||
|
String file_name = null;
|
||||||
|
String file_type = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // create the multipart handler
|
||||||
|
smh = new ServletMultipartHandler(request);
|
||||||
|
text_value = smh.getValue("text");
|
||||||
|
file_check = smh.isFileParam("file");
|
||||||
|
if (file_check)
|
||||||
|
{ // copy out to file
|
||||||
|
file_name = smh.getValue("file");
|
||||||
|
file_type = smh.getContentType("file");
|
||||||
|
if ((file_name!=null) && (file_name.length()>0))
|
||||||
|
{ // build the file name and save it
|
||||||
|
FileOutputStream stm = new FileOutputStream(save_dir + "/" + file_name);
|
||||||
|
InputStream in = smh.getFileContentStream("file");
|
||||||
|
byte[] copybuf = new byte[1024];
|
||||||
|
int ct = in.read(copybuf);
|
||||||
|
while (ct>=0)
|
||||||
|
{ // copy loop...
|
||||||
|
if (ct>0)
|
||||||
|
stm.write(copybuf,0,ct);
|
||||||
|
ct = in.read(copybuf);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
stm.close();
|
||||||
|
in.close();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ServletMultipartException e)
|
||||||
|
{ // load error message
|
||||||
|
errmsg = e.getMessage();
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.println("<HTML><HEAD><TITLE>Form Test Results</TITLE></HEAD><BODY>");
|
||||||
|
out.println("<H1>Form Test Results</H1>");
|
||||||
|
if (errmsg==null)
|
||||||
|
{ // print data
|
||||||
|
out.println("Text value: " + text_value + "<P>");
|
||||||
|
if (file_check)
|
||||||
|
{ // get file name and type
|
||||||
|
out.println("File name: " + file_name + "<P>");
|
||||||
|
out.println("File type: " + file_type + "<P>");
|
||||||
|
out.println("Saved to directory: " + save_dir + "<P>");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
out.println("Not a file.<P>");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
out.println("ERROR: " + errmsg + "<P>");
|
||||||
|
out.println("<A HREF=\"/venice/testformdata\">Go back.</A>");
|
||||||
|
out.println("</BODY></HTML>");
|
||||||
|
|
||||||
|
} // end doPost
|
||||||
|
|
||||||
|
} // end class FormDataTest
|
121
src/com/silverwrist/util/test/TestMultiHandler.java
Normal file
121
src/com/silverwrist/util/test/TestMultiHandler.java
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
package com.silverwrist.util.test;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.activation.DataSource;
|
||||||
|
import javax.mail.*;
|
||||||
|
import javax.mail.internet.*;
|
||||||
|
import javax.servlet.*;
|
||||||
|
|
||||||
|
public class TestMultiHandler
|
||||||
|
{
|
||||||
|
private MimeMultipart multipart;
|
||||||
|
private int count;
|
||||||
|
private Vector params;
|
||||||
|
|
||||||
|
static class ServletDataSource implements DataSource
|
||||||
|
{
|
||||||
|
private ServletRequest request;
|
||||||
|
private InputStream istm = null;
|
||||||
|
|
||||||
|
public ServletDataSource(ServletRequest request)
|
||||||
|
{
|
||||||
|
this.request = request;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public InputStream getInputStream() throws IOException
|
||||||
|
{
|
||||||
|
if (istm==null)
|
||||||
|
istm = request.getInputStream();
|
||||||
|
return istm;
|
||||||
|
|
||||||
|
} // end getInputStream
|
||||||
|
|
||||||
|
public OutputStream getOutputStream() throws IOException
|
||||||
|
{
|
||||||
|
throw new IOException("tried to get OutputStream on servlet input?!?!?");
|
||||||
|
|
||||||
|
} // end getOutputStream
|
||||||
|
|
||||||
|
public String getContentType()
|
||||||
|
{
|
||||||
|
return request.getContentType();
|
||||||
|
|
||||||
|
} // end getContentType
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return "servlet";
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
} // end class ServletDataSource
|
||||||
|
|
||||||
|
public TestMultiHandler(ServletRequest request) throws IOException
|
||||||
|
{
|
||||||
|
if (!canHandle(request))
|
||||||
|
throw new UnsupportedOperationException("data type doesn't match");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // OK, this is the tricky part...
|
||||||
|
ServletDataSource ds = new ServletDataSource(request);
|
||||||
|
multipart = new MimeMultipart(ds);
|
||||||
|
count = multipart.getCount();
|
||||||
|
params = new Vector(count);
|
||||||
|
// OK, that's enough for now
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException e)
|
||||||
|
{ // better run like hell, 'cos this may not work
|
||||||
|
throw new IOException("Got MessagingException: " + e.getMessage());
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public static boolean canHandle(ServletRequest request)
|
||||||
|
{
|
||||||
|
String ctype = request.getContentType();
|
||||||
|
return (ctype.startsWith("multipart/form-data"));
|
||||||
|
|
||||||
|
} // end canHandle
|
||||||
|
|
||||||
|
public int getCount()
|
||||||
|
{
|
||||||
|
return count;
|
||||||
|
|
||||||
|
} // end getCount
|
||||||
|
|
||||||
|
public void dump(PrintWriter out)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // print out all parts
|
||||||
|
int ct = multipart.getCount();
|
||||||
|
out.println("Number of parts: " + String.valueOf(ct));
|
||||||
|
|
||||||
|
for (int i=0; i<ct; i++)
|
||||||
|
{ // loop through all the parts
|
||||||
|
out.println("--- PART " + String.valueOf(i) + " ---");
|
||||||
|
MimeBodyPart part = (MimeBodyPart)(multipart.getBodyPart(i));
|
||||||
|
out.println("got it");
|
||||||
|
String foo = part.getContentType();
|
||||||
|
out.println("Content type: " + foo);
|
||||||
|
foo = part.getDisposition();
|
||||||
|
out.println("Content disposition: " + foo);
|
||||||
|
String[] disphdr = part.getHeader("Content-Disposition");
|
||||||
|
for (int j=0; j<disphdr.length; j++)
|
||||||
|
out.println("Content-Disposition header[" + String.valueOf(j) + "]: " + disphdr[j]);
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException e)
|
||||||
|
{ // whoops!
|
||||||
|
out.println("THREW MessagingException: " + e.getMessage());
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end dump
|
||||||
|
|
||||||
|
} // end class TestMultiHandler
|
46
src/com/silverwrist/venice/ValidationException.java
Normal file
46
src/com/silverwrist/venice/ValidationException.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice;
|
||||||
|
|
||||||
|
public class ValidationException extends VeniceException
|
||||||
|
{
|
||||||
|
public ValidationException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ValidationException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ValidationException(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ValidationException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class ValidationException
|
64
src/com/silverwrist/venice/VeniceException.java
Normal file
64
src/com/silverwrist/venice/VeniceException.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice;
|
||||||
|
|
||||||
|
public class VeniceException extends Exception
|
||||||
|
{
|
||||||
|
// Attributes
|
||||||
|
private Exception e = null; // internal "root cause" exception
|
||||||
|
|
||||||
|
public VeniceException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public VeniceException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public VeniceException(Exception e)
|
||||||
|
{
|
||||||
|
super(e.getMessage());
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public VeniceException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
e = null;
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
public Exception getException()
|
||||||
|
{
|
||||||
|
return e;
|
||||||
|
|
||||||
|
} // end getException
|
||||||
|
|
||||||
|
} // end class VeniceException
|
46
src/com/silverwrist/venice/core/AccessError.java
Normal file
46
src/com/silverwrist/venice/core/AccessError.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public class AccessError extends com.silverwrist.venice.VeniceException
|
||||||
|
{
|
||||||
|
public AccessError()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public AccessError(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public AccessError(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public AccessError(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class AccessError
|
23
src/com/silverwrist/venice/core/AdminOperations.java
Normal file
23
src/com/silverwrist/venice/core/AdminOperations.java
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface AdminOperations
|
||||||
|
{
|
||||||
|
// TODO: fill this in
|
||||||
|
} // end interface AdminOperations
|
50
src/com/silverwrist/venice/core/CategoryDescriptor.java
Normal file
50
src/com/silverwrist/venice/core/CategoryDescriptor.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface CategoryDescriptor
|
||||||
|
{
|
||||||
|
public abstract int getCategoryID();
|
||||||
|
|
||||||
|
public abstract int getNumLevels();
|
||||||
|
|
||||||
|
public abstract int getIDAtLevel(int level);
|
||||||
|
|
||||||
|
public abstract String getTitleAtLevel(int level);
|
||||||
|
|
||||||
|
public abstract List getSubCategories() throws DataException;
|
||||||
|
|
||||||
|
public abstract CategoryDescriptor getSuperCategory(int levels);
|
||||||
|
|
||||||
|
public abstract CategoryDescriptor getParentCategory();
|
||||||
|
|
||||||
|
public abstract int getLinkedCategoryID();
|
||||||
|
|
||||||
|
public abstract boolean isSymbolicLink();
|
||||||
|
|
||||||
|
public abstract CategoryDescriptor getLinkedCategory() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean equals(Object obj);
|
||||||
|
|
||||||
|
public abstract int hashCode();
|
||||||
|
|
||||||
|
public abstract String toString();
|
||||||
|
|
||||||
|
} // end interface CategoryDescriptor
|
112
src/com/silverwrist/venice/core/ConferenceContext.java
Normal file
112
src/com/silverwrist/venice/core/ConferenceContext.java
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ConferenceContext
|
||||||
|
{
|
||||||
|
public static final int GET_ALL = 0;
|
||||||
|
public static final int DISPLAY_NEW = 1;
|
||||||
|
public static final int DISPLAY_ACTIVE = 2;
|
||||||
|
public static final int DISPLAY_ALL = 3;
|
||||||
|
public static final int DISPLAY_HIDDEN = 4;
|
||||||
|
public static final int DISPLAY_ARCHIVED = 5;
|
||||||
|
|
||||||
|
public static final int SORT_TOPICID = 0;
|
||||||
|
public static final int SORT_NUMBER = 1;
|
||||||
|
public static final int SORT_NAME = 2;
|
||||||
|
public static final int SORT_UNREAD = 3;
|
||||||
|
public static final int SORT_TOTAL = 4;
|
||||||
|
public static final int SORT_DATE = 5;
|
||||||
|
|
||||||
|
public abstract int getConfID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
public abstract Date getCreationDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract List getAliases() throws DataException;
|
||||||
|
|
||||||
|
public abstract List getHosts() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canReadConference();
|
||||||
|
|
||||||
|
public abstract boolean canPostToConference();
|
||||||
|
|
||||||
|
public abstract boolean canCreateTopic();
|
||||||
|
|
||||||
|
public abstract boolean canChangeConference();
|
||||||
|
|
||||||
|
public abstract int getReadLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getPostLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getCreateLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getHideLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getNukeLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getChangeLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getDeleteLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setSecurityLevels(int read, int post, int create, int hide, int nuke,
|
||||||
|
int change, int delete) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setName(String val) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setDescription(String val) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void addAlias(String alias) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void removeAlias(String alias) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void addMember(int uid, boolean as_host) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void removeMember(int uid) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getSIGGrantedLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setSIGGrantedLevel(int new_level) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract short getSequence() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setSequence(short seq) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean getHideList() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setHideList(boolean flag) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract String getDefaultPseud();
|
||||||
|
|
||||||
|
public abstract void setDefaultPseud(String val) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean anyUnread();
|
||||||
|
|
||||||
|
public abstract List getTopicList(int get_option, int sort_option) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract TopicContext getTopic(short number) throws DataException, AccessError;
|
||||||
|
|
||||||
|
} // end interface ConferenceContext
|
93
src/com/silverwrist/venice/core/ConfigException.java
Normal file
93
src/com/silverwrist/venice/core/ConfigException.java
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.venice.VeniceException;
|
||||||
|
|
||||||
|
public class ConfigException extends VeniceException
|
||||||
|
{
|
||||||
|
// Attributes
|
||||||
|
private Node faulty_sect = null; // section of the configuration at fault
|
||||||
|
|
||||||
|
public ConfigException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(Node faulty_sect)
|
||||||
|
{
|
||||||
|
super("Error in <" + faulty_sect.getNodeName() + "/> section of configuration!");
|
||||||
|
this.faulty_sect = faulty_sect;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(String msg, Node faulty_sect)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
this.faulty_sect = faulty_sect;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(Exception e, Node faulty_sect)
|
||||||
|
{
|
||||||
|
super("Error in <" + faulty_sect.getNodeName() + "/> section of configuration - " + e.getMessage(),e);
|
||||||
|
this.faulty_sect = faulty_sect;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public ConfigException(String msg, Exception e, Node faulty_sect)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
this.faulty_sect = faulty_sect;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
faulty_sect = null;
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
public Node getFaultySect()
|
||||||
|
{
|
||||||
|
return faulty_sect;
|
||||||
|
|
||||||
|
} // end getFaultySect
|
||||||
|
|
||||||
|
} // end class ConfigException
|
123
src/com/silverwrist/venice/core/ContactInfo.java
Normal file
123
src/com/silverwrist/venice/core/ContactInfo.java
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.sql.Connection;
|
||||||
|
|
||||||
|
public interface ContactInfo
|
||||||
|
{
|
||||||
|
public abstract int getContactID();
|
||||||
|
|
||||||
|
public abstract String getGivenName();
|
||||||
|
|
||||||
|
public abstract void setGivenName(String name);
|
||||||
|
|
||||||
|
public abstract String getFamilyName();
|
||||||
|
|
||||||
|
public abstract void setFamilyName(String name);
|
||||||
|
|
||||||
|
public abstract char getMiddleInitial();
|
||||||
|
|
||||||
|
public abstract void setMiddleInitial(char in);
|
||||||
|
|
||||||
|
public abstract String getNamePrefix();
|
||||||
|
|
||||||
|
public abstract void setNamePrefix(String p);
|
||||||
|
|
||||||
|
public abstract String getNameSuffix();
|
||||||
|
|
||||||
|
public abstract void setNameSuffix(String s);
|
||||||
|
|
||||||
|
public abstract String getCompany();
|
||||||
|
|
||||||
|
public abstract void setCompany(String c);
|
||||||
|
|
||||||
|
public abstract String getAddressLine1();
|
||||||
|
|
||||||
|
public abstract void setAddressLine1(String addr);
|
||||||
|
|
||||||
|
public abstract String getAddressLine2();
|
||||||
|
|
||||||
|
public abstract void setAddressLine2(String addr);
|
||||||
|
|
||||||
|
public abstract String getLocality();
|
||||||
|
|
||||||
|
public abstract void setLocality(String city);
|
||||||
|
|
||||||
|
public abstract String getRegion();
|
||||||
|
|
||||||
|
public abstract void setRegion(String state);
|
||||||
|
|
||||||
|
public abstract String getPostalCode();
|
||||||
|
|
||||||
|
public abstract void setPostalCode(String zip);
|
||||||
|
|
||||||
|
public abstract String getCountry();
|
||||||
|
|
||||||
|
public abstract void setCountry(String c);
|
||||||
|
|
||||||
|
public abstract String getPhone();
|
||||||
|
|
||||||
|
public abstract void setPhone(String num);
|
||||||
|
|
||||||
|
public abstract String getFax();
|
||||||
|
|
||||||
|
public abstract void setFax(String num);
|
||||||
|
|
||||||
|
public abstract String getMobile();
|
||||||
|
|
||||||
|
public abstract void setMobile(String num);
|
||||||
|
|
||||||
|
public abstract String getEmail();
|
||||||
|
|
||||||
|
public abstract void setEmail(String addr);
|
||||||
|
|
||||||
|
public abstract String getPhotoURL();
|
||||||
|
|
||||||
|
public abstract void setPhotoURL(String addr);
|
||||||
|
|
||||||
|
public abstract String getURL();
|
||||||
|
|
||||||
|
public abstract void setURL(String addr);
|
||||||
|
|
||||||
|
public abstract boolean getPrivateAddress();
|
||||||
|
|
||||||
|
public abstract void setPrivateAddress(boolean flag);
|
||||||
|
|
||||||
|
public abstract boolean getPrivatePhone();
|
||||||
|
|
||||||
|
public abstract void setPrivatePhone(boolean flag);
|
||||||
|
|
||||||
|
public abstract boolean getPrivateFax();
|
||||||
|
|
||||||
|
public abstract void setPrivateFax(boolean flag);
|
||||||
|
|
||||||
|
public abstract boolean getPrivateEmail();
|
||||||
|
|
||||||
|
public abstract void setPrivateEmail(boolean flag);
|
||||||
|
|
||||||
|
public abstract int getOwnerUID();
|
||||||
|
|
||||||
|
public abstract int getOwnerSIGID();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdate();
|
||||||
|
|
||||||
|
public abstract boolean getModified();
|
||||||
|
|
||||||
|
} // end interface ContactInfo
|
26
src/com/silverwrist/venice/core/Country.java
Normal file
26
src/com/silverwrist/venice/core/Country.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface Country
|
||||||
|
{
|
||||||
|
public abstract String getCode();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
} // end interface Country
|
46
src/com/silverwrist/venice/core/DataException.java
Normal file
46
src/com/silverwrist/venice/core/DataException.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public class DataException extends com.silverwrist.venice.VeniceException
|
||||||
|
{
|
||||||
|
public DataException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public DataException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public DataException(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public DataException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class DataException
|
46
src/com/silverwrist/venice/core/EmailException.java
Normal file
46
src/com/silverwrist/venice/core/EmailException.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public class EmailException extends com.silverwrist.venice.VeniceException
|
||||||
|
{
|
||||||
|
public EmailException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public EmailException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public EmailException(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public EmailException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class EmailException
|
36
src/com/silverwrist/venice/core/FrontPageViewConfig.java
Normal file
36
src/com/silverwrist/venice/core/FrontPageViewConfig.java
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface FrontPageViewConfig
|
||||||
|
{
|
||||||
|
public abstract int getNumRows();
|
||||||
|
|
||||||
|
public abstract int getNumColumns();
|
||||||
|
|
||||||
|
public abstract String getPartID(int row, int column);
|
||||||
|
|
||||||
|
public abstract void setPartID(int row, int column, String partid);
|
||||||
|
|
||||||
|
public abstract String getParameter(int row, int column);
|
||||||
|
|
||||||
|
public abstract void setParameter(int row, int column, String param);
|
||||||
|
|
||||||
|
public abstract boolean getModified();
|
||||||
|
|
||||||
|
} // end interface FrontPageViewConfig
|
75
src/com/silverwrist/venice/core/IDUtils.java
Normal file
75
src/com/silverwrist/venice/core/IDUtils.java
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import javax.mail.internet.InternetAddress;
|
||||||
|
import javax.mail.internet.AddressException;
|
||||||
|
|
||||||
|
public class IDUtils
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The list of valid characters in Venice identifiers other than alphanumerics.
|
||||||
|
*/
|
||||||
|
private static final String EXTRA_VALID = "-_~*'$";
|
||||||
|
|
||||||
|
public static boolean isValidVeniceID(String id)
|
||||||
|
{
|
||||||
|
if ((id==null) || (id.length()==0))
|
||||||
|
return false; // null values and null strings are NEVER valid
|
||||||
|
for (int i=0; i<id.length(); i++)
|
||||||
|
{ // test each character in turn
|
||||||
|
char c = id.charAt(i);
|
||||||
|
if ((c>='A') && (c<='Z'))
|
||||||
|
continue; // upper-case letters are OK
|
||||||
|
if ((c>='a') && (c<='z'))
|
||||||
|
continue; // lower-case letters are OK
|
||||||
|
if ((c>='0') && (c<='9'))
|
||||||
|
continue; // digits are OK
|
||||||
|
if (EXTRA_VALID.indexOf(c)<0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return true; // all tests passed - ship it!
|
||||||
|
|
||||||
|
} // end isValidVeniceID
|
||||||
|
|
||||||
|
public static boolean isValidEmailAddress(String addr)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // take advantage of the JavaMail address parser
|
||||||
|
InternetAddress tmp = new InternetAddress(addr);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (AddressException e)
|
||||||
|
{ // if we get an AddressException, it's not valid, is it?
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
return true; // if get here, it's valid
|
||||||
|
|
||||||
|
} // end isValidEmailAddress
|
||||||
|
|
||||||
|
public static boolean isValidConfirmationNumber(int num)
|
||||||
|
{
|
||||||
|
return ((num>=1000000) && (num<=9999999));
|
||||||
|
|
||||||
|
} // end isValidConfirmationNumber
|
||||||
|
|
||||||
|
} // end class IDUtils
|
64
src/com/silverwrist/venice/core/InternalStateError.java
Normal file
64
src/com/silverwrist/venice/core/InternalStateError.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public class InternalStateError extends RuntimeException
|
||||||
|
{
|
||||||
|
// Attributes
|
||||||
|
private Exception e = null; // internal "root cause" exception
|
||||||
|
|
||||||
|
public InternalStateError()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public InternalStateError(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public InternalStateError(Exception e)
|
||||||
|
{
|
||||||
|
super(e.getMessage());
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public InternalStateError(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
this.e = e;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
e = null;
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
public Exception getException()
|
||||||
|
{
|
||||||
|
return e;
|
||||||
|
|
||||||
|
} // end getException
|
||||||
|
|
||||||
|
} // end class InternalStateError
|
26
src/com/silverwrist/venice/core/Language.java
Normal file
26
src/com/silverwrist/venice/core/Language.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface Language
|
||||||
|
{
|
||||||
|
public abstract String getCode();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
} // end interface Language
|
147
src/com/silverwrist/venice/core/SIGContext.java
Normal file
147
src/com/silverwrist/venice/core/SIGContext.java
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.BitSet;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface SIGContext
|
||||||
|
{
|
||||||
|
public static final int HIDE_NONE = 0;
|
||||||
|
public static final int HIDE_DIRECTORY = 1;
|
||||||
|
public static final int HIDE_BOTH = 2;
|
||||||
|
|
||||||
|
public abstract int getSIGID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getAlias();
|
||||||
|
|
||||||
|
public abstract boolean isMember();
|
||||||
|
|
||||||
|
public abstract boolean isAdmin();
|
||||||
|
|
||||||
|
public abstract boolean isPublicSIG();
|
||||||
|
|
||||||
|
public abstract int getCategoryID();
|
||||||
|
|
||||||
|
public abstract CategoryDescriptor getCategory() throws DataException;
|
||||||
|
|
||||||
|
public abstract String getSynopsis();
|
||||||
|
|
||||||
|
public abstract int getHostUID();
|
||||||
|
|
||||||
|
public abstract UserProfile getHostProfile() throws DataException;
|
||||||
|
|
||||||
|
public abstract String getLanguageCode();
|
||||||
|
|
||||||
|
public abstract String getLanguageFullName();
|
||||||
|
|
||||||
|
public abstract String getRules();
|
||||||
|
|
||||||
|
public abstract Date getCreationDate();
|
||||||
|
|
||||||
|
public abstract Date getLastAccessDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract ContactInfo getContactInfo() throws DataException;
|
||||||
|
|
||||||
|
public abstract void putContactInfo(ContactInfo ci) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract BitSet getFeatures();
|
||||||
|
|
||||||
|
public abstract void setFeatures(BitSet feature_set, BitSet mask) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract List getSIGFeaturesList();
|
||||||
|
|
||||||
|
public abstract String getDefaultApplet();
|
||||||
|
|
||||||
|
public abstract void setName(String name) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setAlias(String alias) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setCategoryID(int catid) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setCategory(CategoryDescriptor cat) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setSynopsis(String synopsis) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setLanguage(String language) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setRules(String rules) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getHideMode();
|
||||||
|
|
||||||
|
public abstract void setHideMode(int mode) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean getMembersOnly();
|
||||||
|
|
||||||
|
public abstract void setMembersOnly(boolean flag) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract short getInitialFeatureIndex();
|
||||||
|
|
||||||
|
public abstract void setInitialFeatureIndex(short ndx) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract String getJoinKey() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setJoinKey(String key) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getReadLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getWriteLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getCreateLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getDeleteLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getJoinLevel() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setSecurityLevels(int read, int write, int create, int delete, int join)
|
||||||
|
throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean canAdministerSIG();
|
||||||
|
|
||||||
|
public abstract boolean canModifyProfile();
|
||||||
|
|
||||||
|
public abstract boolean isAdminSIG();
|
||||||
|
|
||||||
|
public abstract void join(String joinkey) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void unjoin() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract int getMemberCount() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canUnjoin();
|
||||||
|
|
||||||
|
public abstract boolean canJoin();
|
||||||
|
|
||||||
|
public abstract List getConferences() throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract ConferenceContext getConferenceContext(int confid) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract ConferenceContext getConferenceContext(String alias) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract ConferenceContext createConference(String name, String alias, String description,
|
||||||
|
boolean pvt, boolean hide_list)
|
||||||
|
throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean canCreateConference();
|
||||||
|
|
||||||
|
} // end interface SIGContext
|
32
src/com/silverwrist/venice/core/SIGFeature.java
Normal file
32
src/com/silverwrist/venice/core/SIGFeature.java
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface SIGFeature
|
||||||
|
{
|
||||||
|
public abstract int getFeatureCode();
|
||||||
|
|
||||||
|
public abstract String getSymbol();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getApplet();
|
||||||
|
|
||||||
|
public abstract int getSequence();
|
||||||
|
|
||||||
|
} // end interface SIGFeature
|
40
src/com/silverwrist/venice/core/SearchMode.java
Normal file
40
src/com/silverwrist/venice/core/SearchMode.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface SearchMode
|
||||||
|
{
|
||||||
|
public static final int FIELD_SIG_NAME = 0;
|
||||||
|
|
||||||
|
public static final int FIELD_SIG_SYNOPSIS = 1;
|
||||||
|
|
||||||
|
public static final int FIELD_USER_NAME = 2;
|
||||||
|
|
||||||
|
public static final int FIELD_USER_DESCRIPTION = 3;
|
||||||
|
|
||||||
|
public static final int FIELD_USER_GIVEN_NAME = 4;
|
||||||
|
|
||||||
|
public static final int FIELD_USER_FAMILY_NAME = 5;
|
||||||
|
|
||||||
|
public static final int SEARCH_PREFIX = 0;
|
||||||
|
|
||||||
|
public static final int SEARCH_SUBSTRING = 1;
|
||||||
|
|
||||||
|
public static final int SEARCH_REGEXP = 2;
|
||||||
|
|
||||||
|
} // end interface SearchMode
|
216
src/com/silverwrist/venice/core/Startup.java
Normal file
216
src/com/silverwrist/venice/core/Startup.java
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import javax.xml.parsers.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.SAXParseException;
|
||||||
|
import com.silverwrist.util.DOMElementHelper;
|
||||||
|
|
||||||
|
public class Startup
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data values
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(Startup.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Startup()
|
||||||
|
{ // this class cannot be created
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Document loadConfiguration(String configname) throws ConfigException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // create a simple DOM parser by using the Java XML parsing API
|
||||||
|
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
|
||||||
|
fac.setNamespaceAware(false);
|
||||||
|
fac.setValidating(false);
|
||||||
|
DocumentBuilder parser = fac.newDocumentBuilder();
|
||||||
|
|
||||||
|
// access the config file and parse it into our config data tree
|
||||||
|
File configfile = new File(configname);
|
||||||
|
Document rc = parser.parse(configfile);
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("configuration loaded successfully");
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (FactoryConfigurationError e1)
|
||||||
|
{ // if the document builder factory could not be created
|
||||||
|
logger.fatal("Parser factory configuration error: " + e1.getMessage(),e1);
|
||||||
|
throw new ConfigException("XML parser factory could not be created - " + e1.getMessage());
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ParserConfigurationException e2)
|
||||||
|
{ // if the XML parser itself could not be created
|
||||||
|
logger.fatal("Parser configuration error: " + e2.getMessage(),e2);
|
||||||
|
throw new ConfigException("XML parser could not be created - " + e2.getMessage(),e2);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (SAXException e3)
|
||||||
|
{ // if the XML parser choked on our document
|
||||||
|
if (e3 instanceof SAXParseException)
|
||||||
|
{ // we have a detailed message - make a proper exception
|
||||||
|
SAXParseException e3a = (SAXParseException)e3;
|
||||||
|
logger.fatal("Config file error [" + configname + ":" + e3a.getLineNumber() + ","
|
||||||
|
+ e3a.getColumnNumber() + "]: " + e3a.getMessage(),e3a);
|
||||||
|
throw new ConfigException("Configuration file error: " + e3a.getMessage() + " at line "
|
||||||
|
+ e3a.getLineNumber() + ", column " + e3a.getColumnNumber(),e3a);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // generic exception - just send up a simple error message
|
||||||
|
logger.fatal("Config file error [" + configname + "]: " + e3.getMessage(),e3);
|
||||||
|
throw new ConfigException("Configuration file error - " + e3.getMessage(),e3);
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IOException e4)
|
||||||
|
{ // error reading the config file itself off the disk
|
||||||
|
logger.fatal("IO error reading config: " + e4.getMessage(),e4);
|
||||||
|
throw new ConfigException("unable to read config file \"" + configname + "\" - " + e4.getMessage(),e4);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end loadConfiguration
|
||||||
|
|
||||||
|
private static String getEngineClassName(Document config) throws ConfigException
|
||||||
|
{
|
||||||
|
// Make sure the configuration is valid...
|
||||||
|
Element root = config.getDocumentElement();
|
||||||
|
if (!(root.getTagName().equals("venice-config")))
|
||||||
|
{ // not the correct root tag name
|
||||||
|
logger.fatal("config document is not a <venice-config/> document (root tag: <"
|
||||||
|
+ root.getTagName() + "/>)");
|
||||||
|
throw new ConfigException("document is not a <venice-config/> document",root);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// Get the <engine/> section.
|
||||||
|
DOMElementHelper root_h = new DOMElementHelper(root);
|
||||||
|
Element engine_sect = root_h.getSubElement("engine");
|
||||||
|
if (engine_sect==null)
|
||||||
|
{ // no <engine/> section - bail out now!
|
||||||
|
logger.fatal("config document has no <engine/> section");
|
||||||
|
throw new ConfigException("no <engine/> section found in config file",root);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// Get the classname out of that section.
|
||||||
|
DOMElementHelper engine_sect_h = new DOMElementHelper(engine_sect);
|
||||||
|
String rc = engine_sect_h.getSubElementText("classname");
|
||||||
|
if (rc==null)
|
||||||
|
{ // no <classname/> specified - bail out now!
|
||||||
|
logger.fatal("config document <engine/> section has no <classname/>");
|
||||||
|
throw new ConfigException("no <classname/> found in <engine/> section",engine_sect);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end getEngineClassName
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static methods (global functions)
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static VeniceEngine createEngine(String configname) throws ConfigException, DataException
|
||||||
|
{
|
||||||
|
// load the configuration data
|
||||||
|
Document config = loadConfiguration(configname);
|
||||||
|
|
||||||
|
// find the classname of the engine
|
||||||
|
String cname = getEngineClassName(config);
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Venice engine classname: " + cname);
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // attempt to load the engine class
|
||||||
|
Class engine_class = Class.forName(cname);
|
||||||
|
|
||||||
|
// now create a new Venice engine (cast to the external interface)
|
||||||
|
VeniceEngine engine = (VeniceEngine)(engine_class.newInstance());
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("VeniceEngine created successfully");
|
||||||
|
|
||||||
|
// initialize the engine
|
||||||
|
engine.initialize(config);
|
||||||
|
|
||||||
|
// and return it
|
||||||
|
return engine;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassNotFoundException e1)
|
||||||
|
{ // the class was not found
|
||||||
|
logger.fatal("Venice engine class \"" + cname + "\" not found",e1);
|
||||||
|
throw new ConfigException("Invalid engine classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IllegalAccessException e2)
|
||||||
|
{ // could not access constructor or something
|
||||||
|
logger.fatal("Can't access \"" + cname + "\" constructor: " + e2.getMessage(),e2);
|
||||||
|
throw new ConfigException("Unable to create classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (InstantiationException e3)
|
||||||
|
{ // could not create the instance
|
||||||
|
logger.fatal("Can't create instance of \"" + cname + "\": " + e3.getMessage(),e3);
|
||||||
|
throw new ConfigException("Unable to create classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ExceptionInInitializerError e4)
|
||||||
|
{ // some exception while initializing class
|
||||||
|
logger.fatal("Exception while initializing \"" + cname + "\": " + e4.getMessage(),e4);
|
||||||
|
throw new ConfigException("Unable to create classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (SecurityException e5)
|
||||||
|
{ // security violation somewhere
|
||||||
|
logger.fatal("Security violation on \"" + cname + "\": " + e5.getMessage(),e5);
|
||||||
|
throw new ConfigException("Unable to create classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ClassCastException e6)
|
||||||
|
{ // engine could not be cast to VeniceEngine interface type
|
||||||
|
logger.fatal("\"" + cname + "\" is not of type VeniceEngine",e6);
|
||||||
|
throw new ConfigException("Invalid engine classname: " + cname);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end createEngine
|
||||||
|
|
||||||
|
} // end class Startup
|
67
src/com/silverwrist/venice/core/TopicContext.java
Normal file
67
src/com/silverwrist/venice/core/TopicContext.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface TopicContext
|
||||||
|
{
|
||||||
|
public abstract void refresh() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getTopicID();
|
||||||
|
|
||||||
|
public abstract short getTopicNumber();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract int getUnreadMessages();
|
||||||
|
|
||||||
|
public abstract int getTotalMessages();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract int getCreatorUID();
|
||||||
|
|
||||||
|
public abstract boolean isFrozen();
|
||||||
|
|
||||||
|
public abstract boolean isArchived();
|
||||||
|
|
||||||
|
public abstract Date getCreatedDate();
|
||||||
|
|
||||||
|
public abstract boolean isHidden();
|
||||||
|
|
||||||
|
public abstract boolean isDeleted();
|
||||||
|
|
||||||
|
public abstract boolean canFreeze();
|
||||||
|
|
||||||
|
public abstract boolean canArchive();
|
||||||
|
|
||||||
|
public abstract void setFrozen(boolean flag) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setArchived(boolean flag) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void setHidden(boolean flag) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getFirstUnreadMessage();
|
||||||
|
|
||||||
|
public abstract void setUnreadMessages(int count) throws DataException;
|
||||||
|
|
||||||
|
public abstract void fixSeen() throws DataException;
|
||||||
|
|
||||||
|
} // end interface TopicContext
|
92
src/com/silverwrist/venice/core/UserContext.java
Normal file
92
src/com/silverwrist/venice/core/UserContext.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface UserContext extends SearchMode
|
||||||
|
{
|
||||||
|
public abstract int getUID();
|
||||||
|
|
||||||
|
public abstract String getUserName();
|
||||||
|
|
||||||
|
public abstract int getContactID();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
public abstract boolean isLoggedIn();
|
||||||
|
|
||||||
|
public abstract boolean isEmailVerified();
|
||||||
|
|
||||||
|
public abstract void authenticate(String username, String password)
|
||||||
|
throws AccessError, DataException;
|
||||||
|
|
||||||
|
public abstract void confirmEmail(int conf_num) throws AccessError, DataException;
|
||||||
|
|
||||||
|
public abstract void resendEmailConfirmation() throws DataException, EmailException;
|
||||||
|
|
||||||
|
public abstract ContactInfo getContactInfo() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean putContactInfo(ContactInfo ci) throws DataException, EmailException;
|
||||||
|
|
||||||
|
public abstract UserProfile getProfile(String xusername) throws DataException;
|
||||||
|
|
||||||
|
public abstract UserProfile getProfile(int xuid) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setPassword(String password, String reminder) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setDescription(String new_descr) throws DataException;
|
||||||
|
|
||||||
|
public abstract FrontPageViewConfig getFrontPageViewConfig(int max_cols) throws DataException;
|
||||||
|
|
||||||
|
public abstract void putFrontPageViewConfig(FrontPageViewConfig cfg) throws DataException;
|
||||||
|
|
||||||
|
public abstract List getMemberSIGs() throws DataException;
|
||||||
|
|
||||||
|
public abstract SIGContext getSIGContext(int sigid) throws DataException;
|
||||||
|
|
||||||
|
public abstract SIGContext getSIGContext(String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract List getRootCategoryList() throws DataException;
|
||||||
|
|
||||||
|
public abstract CategoryDescriptor getCategoryDescriptor(int catid) throws DataException;
|
||||||
|
|
||||||
|
public abstract List searchForSIGs(int field, int mode, String term, int offset, int count)
|
||||||
|
throws DataException;
|
||||||
|
|
||||||
|
public abstract int getSearchSIGCount(int field, int mode, String term) throws DataException;
|
||||||
|
|
||||||
|
public abstract List getSIGsInCategory(int catid, int offset, int count) throws DataException;
|
||||||
|
|
||||||
|
public abstract List getSIGsInCategory(CategoryDescriptor cat, int offset, int count) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getNumSIGsInCategory(int catid) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getNumSIGsInCategory(CategoryDescriptor cat) throws DataException;
|
||||||
|
|
||||||
|
public abstract List searchForCategories(int mode, String term, int offset, int count) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getSearchCategoryCount(int mode, String term) throws DataException;
|
||||||
|
|
||||||
|
public abstract SIGContext createSIG(String name, String alias, String language, String synopsis,
|
||||||
|
String rules, String joinkey, int hide_mode)
|
||||||
|
throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean canCreateSIG();
|
||||||
|
|
||||||
|
} // end interface UserContext
|
40
src/com/silverwrist/venice/core/UserFound.java
Normal file
40
src/com/silverwrist/venice/core/UserFound.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
public interface UserFound
|
||||||
|
{
|
||||||
|
public abstract int getUID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
public abstract String getGivenName();
|
||||||
|
|
||||||
|
public abstract String getFamilyName();
|
||||||
|
|
||||||
|
public abstract String getLocality();
|
||||||
|
|
||||||
|
public abstract String getRegion();
|
||||||
|
|
||||||
|
public abstract String getCountry();
|
||||||
|
|
||||||
|
public abstract int getLevel();
|
||||||
|
|
||||||
|
} // end interface UserFound
|
74
src/com/silverwrist/venice/core/UserProfile.java
Normal file
74
src/com/silverwrist/venice/core/UserProfile.java
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public interface UserProfile
|
||||||
|
{
|
||||||
|
public abstract int getUID();
|
||||||
|
|
||||||
|
public abstract String getUserName();
|
||||||
|
|
||||||
|
public abstract String getGivenName();
|
||||||
|
|
||||||
|
public abstract String getFamilyName();
|
||||||
|
|
||||||
|
public abstract char getMiddleInitial();
|
||||||
|
|
||||||
|
public abstract String getNamePrefix();
|
||||||
|
|
||||||
|
public abstract String getNameSuffix();
|
||||||
|
|
||||||
|
public abstract String getCompany();
|
||||||
|
|
||||||
|
public abstract String getAddressLine1();
|
||||||
|
|
||||||
|
public abstract String getAddressLine2();
|
||||||
|
|
||||||
|
public abstract String getLocality();
|
||||||
|
|
||||||
|
public abstract String getRegion();
|
||||||
|
|
||||||
|
public abstract String getPostalCode();
|
||||||
|
|
||||||
|
public abstract String getCountry();
|
||||||
|
|
||||||
|
public abstract String getFullCountry();
|
||||||
|
|
||||||
|
public abstract String getPhone();
|
||||||
|
|
||||||
|
public abstract String getFax();
|
||||||
|
|
||||||
|
public abstract String getMobile();
|
||||||
|
|
||||||
|
public abstract String getEmail();
|
||||||
|
|
||||||
|
public abstract String getPhotoURL();
|
||||||
|
|
||||||
|
public abstract String getURL();
|
||||||
|
|
||||||
|
public abstract Date getCreateDate();
|
||||||
|
|
||||||
|
public abstract Date getLastLoginDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdate();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
} // end interface UserProfile
|
68
src/com/silverwrist/venice/core/VeniceEngine.java
Normal file
68
src/com/silverwrist/venice/core/VeniceEngine.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core;
|
||||||
|
|
||||||
|
import java.util.BitSet;
|
||||||
|
import java.util.List;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import com.silverwrist.venice.htmlcheck.HTMLChecker;
|
||||||
|
|
||||||
|
public interface VeniceEngine extends SearchMode
|
||||||
|
{
|
||||||
|
public abstract void initialize(Document config) throws ConfigException, DataException;
|
||||||
|
|
||||||
|
public abstract int getNumFeatures();
|
||||||
|
|
||||||
|
public abstract BitSet getAllFeaturesMask();
|
||||||
|
|
||||||
|
public abstract List getCountryList() throws DataException;
|
||||||
|
|
||||||
|
public abstract List getLanguageList() throws DataException;
|
||||||
|
|
||||||
|
public abstract String getNameOfCountry(String code);
|
||||||
|
|
||||||
|
public abstract UserContext createUserContext(String remote_addr) throws DataException;
|
||||||
|
|
||||||
|
public abstract String getEmailAddressForUser(String username) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract void sendPasswordReminder(String username)
|
||||||
|
throws DataException, AccessError, EmailException;
|
||||||
|
|
||||||
|
public abstract UserContext createNewAccount(String remote_addr, String username, String password,
|
||||||
|
String reminder) throws DataException, AccessError;
|
||||||
|
|
||||||
|
public abstract boolean aliasExists(String alias, int exist_sigid);
|
||||||
|
|
||||||
|
public abstract boolean isValidCategoryID(int catid);
|
||||||
|
|
||||||
|
public abstract List searchForUsers(int field, int mode, String term, int offset, int count)
|
||||||
|
throws DataException;
|
||||||
|
|
||||||
|
public abstract int getSearchUserCount(int field, int mode, String term) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getStdNumSearchResults();
|
||||||
|
|
||||||
|
public abstract boolean isEmailAddressBanned(String email);
|
||||||
|
|
||||||
|
public abstract boolean confAliasExists(String alias);
|
||||||
|
|
||||||
|
public abstract HTMLChecker getPreviewChecker();
|
||||||
|
|
||||||
|
public abstract HTMLChecker getEscapingChecker();
|
||||||
|
|
||||||
|
} // end interface VeniceEngine
|
577
src/com/silverwrist/venice/core/impl/CategoryDescriptorImpl.java
Normal file
577
src/com/silverwrist/venice/core/impl/CategoryDescriptorImpl.java
Normal file
|
@ -0,0 +1,577 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
|
||||||
|
class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class for saving category segments
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static class CatSegment
|
||||||
|
{
|
||||||
|
private int id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
CatSegment(int id, String name)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public int getID()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
|
||||||
|
} // end getID
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
} // end class CatSegment
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(CategoryDescriptorImpl.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private DataPool datapool; // used for doing database lookups
|
||||||
|
private Vector cats; // the actual category segments
|
||||||
|
private int symlink = -1; // if our category is actually a symlink
|
||||||
|
private boolean do_hide = true; // do we hide subcategories marked hide_dir?
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
CategoryDescriptorImpl(DataPool datapool, int catid, boolean do_hide) throws DataException
|
||||||
|
{
|
||||||
|
this.datapool = datapool;
|
||||||
|
cats = new Vector();
|
||||||
|
this.do_hide = do_hide;
|
||||||
|
|
||||||
|
if (catid<0)
|
||||||
|
return; // this is a "top" category
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a connection and a prepared statement
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
doFillFromTop(conn,catid);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // remap to DataException
|
||||||
|
throw new DataException("Unable to load category descriptor: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure and release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected CategoryDescriptorImpl(DataPool datapool, Connection conn, int catid, boolean do_hide)
|
||||||
|
throws SQLException, DataException
|
||||||
|
{
|
||||||
|
this.datapool = datapool;
|
||||||
|
cats = new Vector();
|
||||||
|
this.do_hide = do_hide;
|
||||||
|
|
||||||
|
if (catid<0)
|
||||||
|
return; // this is a "top" category
|
||||||
|
|
||||||
|
doFillFromTop(conn,catid);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected CategoryDescriptorImpl(DataPool datapool, int id, int symlink, String name, boolean do_hide)
|
||||||
|
{
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.cats = new Vector();
|
||||||
|
this.symlink = symlink;
|
||||||
|
this.do_hide = do_hide;
|
||||||
|
|
||||||
|
this.cats.add(new CatSegment(id,name));
|
||||||
|
this.cats.trimToSize();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected CategoryDescriptorImpl(CategoryDescriptorImpl other, int copy_levels)
|
||||||
|
{
|
||||||
|
this.datapool = other.datapool;
|
||||||
|
this.cats = new Vector();
|
||||||
|
this.symlink = ((copy_levels==other.cats.size()) ? other.symlink : -1);
|
||||||
|
this.do_hide = other.do_hide;
|
||||||
|
|
||||||
|
if (copy_levels>0)
|
||||||
|
{ // copy the references to the objects directly
|
||||||
|
for (int i=0; i<copy_levels; i++)
|
||||||
|
this.cats.add(other.cats.get(i));
|
||||||
|
this.cats.trimToSize();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected CategoryDescriptorImpl(CategoryDescriptorImpl other, int id, int symlink, String name)
|
||||||
|
{
|
||||||
|
this.datapool = other.datapool;
|
||||||
|
this.cats = new Vector();
|
||||||
|
this.symlink = symlink;
|
||||||
|
this.do_hide = other.do_hide;
|
||||||
|
|
||||||
|
// copy the references to the objects directly
|
||||||
|
for (int i=0; i<other.cats.size(); i++)
|
||||||
|
this.cats.add(other.cats.get(i));
|
||||||
|
this.cats.add(new CatSegment(id,name));
|
||||||
|
this.cats.trimToSize();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* finalize() function
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void finalize()
|
||||||
|
{
|
||||||
|
datapool = null;
|
||||||
|
cats = null;
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void doFillFromTop(Connection conn, int catid) throws SQLException, DataException
|
||||||
|
{
|
||||||
|
PreparedStatement stmt = conn.prepareStatement("SELECT parent, symlink, name "
|
||||||
|
+ "FROM refcategory WHERE catid = ?;");
|
||||||
|
int curr_catid = catid;
|
||||||
|
while (curr_catid!=-1)
|
||||||
|
{ // get the category reference for this level
|
||||||
|
stmt.setInt(1,curr_catid);
|
||||||
|
ResultSet rs = stmt.executeQuery();
|
||||||
|
|
||||||
|
if (!(rs.next())) // unable to read database
|
||||||
|
throw new DataException("category #" + String.valueOf(catid) + " could not be resolved");
|
||||||
|
|
||||||
|
// Save off the symbolic link value, if this category is a symlink.
|
||||||
|
int symlink_field = rs.getInt("symlink");
|
||||||
|
if (symlink_field!=-1)
|
||||||
|
{ // handle saving our symlink value - can only occur at END of path
|
||||||
|
if (cats.size()>0)
|
||||||
|
throw new InternalStateError("invalid symlink in category table (" + String.valueOf(curr_catid)
|
||||||
|
+ " => " + String.valueOf(symlink_field) + ")");
|
||||||
|
symlink = symlink_field;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
cats.add(0,new CatSegment(curr_catid,rs.getString("name")));
|
||||||
|
curr_catid = rs.getInt("parent");
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
cats.trimToSize(); // shrink vector down to size
|
||||||
|
|
||||||
|
} // end doFillFromTop
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface CategoryDescriptor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getCategoryID()
|
||||||
|
{
|
||||||
|
if (cats.size()>0)
|
||||||
|
return ((CatSegment)(cats.lastElement())).getID();
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} // end getCategoryID
|
||||||
|
|
||||||
|
public int getNumLevels()
|
||||||
|
{
|
||||||
|
return cats.size();
|
||||||
|
|
||||||
|
} // end getNumLevels
|
||||||
|
|
||||||
|
public int getIDAtLevel(int level)
|
||||||
|
{
|
||||||
|
return ((CatSegment)(cats.get(level))).getID();
|
||||||
|
|
||||||
|
} // end getIDAtLevel
|
||||||
|
|
||||||
|
public String getTitleAtLevel(int level)
|
||||||
|
{
|
||||||
|
return ((CatSegment)(cats.get(level))).getName();
|
||||||
|
|
||||||
|
} // end getTitleAtLevel
|
||||||
|
|
||||||
|
public List getSubCategories() throws DataException
|
||||||
|
{
|
||||||
|
if (symlink!=-1)
|
||||||
|
{ // "snap" the symlink before getting subcategories
|
||||||
|
CategoryDescriptorImpl real_obj = new CategoryDescriptorImpl(datapool,symlink,do_hide);
|
||||||
|
return real_obj.getSubCategories();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
Vector rc = new Vector();
|
||||||
|
try
|
||||||
|
{ // get a connection and create a statement
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT catid, symlink, name FROM refcategory WHERE parent = ");
|
||||||
|
sql.append(getCategoryID());
|
||||||
|
if (do_hide)
|
||||||
|
sql.append(" AND hide_dir = 0");
|
||||||
|
sql.append(';');
|
||||||
|
|
||||||
|
// run the database query
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
while (rs.next())
|
||||||
|
{ // turn data values into CategoryDescriptor objects
|
||||||
|
CategoryDescriptor ncd = new CategoryDescriptorImpl(this,rs.getInt("catid"),rs.getInt("symlink"),
|
||||||
|
rs.getString("name"));
|
||||||
|
rc.add(ncd);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // remap to DataException
|
||||||
|
throw new DataException("Unable to load subcategories: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure and release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
// wrap the vector in a ReadOnlyVector object
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end getSubCategories
|
||||||
|
|
||||||
|
public CategoryDescriptor getSuperCategory(int levels)
|
||||||
|
{
|
||||||
|
if ((levels<0) || (levels>(cats.size()-1)))
|
||||||
|
throw new IndexOutOfBoundsException("invalid supercategory level value");
|
||||||
|
return new CategoryDescriptorImpl(this,levels);
|
||||||
|
|
||||||
|
} // end getSuperCategory
|
||||||
|
|
||||||
|
public CategoryDescriptor getParentCategory()
|
||||||
|
{
|
||||||
|
return getSuperCategory(cats.size()-1);
|
||||||
|
|
||||||
|
} // end getParentCategory
|
||||||
|
|
||||||
|
public int getLinkedCategoryID()
|
||||||
|
{
|
||||||
|
if (symlink!=-1)
|
||||||
|
return symlink;
|
||||||
|
else
|
||||||
|
return getCategoryID();
|
||||||
|
|
||||||
|
} // end getLinkedCategoryID
|
||||||
|
|
||||||
|
public boolean isSymbolicLink()
|
||||||
|
{
|
||||||
|
return (symlink!=-1);
|
||||||
|
|
||||||
|
} // end isSymbolicLink
|
||||||
|
|
||||||
|
public CategoryDescriptor getLinkedCategory() throws DataException
|
||||||
|
{
|
||||||
|
if (symlink!=-1)
|
||||||
|
return new CategoryDescriptorImpl(datapool,symlink,do_hide);
|
||||||
|
else
|
||||||
|
return this;
|
||||||
|
|
||||||
|
} // end getLinkedCategory
|
||||||
|
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (obj==null)
|
||||||
|
return false;
|
||||||
|
if (obj instanceof CategoryDescriptor)
|
||||||
|
{ // this is something we can compare to directly
|
||||||
|
CategoryDescriptor other = (CategoryDescriptor)obj;
|
||||||
|
return (other.getLinkedCategoryID()==getLinkedCategoryID());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// compare string values
|
||||||
|
return obj.toString().equals(toString());
|
||||||
|
|
||||||
|
} // end equals
|
||||||
|
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
if (symlink!=-1)
|
||||||
|
return symlink;
|
||||||
|
else
|
||||||
|
return getCategoryID();
|
||||||
|
|
||||||
|
} // end hashCode
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
Iterator it = cats.iterator();
|
||||||
|
while (it.hasNext())
|
||||||
|
{ // concatenate all the parts together
|
||||||
|
CatSegment seg = (CatSegment)(it.next());
|
||||||
|
if (buf.length()>0)
|
||||||
|
buf.append(": ");
|
||||||
|
buf.append(seg.getName());
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end toString
|
||||||
|
|
||||||
|
public Object clone()
|
||||||
|
{
|
||||||
|
return new CategoryDescriptorImpl(this,cats.size());
|
||||||
|
|
||||||
|
} // end clone
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static operations for use within implementation package
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static List getTopLevelCategoryList(DataPool datapool, boolean do_hide) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
Vector rc = new Vector();
|
||||||
|
try
|
||||||
|
{ // get a connection and create a statement
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT catid, symlink, name FROM refcategory WHERE parent = -1");
|
||||||
|
if (do_hide)
|
||||||
|
sql.append(" AND hide_dir = 0");
|
||||||
|
sql.append(';');
|
||||||
|
|
||||||
|
// run the database query
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
while (rs.next())
|
||||||
|
{ // turn data values into CategoryDescriptor objects
|
||||||
|
CategoryDescriptor ncd = new CategoryDescriptorImpl(datapool,rs.getInt("catid"),rs.getInt("symlink"),
|
||||||
|
rs.getString("name"),do_hide);
|
||||||
|
rc.add(ncd);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // remap to DataException
|
||||||
|
throw new DataException("Unable to load subcategories: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure and release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
// wrap the vector in a ReadOnlyVector object
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end getTopLevelCategoryList
|
||||||
|
|
||||||
|
static List searchForCategories(DataPool datapool, boolean do_hide, boolean search_all, int mode,
|
||||||
|
String term, int offset, int count) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Category search: mode = " + String.valueOf(mode) + ", term '" + term + "', offset = "
|
||||||
|
+ String.valueOf(offset) + ", count = " + String.valueOf(count));
|
||||||
|
|
||||||
|
Vector rc = new Vector();
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT catid FROM refcategory WHERE name ");
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{ // compose SQL in different ways depending on the search term
|
||||||
|
case SearchMode.SEARCH_PREFIX:
|
||||||
|
sql.append("LIKE '").append(SQLUtil.encodeStringWildcards(term)).append("%'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SearchMode.SEARCH_SUBSTRING:
|
||||||
|
sql.append("LIKE '%").append(SQLUtil.encodeStringWildcards(term)).append("%'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SearchMode.SEARCH_REGEXP:
|
||||||
|
sql.append("REGEXP '").append(SQLUtil.encodeString(term)).append('\'');
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new DataException("invalid search mode specified");
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
if (do_hide)
|
||||||
|
sql.append(" AND hide_dir = 0");
|
||||||
|
if (!search_all)
|
||||||
|
sql.append(" AND hide_search = 0");
|
||||||
|
sql.append(" ORDER BY parent, name LIMIT ").append(offset).append(", ").append(count+1).append(';');
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
|
||||||
|
// launch the search!
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
|
||||||
|
int[] rc_raw = new int[count+1];
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
while (rs.next()) // just read off the matching CATIDs for now
|
||||||
|
rc_raw[n++] = rs.getInt("catid");
|
||||||
|
|
||||||
|
for (int i=0; i<n; i++)
|
||||||
|
{ // convert all the simple category IDs into full-blown CategoryDescriptor objects
|
||||||
|
CategoryDescriptor tmp = new CategoryDescriptorImpl(datapool,conn,rc_raw[i],do_hide);
|
||||||
|
rc.add(tmp);
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading SIG entries: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve user SIG information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end searchForCategories
|
||||||
|
|
||||||
|
static int getSearchCategoryCount(DataPool datapool, boolean do_hide, boolean search_all, int mode,
|
||||||
|
String term) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Category search: mode = " + String.valueOf(mode) + ", term '" + term + "'");
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT COUNT(*) AS total FROM refcategory WHERE name ");
|
||||||
|
|
||||||
|
switch (mode)
|
||||||
|
{ // compose SQL in different ways depending on the search term
|
||||||
|
case SearchMode.SEARCH_PREFIX:
|
||||||
|
sql.append("LIKE '").append(SQLUtil.encodeStringWildcards(term)).append("%'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SearchMode.SEARCH_SUBSTRING:
|
||||||
|
sql.append("LIKE '%").append(SQLUtil.encodeStringWildcards(term)).append("%'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SearchMode.SEARCH_REGEXP:
|
||||||
|
sql.append("REGEXP '").append(SQLUtil.encodeString(term)).append('\'');
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new DataException("invalid search mode specified");
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
if (do_hide)
|
||||||
|
sql.append(" AND hide_dir = 0");
|
||||||
|
if (!search_all)
|
||||||
|
sql.append(" AND hide_search = 0");
|
||||||
|
sql.append(';');
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
|
||||||
|
// launch the search!
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new InternalStateError("getSearchCategoryCount search failure (MUST have 1 row!)");
|
||||||
|
|
||||||
|
return rs.getInt("total");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading SIG entries: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve user SIG information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getSearchCategoryCount
|
||||||
|
|
||||||
|
} // end class CategoryDescriptorImpl
|
32
src/com/silverwrist/venice/core/impl/ConferenceBackend.java
Normal file
32
src/com/silverwrist/venice/core/impl/ConferenceBackend.java
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public interface ConferenceBackend extends SIGBackend
|
||||||
|
{
|
||||||
|
public abstract int realConfID();
|
||||||
|
|
||||||
|
public abstract boolean userCanHide();
|
||||||
|
|
||||||
|
public abstract void touchRead(Connection conn) throws SQLException;
|
||||||
|
|
||||||
|
public abstract String realConfAlias();
|
||||||
|
|
||||||
|
} // end interface ConferenceBackend
|
958
src/com/silverwrist/venice/core/impl/ConferenceCoreData.java
Normal file
958
src/com/silverwrist/venice/core/impl/ConferenceCoreData.java
Normal file
|
@ -0,0 +1,958 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
import com.silverwrist.venice.security.DefaultLevels;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
|
||||||
|
class ConferenceCoreData implements ConferenceData
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(ConferenceCoreData.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private int refcount = 1; // object reference count
|
||||||
|
private EngineBackend engine; // pointer to engine back end
|
||||||
|
private DataPool datapool; // pointer to data pool
|
||||||
|
private int confid; // ID of this conference
|
||||||
|
private java.util.Date create_date; // creation date of this conference
|
||||||
|
private java.util.Date last_update; // last update date of conference
|
||||||
|
private int read_level; // access level required to read conference contents
|
||||||
|
private int post_level; // access level required to post messages
|
||||||
|
private int create_level; // access level required to create new topics
|
||||||
|
private int hide_level; // access level required to hide posts/archive topics
|
||||||
|
private int nuke_level; // access level required to delete topics/scribble/nuke posts
|
||||||
|
private int change_level; // access level required to modify conference profile
|
||||||
|
private int delete_level; // access level required to delete conference
|
||||||
|
private int top_topic; // the highest topic number in the conference
|
||||||
|
private String name; // the name of the conference
|
||||||
|
private String description; // the conference's description
|
||||||
|
private String cached_alias = null; // the cached alias (for getAnAlias)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ConferenceCoreData(EngineBackend engine, DataPool datapool, int confid) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("new ConferenceCoreData for conference " + String.valueOf(confid));
|
||||||
|
this.engine = engine;
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.confid = confid;
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection from this object
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// get the conference basic data from the database
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * FROM confs WHERE confid = ");
|
||||||
|
sql.append(confid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new DataException("Conference #" + String.valueOf(confid) + " does not exist in the database.");
|
||||||
|
|
||||||
|
loadData(rs); // load the conference data
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate into a nicer DataException
|
||||||
|
logger.error("DB error reading conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to load conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
protected ConferenceCoreData(EngineBackend engine, DataPool datapool, int confid, java.util.Date created,
|
||||||
|
boolean pvt, String name, String descr)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("new ConferenceCoreData for NEW conference " + String.valueOf(confid));
|
||||||
|
this.engine = engine;
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.confid = confid;
|
||||||
|
this.create_date = created;
|
||||||
|
this.last_update = null;
|
||||||
|
this.read_level = DefaultLevels.newConferenceRead(pvt);
|
||||||
|
this.post_level = DefaultLevels.newConferencePost(pvt);
|
||||||
|
this.create_level = DefaultLevels.newConferenceCreate(pvt);
|
||||||
|
this.hide_level = DefaultLevels.newConferenceHide();
|
||||||
|
this.nuke_level = DefaultLevels.newConferenceNuke();
|
||||||
|
this.change_level = DefaultLevels.newConferenceChange();
|
||||||
|
this.delete_level = DefaultLevels.newConferenceDelete();
|
||||||
|
this.top_topic = 0;
|
||||||
|
this.name = name;
|
||||||
|
this.description = descr;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private synchronized void loadData(ResultSet rs) throws SQLException
|
||||||
|
{
|
||||||
|
// "confid" field is skipped
|
||||||
|
create_date = SQLUtil.getFullDateTime(rs,"createdate");
|
||||||
|
last_update = SQLUtil.getFullDateTime(rs,"lastupdate");
|
||||||
|
read_level = rs.getInt("read_lvl");
|
||||||
|
post_level = rs.getInt("post_lvl");
|
||||||
|
create_level = rs.getInt("create_lvl");
|
||||||
|
hide_level = rs.getInt("hide_lvl");
|
||||||
|
nuke_level = rs.getInt("nuke_lvl");
|
||||||
|
change_level = rs.getInt("change_lvl");
|
||||||
|
delete_level = rs.getInt("delete_lvl");
|
||||||
|
top_topic = rs.getInt("top_topic");
|
||||||
|
name = rs.getString("name");
|
||||||
|
description = rs.getString("descr");
|
||||||
|
// "icon_url" and "color" fields are skipped
|
||||||
|
|
||||||
|
} // end loadData
|
||||||
|
|
||||||
|
private synchronized void touchUpdate(Connection conn) throws SQLException
|
||||||
|
{
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE confs SET lastupdate = '");
|
||||||
|
java.util.Date now = new java.util.Date();
|
||||||
|
sql.append(SQLUtil.encodeDate(now)).append("' WHERE confid = ").append(confid).append(';');
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
last_update = now;
|
||||||
|
|
||||||
|
} // end touchUpdate
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ReferencedData
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int rd_addRef()
|
||||||
|
{
|
||||||
|
return ++refcount;
|
||||||
|
|
||||||
|
} // end rd_addRef()
|
||||||
|
|
||||||
|
public int rd_release()
|
||||||
|
{
|
||||||
|
return --refcount;
|
||||||
|
|
||||||
|
} // end rd_release
|
||||||
|
|
||||||
|
public boolean rd_unreferenced()
|
||||||
|
{
|
||||||
|
return (refcount<=0);
|
||||||
|
|
||||||
|
} // end rd_unreferenced
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ConferenceData
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getID()
|
||||||
|
{
|
||||||
|
return confid;
|
||||||
|
|
||||||
|
} // end getID
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
public java.util.Date getCreationDate()
|
||||||
|
{
|
||||||
|
return create_date;
|
||||||
|
|
||||||
|
} // end getCreationDate
|
||||||
|
|
||||||
|
public java.util.Date getLastUpdateDate()
|
||||||
|
{
|
||||||
|
return last_update;
|
||||||
|
|
||||||
|
} // end getLastUpdate
|
||||||
|
|
||||||
|
public List getAliases() throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
Vector rc = new Vector();
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection from this object
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// get a list of all aliases
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT alias FROM confalias WHERE confid = ");
|
||||||
|
sql.append(confid).append(" ORDER BY alias;");
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
while (rs.next())
|
||||||
|
rc.add(rs.getString(1));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate into a nicer DataException
|
||||||
|
logger.error("DB error reading conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to load conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end getAlias
|
||||||
|
|
||||||
|
public List getHosts() throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
Vector rc = new Vector();
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection from this object
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// get a list of all hosts (with user info)
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql =
|
||||||
|
new StringBuffer("SELECT u.uid, u.username, u.description, c.given_name, c.family_name, "
|
||||||
|
+ "c.locality, c.region, c.country FROM users u, contacts c, confmember m "
|
||||||
|
+ "WHERE u.contactid = c.contactid AND u.uid = m.uid AND m.confid = ");
|
||||||
|
sql.append(confid).append(" AND m.granted_lvl >= ").append(DefaultLevels.hostPrivsConference());
|
||||||
|
sql.append(" ORDER BY u.username;");
|
||||||
|
|
||||||
|
// execute the query
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
while (rs.next())
|
||||||
|
{ // create the UserFound
|
||||||
|
UserFound uf = new UserFoundImpl(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),
|
||||||
|
rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8));
|
||||||
|
rc.add(uf);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // translate into a nicer DataException
|
||||||
|
logger.error("DB error reading conference hosts: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to load conference hosts: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end getHosts
|
||||||
|
|
||||||
|
public boolean canReadConference(int level)
|
||||||
|
{
|
||||||
|
return (level>=read_level);
|
||||||
|
|
||||||
|
} // end canReadConference
|
||||||
|
|
||||||
|
public boolean canPostToConference(int level)
|
||||||
|
{
|
||||||
|
return (level>=post_level);
|
||||||
|
|
||||||
|
} // end canReadConference
|
||||||
|
|
||||||
|
public boolean canCreateTopic(int level)
|
||||||
|
{
|
||||||
|
return (level>=create_level);
|
||||||
|
|
||||||
|
} // end canCreateTopic
|
||||||
|
|
||||||
|
public boolean canChangeConference(int level)
|
||||||
|
{
|
||||||
|
return (level>=change_level);
|
||||||
|
|
||||||
|
} // end canChangeConference
|
||||||
|
|
||||||
|
public int getReadLevel()
|
||||||
|
{
|
||||||
|
return read_level;
|
||||||
|
|
||||||
|
} // end getReadLevel
|
||||||
|
|
||||||
|
public int getPostLevel()
|
||||||
|
{
|
||||||
|
return post_level;
|
||||||
|
|
||||||
|
} // end getPostLevel
|
||||||
|
|
||||||
|
public int getCreateLevel()
|
||||||
|
{
|
||||||
|
return create_level;
|
||||||
|
|
||||||
|
} // end getCreateLevel
|
||||||
|
|
||||||
|
public int getHideLevel()
|
||||||
|
{
|
||||||
|
return hide_level;
|
||||||
|
|
||||||
|
} // end getHideLevel
|
||||||
|
|
||||||
|
public int getNukeLevel()
|
||||||
|
{
|
||||||
|
return nuke_level;
|
||||||
|
|
||||||
|
} // end getNukeLevel
|
||||||
|
|
||||||
|
public int getChangeLevel()
|
||||||
|
{
|
||||||
|
return change_level;
|
||||||
|
|
||||||
|
} // end getChangeLevel
|
||||||
|
|
||||||
|
public int getDeleteLevel()
|
||||||
|
{
|
||||||
|
return delete_level;
|
||||||
|
|
||||||
|
} // end getDeleteLevel
|
||||||
|
|
||||||
|
public synchronized void setSecurityLevels(SIGBackend sig, int read, int post, int create, int hide,
|
||||||
|
int nuke, int change, int delete) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE confs SET read_lvl = ");
|
||||||
|
sql.append(read).append(", post_lvl = ").append(post).append(", create_lvl = ").append(create);
|
||||||
|
sql.append(", hide_lvl = ").append(hide).append(", nuke_lvl = ").append(nuke).append(", change_lvl = ");
|
||||||
|
sql.append(change).append(", delete_lvl = ").append(delete).append(", lastupdate = '");
|
||||||
|
java.util.Date now = new java.util.Date();
|
||||||
|
sql.append(SQLUtil.encodeDate(now)).append("' WHERE confid = ").append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
read_level = read;
|
||||||
|
post_level = post;
|
||||||
|
create_level = create;
|
||||||
|
hide_level = hide;
|
||||||
|
nuke_level = nuke;
|
||||||
|
change_level = change;
|
||||||
|
delete_level = delete;
|
||||||
|
last_update = now;
|
||||||
|
|
||||||
|
// create an audit record reflecting the change
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_SECURITY,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setSecurityLevels
|
||||||
|
|
||||||
|
public synchronized void setName(SIGBackend sig, String val) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE confs SET name = '");
|
||||||
|
sql.append(SQLUtil.encodeString(val)).append("', lastupdate = '");
|
||||||
|
java.util.Date now = new java.util.Date();
|
||||||
|
sql.append(SQLUtil.encodeDate(now)).append("' WHERE confid = ").append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
name = val;
|
||||||
|
last_update = now;
|
||||||
|
|
||||||
|
// create an audit record reflecting the change
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_SECURITY,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setName
|
||||||
|
|
||||||
|
public synchronized void setDescription(String val) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE confs SET descr = '");
|
||||||
|
sql.append(SQLUtil.encodeString(val)).append("', lastupdate = '");
|
||||||
|
java.util.Date now = new java.util.Date();
|
||||||
|
sql.append(SQLUtil.encodeDate(now)).append("' WHERE confid = ").append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
description = val;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setDescription
|
||||||
|
|
||||||
|
public synchronized void addAlias(SIGBackend sig, String alias) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES confalias WRITE;");
|
||||||
|
try
|
||||||
|
{ // first check to see if the alias already exists
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT confid FROM confalias WHERE alias = '");
|
||||||
|
String alias_encode = SQLUtil.encodeString(alias);
|
||||||
|
sql.append(alias_encode).append("';");
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next())
|
||||||
|
{ // already exists...but is it in this conference or a different one?
|
||||||
|
if (confid==rs.getInt(1))
|
||||||
|
return; // this conference - this is a no-op
|
||||||
|
throw new DataException("The alias \"" + alias + "\" is already in use by a different conference.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// now add it!
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO confalias (confid, alias) VALUES (").append(confid).append(", '");
|
||||||
|
sql.append(alias_encode).append("');");
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure we unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
// set the database's update date and generate a new audit record
|
||||||
|
touchUpdate(conn);
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_ALIAS,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid),"add=" + alias);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference alias: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference alias: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end addAlias
|
||||||
|
|
||||||
|
public synchronized void removeAlias(SIGBackend sig, String alias) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
boolean did_it = false;
|
||||||
|
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES confalias WRITE;");
|
||||||
|
try
|
||||||
|
{ // first check to see how many aliases there are
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT COUNT(*) FROM confalias WHERE confid = ");
|
||||||
|
sql.append(confid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new InternalStateError("removeAlias query screwup - must be at least ONE row!");
|
||||||
|
int alias_count = rs.getInt(1);
|
||||||
|
if (alias_count<=0)
|
||||||
|
throw new InternalStateError("removeAlias database failure - detected less than one alias!");
|
||||||
|
|
||||||
|
if (alias_count==1)
|
||||||
|
{ // OK, there's only one alias - make sure it ain't the one we're trying to remove!
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("SELECT alias FROM confalias WHERE confid = ").append(confid).append(" AND alias = '");
|
||||||
|
sql.append(SQLUtil.encodeString(alias)).append("';");
|
||||||
|
rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next()) // it is - that would be bad, throw an error!
|
||||||
|
throw new DataException("The conference must have at least one alias.");
|
||||||
|
return; // but if it isn't, we're not going to succeed in removing it anyway
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// OK, go delete the row (or not, if this alias is not in the table)
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("DELETE FROM confalias WHERE confid = ").append(confid).append("AND alias = '");
|
||||||
|
sql.append(SQLUtil.encodeString(alias)).append("';");
|
||||||
|
did_it = (stmt.executeUpdate(sql.toString())>0);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure we unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
if (did_it)
|
||||||
|
{ // set the database's update date and generate a new audit record
|
||||||
|
touchUpdate(conn);
|
||||||
|
if (cached_alias.equals(alias))
|
||||||
|
cached_alias = null; // also release the cached alias and force a re-get
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_ALIAS,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid),"remove=" + alias);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference alias: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference alias: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end removeAlias
|
||||||
|
|
||||||
|
public synchronized void setMembership(SIGBackend sig, int uid, int grant_level) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
boolean did_it = false;
|
||||||
|
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES confmember WRITE;");
|
||||||
|
try
|
||||||
|
{ // how we go about this depends on whether we're adding or removing
|
||||||
|
StringBuffer sql = new StringBuffer();
|
||||||
|
if (grant_level>=0)
|
||||||
|
{ // see whether the user is in the table yet...
|
||||||
|
sql.append("SELECT granted_lvl FROM confmember WHERE confid = ").append(confid);
|
||||||
|
sql.append(" AND uid = ").append(uid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
sql.setLength(0);
|
||||||
|
|
||||||
|
if (rs.next())
|
||||||
|
{ // just poke the new level value in
|
||||||
|
sql.append("UPDATE confmember SET granted_lvl = ").append(grant_level).append(" WHERE confid = ");
|
||||||
|
sql.append(confid).append(" AND uid = ").append(uid).append(';');
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // need to insert a new row...
|
||||||
|
sql.append("INSERT INTO confmember (confid, uid, granted_lvl) VALUES (").append(confid);
|
||||||
|
sql.append(", ").append(uid).append(", ").append(grant_level).append(");");
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
did_it = true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // just try to delete this row from the table (if possible)
|
||||||
|
sql.append("DELETE FROM confmember WHERE confid = ").append(confid).append(" AND uid = ");
|
||||||
|
sql.append(uid).append(';');
|
||||||
|
did_it = (stmt.executeUpdate(sql.toString())>0);
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure we unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
if (did_it)
|
||||||
|
{ // set the database's update date and generate a new audit record
|
||||||
|
touchUpdate(conn);
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_MEMBERSHIP,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid),"uid=" + String.valueOf(uid),
|
||||||
|
"level=" + String.valueOf(grant_level));
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setMembership
|
||||||
|
|
||||||
|
public boolean canHideTopics(int level)
|
||||||
|
{
|
||||||
|
return (level>=hide_level);
|
||||||
|
|
||||||
|
} // end canHideTopics
|
||||||
|
|
||||||
|
public synchronized String getAnAlias() throws DataException
|
||||||
|
{
|
||||||
|
if (cached_alias!=null)
|
||||||
|
return cached_alias;
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// create the SQL statement and execute it
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT alias FROM confalias WHERE confid = ");
|
||||||
|
sql.append(confid).append(" LIMIT 1;");
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new DataException("unable to find alias for conference");
|
||||||
|
cached_alias = rs.getString(1);
|
||||||
|
return cached_alias;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error retrieving conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to get conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getAnAlias
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations (usable only from within package)
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static ReturnConfSeq createConference(EngineBackend engine, SIGBackend sig, DataPool datapool, String name,
|
||||||
|
String alias, String description, boolean pvt, boolean hide_list,
|
||||||
|
int host_uid) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
int new_confid; // new conference ID
|
||||||
|
short new_sequence; // new sequence number
|
||||||
|
java.util.Date created; // date/time conference created
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("createConference entry");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // start by locking all the tables we need
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES confs WRITE, sigtoconf WRITE, confalias WRITE, confmember WRITE;");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // first check on the alias availability
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT confid FROM confalias WHERE alias = '");
|
||||||
|
String alias_encode = SQLUtil.encodeString(alias);
|
||||||
|
sql.append(alias_encode).append("';");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next()) // already used - this is bogus!
|
||||||
|
throw new DataException("The alias \"" + alias + "\" is already in use by a different conference.");
|
||||||
|
|
||||||
|
// compute our new sequence number
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("SELECT MAX(sequence) FROM sigtoconf WHERE sigid = ").append(sig.realSIGID()).append(';');
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new InternalStateError("bogus query in createConference - must return at least 1 row!");
|
||||||
|
new_sequence = (short)(rs.getShort(1) + 100);
|
||||||
|
|
||||||
|
// insert the record into the conferences table!
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO confs (createdate, read_lvl, post_lvl, create_lvl, hide_lvl, nuke_lvl, "
|
||||||
|
+ "change_lvl, delete_lvl, top_topic, name, descr) VALUES ('");
|
||||||
|
created = new java.util.Date();
|
||||||
|
sql.append(SQLUtil.encodeDate(created)).append("', ").append(DefaultLevels.newConferenceRead(pvt));
|
||||||
|
sql.append(", ").append(DefaultLevels.newConferencePost(pvt)).append(", ");
|
||||||
|
sql.append(DefaultLevels.newConferenceCreate(pvt)).append(", ");
|
||||||
|
sql.append(DefaultLevels.newConferenceHide()).append(", ").append(DefaultLevels.newConferenceNuke());
|
||||||
|
sql.append(", ").append(DefaultLevels.newConferenceChange()).append(", ");
|
||||||
|
sql.append(DefaultLevels.newConferenceDelete()).append(", 0, '").append(SQLUtil.encodeString(name));
|
||||||
|
sql.append("', '").append(SQLUtil.encodeString(description)).append("');");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// Get the new conference ID.
|
||||||
|
rs = stmt.executeQuery("SELECT LAST_INSERT_ID();");
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new InternalStateError("bogus query in createConference - must get new confid!");
|
||||||
|
new_confid = rs.getInt(1);
|
||||||
|
|
||||||
|
// Make the insert into the confalias table to give the conference an alias.
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO confalias (confid, alias) VALUES (").append(new_confid).append(", '");
|
||||||
|
sql.append(alias_encode).append("');");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// Link the SIG to the conference by adding a row to sigtoconf.
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO sigtoconf (sigid, confid, sequence, hide_list) VALUES (");
|
||||||
|
sql.append(sig.realSIGID()).append(", ").append(new_confid).append(", ").append(new_sequence);
|
||||||
|
sql.append(", ").append(hide_list ? '1' : '0').append(");");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// Make the specified UID the host of this new conference.
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO confmember (confid, uid, granted_lvl) VALUES (").append(new_confid);
|
||||||
|
sql.append(", ").append(host_uid).append(", ").append(DefaultLevels.hostConference()).append(");");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
// create an audit record indicating we were successful
|
||||||
|
ar = new AuditRecord(AuditRecord.CREATE_CONF,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"confid=" + String.valueOf(new_confid),"name=" + name,"alias=" + alias);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error creating SIG: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to create SIG: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
// Create a new ConferenceCoreData object representing this conference and register it with the
|
||||||
|
// engine's conference data object cache.
|
||||||
|
ConferenceCoreData conf = new ConferenceCoreData(engine,datapool,new_confid,created,pvt,name,description);
|
||||||
|
engine.registerNewConference(conf);
|
||||||
|
return new ReturnConfSeq(conf,new_sequence);
|
||||||
|
|
||||||
|
} // end createConference
|
||||||
|
|
||||||
|
} // end class ConferenceCoreData
|
79
src/com/silverwrist/venice/core/impl/ConferenceData.java
Normal file
79
src/com/silverwrist/venice/core/impl/ConferenceData.java
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface ConferenceData extends ReferencedData
|
||||||
|
{
|
||||||
|
public abstract int getID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
public abstract Date getCreationDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract List getAliases() throws DataException;
|
||||||
|
|
||||||
|
public abstract List getHosts() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canReadConference(int level);
|
||||||
|
|
||||||
|
public abstract boolean canPostToConference(int level);
|
||||||
|
|
||||||
|
public abstract boolean canCreateTopic(int level);
|
||||||
|
|
||||||
|
public abstract boolean canChangeConference(int level);
|
||||||
|
|
||||||
|
public abstract int getReadLevel();
|
||||||
|
|
||||||
|
public abstract int getPostLevel();
|
||||||
|
|
||||||
|
public abstract int getCreateLevel();
|
||||||
|
|
||||||
|
public abstract int getHideLevel();
|
||||||
|
|
||||||
|
public abstract int getNukeLevel();
|
||||||
|
|
||||||
|
public abstract int getChangeLevel();
|
||||||
|
|
||||||
|
public abstract int getDeleteLevel();
|
||||||
|
|
||||||
|
public abstract void setSecurityLevels(SIGBackend sig, int read, int post, int create, int hide,
|
||||||
|
int nuke, int change, int delete) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setName(SIGBackend sig, String val) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setDescription(String val) throws DataException;
|
||||||
|
|
||||||
|
public abstract void addAlias(SIGBackend sig, String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract void removeAlias(SIGBackend sig, String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setMembership(SIGBackend sig, int uid, int grant_level) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canHideTopics(int level);
|
||||||
|
|
||||||
|
public abstract String getAnAlias() throws DataException;
|
||||||
|
|
||||||
|
} // end interface ConferenceData
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface ConferenceSIGContext extends ReferencedData
|
||||||
|
{
|
||||||
|
public abstract int getConfID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getDescription();
|
||||||
|
|
||||||
|
public abstract Date getCreationDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract int getSIGGrantedLevel();
|
||||||
|
|
||||||
|
public abstract List getAliases() throws DataException;
|
||||||
|
|
||||||
|
public abstract List getHosts() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canReadConference(int level);
|
||||||
|
|
||||||
|
public abstract boolean canPostToConference(int level);
|
||||||
|
|
||||||
|
public abstract boolean canCreateTopic(int level);
|
||||||
|
|
||||||
|
public abstract boolean canChangeConference(int level);
|
||||||
|
|
||||||
|
public abstract int getReadLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getPostLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getCreateLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getHideLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getNukeLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getChangeLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract int getDeleteLevel() throws DataException;
|
||||||
|
|
||||||
|
public abstract void setSecurityLevels(SIGBackend sig, int read, int post, int create, int hide,
|
||||||
|
int nuke, int change, int delete) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setName(SIGBackend sig, String val) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setDescription(String val) throws DataException;
|
||||||
|
|
||||||
|
public abstract void addAlias(SIGBackend sig, String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract void removeAlias(SIGBackend sig, String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setMembership(SIGBackend sig, int uid, int grant_level) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setSIGGrantedLevel(SIGBackend sig, int new_level) throws DataException;
|
||||||
|
|
||||||
|
public abstract short getSequence();
|
||||||
|
|
||||||
|
public abstract void setSequence(short seq) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean getHideList();
|
||||||
|
|
||||||
|
public abstract void setHideList(SIGBackend sig, boolean flag) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean canHideTopics(int level);
|
||||||
|
|
||||||
|
public abstract String getAnAlias() throws DataException;
|
||||||
|
|
||||||
|
} // end interface ConferenceSIGContext
|
|
@ -0,0 +1,614 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
|
||||||
|
class ConferenceSIGContextImpl implements ConferenceSIGContext
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Inner class used to cache locally-important data
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static class ConfCache
|
||||||
|
{
|
||||||
|
String name;
|
||||||
|
String description;
|
||||||
|
java.util.Date created;
|
||||||
|
|
||||||
|
public ConfCache(String name, String description, java.util.Date created)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.description = description;
|
||||||
|
this.created = created;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
public java.util.Date getCreated()
|
||||||
|
{
|
||||||
|
return created;
|
||||||
|
|
||||||
|
} // end getCreated
|
||||||
|
|
||||||
|
} // end class ConfCache
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(ConferenceSIGContextImpl.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private int refcount = 1; // reference count (within the SIGData)
|
||||||
|
private EngineBackend engine; // engine object reference
|
||||||
|
private SIGDataBackend sig; // SIG object reference
|
||||||
|
private DataPool datapool; // data pool object
|
||||||
|
private int confid; // ID of this conference
|
||||||
|
private int level; // level granted in conference to members of the SIG
|
||||||
|
private short sequence; // sequence number this conference appears in list
|
||||||
|
private boolean hide_list; // hide the conference in the list?
|
||||||
|
private ConfCache cache; // cache of locally-important information
|
||||||
|
private ConferenceData confdata = null; // the inner conference data object
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ConferenceSIGContextImpl(EngineBackend engine, SIGDataBackend sig, DataPool datapool, int confid)
|
||||||
|
throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("new ConferenceSIGContextImpl(#" + String.valueOf(confid) + ") for SIG # "
|
||||||
|
+ String.valueOf(sig.realSIGID()));
|
||||||
|
|
||||||
|
this.engine = engine;
|
||||||
|
this.sig = sig;
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.confid = confid;
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// Build a monster query! This is like the query for retrieving the ConferenceUserContextImpl
|
||||||
|
// data, except without the left outer join to the user conference membership table.
|
||||||
|
StringBuffer sql =
|
||||||
|
new StringBuffer("SELECT c.createdate, c.name, c.descr, s.granted_lvl, s.sequence, s.hide_list "
|
||||||
|
+ "FROM sigtoconf s, confs c WHERE s.confid = c.confid AND s.sigid = ");
|
||||||
|
sql.append(sig.realSIGID()).append(" AND c.confid = ").append(confid).append(';');
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
|
||||||
|
// Run that monster query!
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new DataException("conference ID#" + String.valueOf(confid) + " not found in SIG#"
|
||||||
|
+ String.valueOf(sig.realSIGID()));
|
||||||
|
|
||||||
|
// fill in the "cache" and "level" indicators
|
||||||
|
this.cache = new ConfCache(rs.getString(2),rs.getString(3),SQLUtil.getFullDateTime(rs,1));
|
||||||
|
this.level = rs.getInt(4);
|
||||||
|
this.sequence = rs.getShort(5);
|
||||||
|
this.hide_list = rs.getBoolean(6);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading conference entry: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve conference information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
ConferenceSIGContextImpl(EngineBackend engine, SIGDataBackend sig, DataPool datapool,
|
||||||
|
short sequence, boolean hide_list, ConferenceData cdata)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("new ConferenceSIGContextImpl(NEW#" + String.valueOf(confid) + ") for SIG # "
|
||||||
|
+ String.valueOf(sig.realSIGID()));
|
||||||
|
|
||||||
|
this.engine = engine;
|
||||||
|
this.sig = sig;
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.confid = cdata.getID();
|
||||||
|
this.level = 0;
|
||||||
|
this.sequence = sequence;
|
||||||
|
this.hide_list = hide_list;
|
||||||
|
this.cache = null;
|
||||||
|
cdata.rd_addRef();
|
||||||
|
this.confdata = cdata;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private synchronized ConferenceData getConferenceData() throws DataException
|
||||||
|
{
|
||||||
|
if (confdata==null)
|
||||||
|
{ // attempt to load the ConferenceSIGContext
|
||||||
|
confdata = engine.getConferenceDataObject(confid);
|
||||||
|
|
||||||
|
// clear cache when we get the real confdata
|
||||||
|
cache = null;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return confdata;
|
||||||
|
|
||||||
|
} // end getConferenceData
|
||||||
|
|
||||||
|
private synchronized ConferenceData getConferenceDataNE()
|
||||||
|
{
|
||||||
|
if (confdata==null)
|
||||||
|
{ // we need to load the ConferenceSIGContext...
|
||||||
|
try
|
||||||
|
{ // attempt to load the ConferenceSIGContext
|
||||||
|
confdata = engine.getConferenceDataObject(confid);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (DataException e)
|
||||||
|
{ // there was a data failure loading the conference
|
||||||
|
logger.error("** Got DataException in getConferenceDataNE: " + e.getMessage(),e);
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// clear cache when we get the real confdata
|
||||||
|
cache = null;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return confdata;
|
||||||
|
|
||||||
|
} // end getConferenceDataNE
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ReferencedData
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int rd_addRef()
|
||||||
|
{
|
||||||
|
return ++refcount;
|
||||||
|
|
||||||
|
} // end rd_addRef
|
||||||
|
|
||||||
|
public int rd_release()
|
||||||
|
{
|
||||||
|
return --refcount;
|
||||||
|
|
||||||
|
} // end rd_release
|
||||||
|
|
||||||
|
public boolean rd_unreferenced()
|
||||||
|
{
|
||||||
|
return (refcount<=0);
|
||||||
|
|
||||||
|
} // end rd_unreferences
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ConferenceSIGContext
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getConfID()
|
||||||
|
{
|
||||||
|
return confid;
|
||||||
|
|
||||||
|
} // end getConfID
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
if (cache!=null)
|
||||||
|
return cache.getName();
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c!=null)
|
||||||
|
return c.getName();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
if (cache!=null)
|
||||||
|
return cache.getDescription();
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c!=null)
|
||||||
|
return c.getDescription();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
public java.util.Date getCreationDate()
|
||||||
|
{
|
||||||
|
if (cache!=null)
|
||||||
|
return cache.getCreated();
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c!=null)
|
||||||
|
return c.getCreationDate();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getCreationDate
|
||||||
|
|
||||||
|
public java.util.Date getLastUpdateDate()
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c!=null)
|
||||||
|
return c.getLastUpdateDate();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getLastUpdateDate
|
||||||
|
|
||||||
|
public int getSIGGrantedLevel()
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
|
||||||
|
} // end getSIGGrantedLevel
|
||||||
|
|
||||||
|
public List getAliases() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getAliases();
|
||||||
|
|
||||||
|
} // end getAliases
|
||||||
|
|
||||||
|
public List getHosts() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getHosts();
|
||||||
|
|
||||||
|
} // end getHosts
|
||||||
|
|
||||||
|
public boolean canReadConference(int level)
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c==null)
|
||||||
|
return false;
|
||||||
|
if (level<this.level)
|
||||||
|
return c.canReadConference(this.level);
|
||||||
|
else
|
||||||
|
return c.canReadConference(level);
|
||||||
|
|
||||||
|
} // end canReadConference
|
||||||
|
|
||||||
|
public boolean canPostToConference(int level)
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c==null)
|
||||||
|
return false;
|
||||||
|
if (level<this.level)
|
||||||
|
return c.canPostToConference(this.level);
|
||||||
|
else
|
||||||
|
return c.canPostToConference(level);
|
||||||
|
|
||||||
|
} // end canPostToConference
|
||||||
|
|
||||||
|
public boolean canCreateTopic(int level)
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c==null)
|
||||||
|
return false;
|
||||||
|
if (level<this.level)
|
||||||
|
return c.canCreateTopic(this.level);
|
||||||
|
else
|
||||||
|
return c.canCreateTopic(level);
|
||||||
|
|
||||||
|
} // end canCreateTopic
|
||||||
|
|
||||||
|
public boolean canChangeConference(int level)
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c==null)
|
||||||
|
return false;
|
||||||
|
if (level<this.level)
|
||||||
|
return c.canChangeConference(this.level);
|
||||||
|
else
|
||||||
|
return c.canChangeConference(level);
|
||||||
|
|
||||||
|
} // end canChangeConference
|
||||||
|
|
||||||
|
public int getReadLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getReadLevel();
|
||||||
|
|
||||||
|
} // end getReadLevel
|
||||||
|
|
||||||
|
public int getPostLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getPostLevel();
|
||||||
|
|
||||||
|
} // end getPostLevel
|
||||||
|
|
||||||
|
public int getCreateLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getCreateLevel();
|
||||||
|
|
||||||
|
} // end getCreateLevel
|
||||||
|
|
||||||
|
public int getHideLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getHideLevel();
|
||||||
|
|
||||||
|
} // end getHideLevel
|
||||||
|
|
||||||
|
public int getNukeLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getNukeLevel();
|
||||||
|
|
||||||
|
} // end getNukeLevel
|
||||||
|
|
||||||
|
public int getChangeLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getChangeLevel();
|
||||||
|
|
||||||
|
} // end getChangeLevel
|
||||||
|
|
||||||
|
public int getDeleteLevel() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getDeleteLevel();
|
||||||
|
|
||||||
|
} // end getDeleteLevel
|
||||||
|
|
||||||
|
public synchronized void setSecurityLevels(SIGBackend sig, int read, int post, int create, int hide,
|
||||||
|
int nuke, int change, int delete) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().setSecurityLevels(sig,read,post,create,hide,nuke,change,delete);
|
||||||
|
|
||||||
|
} // end setSecurityLevels
|
||||||
|
|
||||||
|
public synchronized void setName(SIGBackend sig, String val) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().setName(sig,val);
|
||||||
|
|
||||||
|
} // end setName
|
||||||
|
|
||||||
|
public synchronized void setDescription(String val) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().setDescription(val);
|
||||||
|
|
||||||
|
} // end setDescription
|
||||||
|
|
||||||
|
public synchronized void addAlias(SIGBackend sig, String alias) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().addAlias(sig,alias);
|
||||||
|
|
||||||
|
} // end addAlias
|
||||||
|
|
||||||
|
public synchronized void removeAlias(SIGBackend sig, String alias) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().removeAlias(sig,alias);
|
||||||
|
|
||||||
|
} // end removeAlias
|
||||||
|
|
||||||
|
public synchronized void setMembership(SIGBackend sig, int uid, int grant_level) throws DataException
|
||||||
|
{
|
||||||
|
getConferenceData().setMembership(sig,uid,grant_level);
|
||||||
|
|
||||||
|
} // end setMembership
|
||||||
|
|
||||||
|
public synchronized void setSIGGrantedLevel(SIGBackend sig, int new_level) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE sigtoconf SET granted_lvl = ");
|
||||||
|
sql.append(new_level).append(" WHERE sigid = ").append(this.sig.realSIGID()).append(" AND confid = ");
|
||||||
|
sql.append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
level = new_level;
|
||||||
|
|
||||||
|
// create an audit record reflecting the change
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_SECURITY,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setSIGGrantedLevel
|
||||||
|
|
||||||
|
public short getSequence()
|
||||||
|
{
|
||||||
|
return sequence;
|
||||||
|
|
||||||
|
} // end getSequence
|
||||||
|
|
||||||
|
public synchronized void setSequence(short seq) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE sigtoconf SET sequence = ");
|
||||||
|
sql.append(seq).append(" WHERE sigid = ").append(this.sig.realSIGID()).append(" AND confid = ");
|
||||||
|
sql.append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
sequence = seq;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setSequence
|
||||||
|
|
||||||
|
public boolean getHideList()
|
||||||
|
{
|
||||||
|
return hide_list;
|
||||||
|
|
||||||
|
} // end getHideList
|
||||||
|
|
||||||
|
public void setHideList(SIGBackend sig, boolean flag) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create the SQL statement
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE sigtoconf SET hide_list = ");
|
||||||
|
sql.append(hide_list ? '1' : '0').append(" WHERE sigid = ").append(this.sig.realSIGID());
|
||||||
|
sql.append(" AND confid = ").append(confid).append(';');
|
||||||
|
|
||||||
|
// execute the update
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save copies of the data in our local variables
|
||||||
|
hide_list = flag;
|
||||||
|
|
||||||
|
// create an audit record reflecting the change
|
||||||
|
ar = new AuditRecord(AuditRecord.CONF_SECURITY,sig.realUID(),sig.userRemoteAddress(),sig.realSIGID(),
|
||||||
|
"conf=" + String.valueOf(confid));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error storing conference data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save conference data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setHideList
|
||||||
|
|
||||||
|
public boolean canHideTopics(int level)
|
||||||
|
{
|
||||||
|
ConferenceData c = getConferenceDataNE();
|
||||||
|
if (c==null)
|
||||||
|
return false;
|
||||||
|
if (level<this.level)
|
||||||
|
return c.canHideTopics(this.level);
|
||||||
|
else
|
||||||
|
return c.canHideTopics(level);
|
||||||
|
|
||||||
|
} // end canHideTopics
|
||||||
|
|
||||||
|
public String getAnAlias() throws DataException
|
||||||
|
{
|
||||||
|
return getConferenceData().getAnAlias();
|
||||||
|
|
||||||
|
} // end getAnAlias
|
||||||
|
|
||||||
|
} // end class ConferenceSIGContextImpl
|
1118
src/com/silverwrist/venice/core/impl/ConferenceUserContextImpl.java
Normal file
1118
src/com/silverwrist/venice/core/impl/ConferenceUserContextImpl.java
Normal file
File diff suppressed because it is too large
Load Diff
694
src/com/silverwrist/venice/core/impl/ContactInfoImpl.java
Normal file
694
src/com/silverwrist/venice/core/impl/ContactInfoImpl.java
Normal file
|
@ -0,0 +1,694 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
|
||||||
|
class ContactInfoImpl implements ContactInfo, Stashable
|
||||||
|
{
|
||||||
|
// Attributes
|
||||||
|
private int contactid; // ID of this contact record (-1 = new)
|
||||||
|
private String given_name; // given name ("first name")
|
||||||
|
private String family_name; // family name ("last name")
|
||||||
|
private char middle_initial; // middle initial (natch)
|
||||||
|
private String prefix; // prefix (Mr., Ms., Prof., Dr., etc.)
|
||||||
|
private String suffix; // suffix (Jr., III, etc.)
|
||||||
|
private String company; // company name
|
||||||
|
private String addr1; // address line 1
|
||||||
|
private String addr2; // address line 2
|
||||||
|
private String locality; // locality ("city")
|
||||||
|
private String region; // region ("state")
|
||||||
|
private String postal_code; // postal code ("ZIP code")
|
||||||
|
private String country; // 2-character ISO 3166 country code
|
||||||
|
private String phone; // voice phone number
|
||||||
|
private String fax; // facsimile (fax) number
|
||||||
|
private String mobile; // mobile phone (cellphone) number
|
||||||
|
private String email; // email address
|
||||||
|
private String photo_url; // URL of user photo
|
||||||
|
private String url; // URL of user's homepage
|
||||||
|
private boolean private_addr; // are addr1 and addr2 hidden?
|
||||||
|
private boolean private_phone; // are phone and mobile hidden?
|
||||||
|
private boolean private_fax; // is fax hidden?
|
||||||
|
private boolean private_email; // is email hidden?
|
||||||
|
private int owner_uid; // UID that owns this contact record
|
||||||
|
private int owner_sigid; // SIGID this contact record is in (-1 for none)
|
||||||
|
private java.util.Date last_update; // date of last update
|
||||||
|
private boolean is_modified = false; // have we modified this ContactInfo?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new blank <CODE>ContactInfoImpl</CODE> object.
|
||||||
|
*
|
||||||
|
* @param owner_uid UID that owns this object.
|
||||||
|
*/
|
||||||
|
ContactInfoImpl(int owner_uid)
|
||||||
|
{
|
||||||
|
makeEmpty(owner_uid,-1);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new blank <CODE>ContactInfoImpl</CODE> object.
|
||||||
|
*
|
||||||
|
* @param owner_uid UID that owns this object.
|
||||||
|
* @param owner_sigid SIGID that owns this object.
|
||||||
|
*/
|
||||||
|
ContactInfoImpl(int owner_uid, int owner_sigid)
|
||||||
|
{
|
||||||
|
makeEmpty(owner_uid,owner_sigid);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a <CODE>ContactInfoImpl</CODE> object out of the database.
|
||||||
|
*
|
||||||
|
* @param dp Database connection pool to get a Venice database connection from.
|
||||||
|
* @param contactid ID of the contact to load.
|
||||||
|
* @exception DataException The contact could not be loaded for some reason.
|
||||||
|
*/
|
||||||
|
ContactInfoImpl(DataPool dp, int contactid) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a connection and call loadData
|
||||||
|
conn = dp.getConnection();
|
||||||
|
loadData(conn,contactid);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLExceptions at this level into DataExceptions
|
||||||
|
throw new DataException("Unable to look up contact info: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
dp.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
private void makeEmpty(int owner_uid, int owner_sigid)
|
||||||
|
{
|
||||||
|
this.contactid = -1;
|
||||||
|
this.given_name = null;
|
||||||
|
this.family_name = null;
|
||||||
|
this.middle_initial = ' ';
|
||||||
|
this.prefix = null;
|
||||||
|
this.suffix = null;
|
||||||
|
this.company = null;
|
||||||
|
this.addr1 = null;
|
||||||
|
this.addr2 = null;
|
||||||
|
this.locality = null;
|
||||||
|
this.region = null;
|
||||||
|
this.postal_code = null;
|
||||||
|
this.country = null;
|
||||||
|
this.phone = null;
|
||||||
|
this.fax = null;
|
||||||
|
this.mobile = null;
|
||||||
|
this.email = null;
|
||||||
|
this.photo_url = null;
|
||||||
|
this.url = null;
|
||||||
|
this.private_addr = false;
|
||||||
|
this.private_phone = false;
|
||||||
|
this.private_fax = false;
|
||||||
|
this.private_email = false;
|
||||||
|
this.owner_uid = owner_uid;
|
||||||
|
this.owner_sigid = owner_sigid;
|
||||||
|
this.last_update = null;
|
||||||
|
|
||||||
|
} // end makeEmpty
|
||||||
|
|
||||||
|
private void loadData(Connection conn, int contactid) throws DataException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // do a simple SELECT in contacts to look this up
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * FROM contacts WHERE contactid = ");
|
||||||
|
sql.append(contactid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next())
|
||||||
|
{ // do a mad orgy of saving off field values
|
||||||
|
this.contactid = rs.getInt("contactid");
|
||||||
|
given_name = rs.getString("given_name");
|
||||||
|
family_name = rs.getString("family_name");
|
||||||
|
String blort = rs.getString("middle_init");
|
||||||
|
if ((blort!=null) && (blort.length()>0))
|
||||||
|
middle_initial = blort.charAt(0);
|
||||||
|
else
|
||||||
|
middle_initial = ' ';
|
||||||
|
prefix = rs.getString("prefix");
|
||||||
|
suffix = rs.getString("suffix");
|
||||||
|
company = rs.getString("company");
|
||||||
|
addr1 = rs.getString("addr1");
|
||||||
|
addr2 = rs.getString("addr2");
|
||||||
|
locality = rs.getString("locality");
|
||||||
|
region = rs.getString("region");
|
||||||
|
postal_code = rs.getString("pcode");
|
||||||
|
country = rs.getString("country");
|
||||||
|
phone = rs.getString("phone");
|
||||||
|
fax = rs.getString("fax");
|
||||||
|
mobile = rs.getString("mobile");
|
||||||
|
email = rs.getString("email");
|
||||||
|
private_addr = rs.getBoolean("pvt_addr");
|
||||||
|
private_phone = rs.getBoolean("pvt_phone");
|
||||||
|
private_fax = rs.getBoolean("pvt_fax");
|
||||||
|
private_email = rs.getBoolean("pvt_email");
|
||||||
|
owner_uid = rs.getInt("owner_uid");
|
||||||
|
owner_sigid = rs.getInt("owner_sigid");
|
||||||
|
photo_url = rs.getString("photo_url");
|
||||||
|
url = rs.getString("url");
|
||||||
|
last_update = SQLUtil.getFullDateTime(rs,"lastupdate");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // contact was not found
|
||||||
|
throw new DataException("Contact was not found.");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // map all SQLExceptions into DataExceptions
|
||||||
|
throw new DataException("Unable to look up contact info: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end loadData
|
||||||
|
|
||||||
|
public int getContactID()
|
||||||
|
{
|
||||||
|
return contactid;
|
||||||
|
|
||||||
|
} // end getContactID
|
||||||
|
|
||||||
|
public String getGivenName()
|
||||||
|
{
|
||||||
|
return given_name;
|
||||||
|
|
||||||
|
} // end getGivenName
|
||||||
|
|
||||||
|
public void setGivenName(String name)
|
||||||
|
{
|
||||||
|
if ((name!=null) && (name.length()>64))
|
||||||
|
given_name = name.substring(0,64);
|
||||||
|
else
|
||||||
|
given_name = name;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setGivenName
|
||||||
|
|
||||||
|
public String getFamilyName()
|
||||||
|
{
|
||||||
|
return family_name;
|
||||||
|
|
||||||
|
} // end getFamilyName
|
||||||
|
|
||||||
|
public void setFamilyName(String name)
|
||||||
|
{
|
||||||
|
if ((name!=null) && (name.length()>64))
|
||||||
|
family_name = name.substring(0,64);
|
||||||
|
else
|
||||||
|
family_name = name;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setFamilyName
|
||||||
|
|
||||||
|
public char getMiddleInitial()
|
||||||
|
{
|
||||||
|
return middle_initial;
|
||||||
|
|
||||||
|
} // end getMiddleInitial
|
||||||
|
|
||||||
|
public void setMiddleInitial(char in)
|
||||||
|
{
|
||||||
|
middle_initial = in;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setMiddleInitial
|
||||||
|
|
||||||
|
public String getNamePrefix()
|
||||||
|
{
|
||||||
|
return prefix;
|
||||||
|
|
||||||
|
} // end getNamePrefix
|
||||||
|
|
||||||
|
public void setNamePrefix(String p)
|
||||||
|
{
|
||||||
|
if ((p!=null) && (p.length()>8))
|
||||||
|
prefix = p.substring(0,8);
|
||||||
|
else
|
||||||
|
prefix = p;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setNamePrefix
|
||||||
|
|
||||||
|
public String getNameSuffix()
|
||||||
|
{
|
||||||
|
return suffix;
|
||||||
|
|
||||||
|
} // end getNameSuffix
|
||||||
|
|
||||||
|
public void setNameSuffix(String s)
|
||||||
|
{
|
||||||
|
if ((s!=null) && (s.length()>16))
|
||||||
|
suffix = s.substring(0,16);
|
||||||
|
else
|
||||||
|
suffix = s;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setNameSuffix
|
||||||
|
|
||||||
|
public String getCompany()
|
||||||
|
{
|
||||||
|
return company;
|
||||||
|
|
||||||
|
} // end getCompany
|
||||||
|
|
||||||
|
public void setCompany(String c)
|
||||||
|
{
|
||||||
|
if ((c!=null) && (c.length()>255))
|
||||||
|
company = c.substring(0,255);
|
||||||
|
else
|
||||||
|
company = c;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setCompany
|
||||||
|
|
||||||
|
public String getAddressLine1()
|
||||||
|
{
|
||||||
|
return addr1;
|
||||||
|
|
||||||
|
} // end getAddressLine1
|
||||||
|
|
||||||
|
public void setAddressLine1(String addr)
|
||||||
|
{
|
||||||
|
if ((addr!=null) && (addr.length()>255))
|
||||||
|
addr1 = addr.substring(0,255);
|
||||||
|
else
|
||||||
|
addr1 = addr;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setAddressLine1
|
||||||
|
|
||||||
|
public String getAddressLine2()
|
||||||
|
{
|
||||||
|
return addr2;
|
||||||
|
|
||||||
|
} // end getAddressLine2
|
||||||
|
|
||||||
|
public void setAddressLine2(String addr)
|
||||||
|
{
|
||||||
|
if ((addr!=null) && (addr.length()>255))
|
||||||
|
addr2 = addr.substring(0,255);
|
||||||
|
else
|
||||||
|
addr2 = addr;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setAddressLine2
|
||||||
|
|
||||||
|
public String getLocality()
|
||||||
|
{
|
||||||
|
return locality;
|
||||||
|
|
||||||
|
} // end getLocality
|
||||||
|
|
||||||
|
public void setLocality(String city)
|
||||||
|
{
|
||||||
|
if ((city!=null) && (city.length()>64))
|
||||||
|
locality = city.substring(0,64);
|
||||||
|
else
|
||||||
|
locality = city;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setLocality
|
||||||
|
|
||||||
|
public String getRegion()
|
||||||
|
{
|
||||||
|
return region;
|
||||||
|
|
||||||
|
} // end getRegion
|
||||||
|
|
||||||
|
public void setRegion(String state)
|
||||||
|
{
|
||||||
|
if ((state!=null) && (state.length()>64))
|
||||||
|
region = state.substring(0,64);
|
||||||
|
else
|
||||||
|
region = state;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setRegion
|
||||||
|
|
||||||
|
public String getPostalCode()
|
||||||
|
{
|
||||||
|
return postal_code;
|
||||||
|
|
||||||
|
} // end getPostalCode
|
||||||
|
|
||||||
|
public void setPostalCode(String zip)
|
||||||
|
{
|
||||||
|
if ((zip!=null) && (zip.length()>16))
|
||||||
|
postal_code = zip.substring(0,16);
|
||||||
|
else
|
||||||
|
postal_code = zip;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPostalCode
|
||||||
|
|
||||||
|
public String getCountry()
|
||||||
|
{
|
||||||
|
return country;
|
||||||
|
|
||||||
|
} // end getCountry
|
||||||
|
|
||||||
|
public void setCountry(String c)
|
||||||
|
{
|
||||||
|
if ((c!=null) && (c.length()>2))
|
||||||
|
country = c.substring(0,2);
|
||||||
|
else
|
||||||
|
country = c;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setCountry
|
||||||
|
|
||||||
|
public String getPhone()
|
||||||
|
{
|
||||||
|
return phone;
|
||||||
|
|
||||||
|
} // end getPhone
|
||||||
|
|
||||||
|
public void setPhone(String num)
|
||||||
|
{
|
||||||
|
if ((num!=null) && (num.length()>32))
|
||||||
|
phone = num.substring(0,32);
|
||||||
|
else
|
||||||
|
phone = num;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPhone
|
||||||
|
|
||||||
|
public String getFax()
|
||||||
|
{
|
||||||
|
return fax;
|
||||||
|
|
||||||
|
} // end getFax
|
||||||
|
|
||||||
|
public void setFax(String num)
|
||||||
|
{
|
||||||
|
if ((num!=null) && (num.length()>32))
|
||||||
|
fax = num.substring(0,32);
|
||||||
|
else
|
||||||
|
fax = num;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setFax
|
||||||
|
|
||||||
|
public String getMobile()
|
||||||
|
{
|
||||||
|
return mobile;
|
||||||
|
|
||||||
|
} // end getMobile
|
||||||
|
|
||||||
|
public void setMobile(String num)
|
||||||
|
{
|
||||||
|
if ((num!=null) && (num.length()>32))
|
||||||
|
mobile = num.substring(0,32);
|
||||||
|
else
|
||||||
|
mobile = num;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setMobile
|
||||||
|
|
||||||
|
public String getEmail()
|
||||||
|
{
|
||||||
|
return email;
|
||||||
|
|
||||||
|
} // end getEmail
|
||||||
|
|
||||||
|
public void setEmail(String addr)
|
||||||
|
{
|
||||||
|
if ((addr!=null) && (addr.length()>255))
|
||||||
|
email = addr.substring(0,255);
|
||||||
|
else
|
||||||
|
email = addr;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setEmail
|
||||||
|
|
||||||
|
public String getPhotoURL()
|
||||||
|
{
|
||||||
|
return photo_url;
|
||||||
|
|
||||||
|
} // end getPhotoURL
|
||||||
|
|
||||||
|
public void setPhotoURL(String addr)
|
||||||
|
{
|
||||||
|
if ((addr!=null) && (addr.length()>255))
|
||||||
|
photo_url = addr.substring(0,255);
|
||||||
|
else
|
||||||
|
photo_url = addr;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPhotoURL
|
||||||
|
|
||||||
|
public String getURL()
|
||||||
|
{
|
||||||
|
return url;
|
||||||
|
|
||||||
|
} // end getURL
|
||||||
|
|
||||||
|
public void setURL(String addr)
|
||||||
|
{
|
||||||
|
if ((addr!=null) && (addr.length()>255))
|
||||||
|
url = addr.substring(0,255);
|
||||||
|
else
|
||||||
|
url = addr;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setURL
|
||||||
|
|
||||||
|
public boolean getPrivateAddress()
|
||||||
|
{
|
||||||
|
return private_addr;
|
||||||
|
|
||||||
|
} // end getPrivateAddress
|
||||||
|
|
||||||
|
public void setPrivateAddress(boolean flag)
|
||||||
|
{
|
||||||
|
private_addr = flag;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPrivateAddress
|
||||||
|
|
||||||
|
public boolean getPrivatePhone()
|
||||||
|
{
|
||||||
|
return private_phone;
|
||||||
|
|
||||||
|
} // end getPrivatePhone
|
||||||
|
|
||||||
|
public void setPrivatePhone(boolean flag)
|
||||||
|
{
|
||||||
|
private_phone = flag;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPrivatePhone
|
||||||
|
|
||||||
|
public boolean getPrivateFax()
|
||||||
|
{
|
||||||
|
return private_fax;
|
||||||
|
|
||||||
|
} // end getPrivateFax
|
||||||
|
|
||||||
|
public void setPrivateFax(boolean flag)
|
||||||
|
{
|
||||||
|
private_fax = flag;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPrivateFax
|
||||||
|
|
||||||
|
public boolean getPrivateEmail()
|
||||||
|
{
|
||||||
|
return private_email;
|
||||||
|
|
||||||
|
} // end getPrivateEmail
|
||||||
|
|
||||||
|
public void setPrivateEmail(boolean flag)
|
||||||
|
{
|
||||||
|
private_email = flag;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPrivateEmail
|
||||||
|
|
||||||
|
public int getOwnerUID()
|
||||||
|
{
|
||||||
|
return owner_uid;
|
||||||
|
|
||||||
|
} // end getOwnerUID
|
||||||
|
|
||||||
|
public int getOwnerSIGID()
|
||||||
|
{
|
||||||
|
return owner_sigid;
|
||||||
|
|
||||||
|
} // end getOwnerSIGID
|
||||||
|
|
||||||
|
public java.util.Date getLastUpdate()
|
||||||
|
{
|
||||||
|
return last_update;
|
||||||
|
|
||||||
|
} // end getLastUpdate
|
||||||
|
|
||||||
|
public boolean getModified()
|
||||||
|
{
|
||||||
|
return is_modified;
|
||||||
|
|
||||||
|
} // end getModified
|
||||||
|
|
||||||
|
public int getStashableUID()
|
||||||
|
{
|
||||||
|
return getOwnerUID();
|
||||||
|
|
||||||
|
} // end getStashableUID
|
||||||
|
|
||||||
|
public void stash(Connection conn) throws DataException, SQLException
|
||||||
|
{
|
||||||
|
java.util.Date update = null;
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer buf;
|
||||||
|
|
||||||
|
if (contactid>=0)
|
||||||
|
{ // this involves updating an existing record
|
||||||
|
buf = new StringBuffer("UPDATE contacts SET given_name = ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(given_name)).append(", family_name = ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(family_name)).append(", middle_init = ");
|
||||||
|
if (middle_initial==' ')
|
||||||
|
buf.append("NULL");
|
||||||
|
else
|
||||||
|
buf.append('\'').append(middle_initial).append('\'');
|
||||||
|
buf.append(", prefix = ").append(SQLUtil.encodeStringArg(prefix));
|
||||||
|
buf.append(", suffix = ").append(SQLUtil.encodeStringArg(suffix));
|
||||||
|
buf.append(", company = ").append(SQLUtil.encodeStringArg(company));
|
||||||
|
buf.append(", addr1 = ").append(SQLUtil.encodeStringArg(addr1));
|
||||||
|
buf.append(", addr2 = ").append(SQLUtil.encodeStringArg(addr2));
|
||||||
|
buf.append(", locality = ").append(SQLUtil.encodeStringArg(locality));
|
||||||
|
buf.append(", region = ").append(SQLUtil.encodeStringArg(region));
|
||||||
|
buf.append(", pcode = ").append(SQLUtil.encodeStringArg(postal_code));
|
||||||
|
buf.append(", country = ").append(SQLUtil.encodeStringArg(country));
|
||||||
|
buf.append(", phone = ").append(SQLUtil.encodeStringArg(phone));
|
||||||
|
buf.append(", fax = ").append(SQLUtil.encodeStringArg(fax));
|
||||||
|
buf.append(", mobile = ").append(SQLUtil.encodeStringArg(mobile));
|
||||||
|
buf.append(", email = ").append(SQLUtil.encodeStringArg(email));
|
||||||
|
buf.append(", pvt_addr = ").append(private_addr ? '1' : '0');
|
||||||
|
buf.append(", pvt_phone = ").append(private_phone ? '1' : '0');
|
||||||
|
buf.append(", pvt_fax = ").append(private_fax ? '1' : '0');
|
||||||
|
buf.append(", pvt_email = ").append(private_email ? '1' : '0');
|
||||||
|
buf.append(", photo_url = ").append(SQLUtil.encodeStringArg(photo_url));
|
||||||
|
buf.append(", url = ").append(SQLUtil.encodeStringArg(url)).append(", lastupdate = '");
|
||||||
|
update = new java.util.Date();
|
||||||
|
buf.append(SQLUtil.encodeDate(update)).append("' WHERE contactid = ").append(contactid).append(';');
|
||||||
|
|
||||||
|
stmt.executeUpdate(buf.toString());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // this involves creating a new record
|
||||||
|
if (owner_sigid>=0)
|
||||||
|
stmt.executeUpdate("LOCK TABLES contacts WRITE, sigs WRITE;");
|
||||||
|
else
|
||||||
|
stmt.executeUpdate("LOCK TABLES contacts WRITE, users WRITE;");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // insert contact record data
|
||||||
|
buf = new StringBuffer("INSERT INTO contacts (given_name, family_name, middle_init, prefix, "
|
||||||
|
+ "suffix, company, addr1, addr2, locality, region, pcode, country, "
|
||||||
|
+ "phone, fax, mobile, email, pvt_addr, pvt_phone, pvt_fax, pvt_email, "
|
||||||
|
+ "owner_uid, owner_sigid, photo_url, url, lastupdate) VALUES (");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(given_name)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(family_name)).append(", ");
|
||||||
|
if (middle_initial==' ')
|
||||||
|
buf.append("NULL, ");
|
||||||
|
else
|
||||||
|
buf.append('\'').append(middle_initial).append("', ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(prefix)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(suffix)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(company)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(addr1)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(addr2)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(locality)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(region)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(postal_code)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(country)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(phone)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(fax)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(mobile)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(email)).append(", ");
|
||||||
|
buf.append(private_addr ? '1' : '0').append(", ");
|
||||||
|
buf.append(private_phone ? '1' : '0').append(", ");
|
||||||
|
buf.append(private_fax ? '1' : '0').append(", ");
|
||||||
|
buf.append(private_email ? '1' : '0').append(", ");
|
||||||
|
buf.append(owner_uid).append(", ").append(owner_sigid).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(photo_url)).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(url)).append(", '");
|
||||||
|
update = new java.util.Date();
|
||||||
|
buf.append(SQLUtil.encodeDate(update)).append("');");
|
||||||
|
|
||||||
|
stmt.executeUpdate(buf.toString());
|
||||||
|
|
||||||
|
// now read back the contact ID we just added
|
||||||
|
int new_contactid;
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID() AS blort;");
|
||||||
|
if (rs.next())
|
||||||
|
new_contactid = rs.getInt("blort");
|
||||||
|
else
|
||||||
|
throw new DataException("unable to read back new contact ID");
|
||||||
|
|
||||||
|
// and patch the database table so we know what our contact ID is
|
||||||
|
buf.setLength(0);
|
||||||
|
if (owner_sigid>=0)
|
||||||
|
{ // update the SIGS table
|
||||||
|
buf.append("UPDATE sigs SET contactid = ").append(new_contactid).append(" WHERE sigid = ");
|
||||||
|
buf.append(owner_sigid).append(';');
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // update the USERS table
|
||||||
|
buf.append("UPDATE users SET contactid = ").append(new_contactid).append(" WHERE uid = ");
|
||||||
|
buf.append(owner_uid).append(';');
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
stmt.executeUpdate(buf.toString());
|
||||||
|
|
||||||
|
contactid = new_contactid; // save link
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure the tables get unlocked
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
last_update = update; // save last update date
|
||||||
|
is_modified = false;
|
||||||
|
|
||||||
|
} // end stash
|
||||||
|
|
||||||
|
} // end class ContactInfoImpl
|
69
src/com/silverwrist/venice/core/impl/EngineBackend.java
Normal file
69
src/com/silverwrist/venice/core/impl/EngineBackend.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.BitSet;
|
||||||
|
import java.util.List;
|
||||||
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
import com.silverwrist.venice.htmlcheck.HTMLChecker;
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface EngineBackend
|
||||||
|
{
|
||||||
|
public static final int HTMLC_POST_BODY = 0;
|
||||||
|
public static final int HTMLC_POST_PSEUD = 1;
|
||||||
|
public static final int HTMLC_PREVIEW_BODY = 2;
|
||||||
|
public static final int HTMLC_ESCAPE_BODY_PSEUD = 3;
|
||||||
|
|
||||||
|
public abstract SimpleEmailer createEmailer();
|
||||||
|
|
||||||
|
public abstract String getStockMessage(String key);
|
||||||
|
|
||||||
|
public abstract int getNewConfirmationNumber();
|
||||||
|
|
||||||
|
public abstract String getCountryNameForCode(String code);
|
||||||
|
|
||||||
|
public abstract String getLanguageNameForCode(String code);
|
||||||
|
|
||||||
|
public abstract SIGData getSIGDataObject(int sigid) throws DataException;
|
||||||
|
|
||||||
|
public abstract BitSet getLockedFeaturesMask();
|
||||||
|
|
||||||
|
public abstract List getSIGFeatureSet(BitSet enabled_features, int level, boolean read_privs);
|
||||||
|
|
||||||
|
public abstract String getAppletForFeature(int code);
|
||||||
|
|
||||||
|
public abstract boolean isValidInitialFeatureIndex(short ndx);
|
||||||
|
|
||||||
|
public abstract BitSet getDefaultFeaturesMask();
|
||||||
|
|
||||||
|
public abstract void registerNewSIG(SIGData sig);
|
||||||
|
|
||||||
|
public abstract int getFeatureIndexBySymbol(String symbol);
|
||||||
|
|
||||||
|
public abstract boolean canAccessFeature(String symbol, int level, boolean has_read);
|
||||||
|
|
||||||
|
public abstract ConferenceData getConferenceDataObject(int confid) throws DataException;
|
||||||
|
|
||||||
|
public abstract void saveAuditRecord(AuditRecord ar);
|
||||||
|
|
||||||
|
public abstract void registerNewConference(ConferenceData conf);
|
||||||
|
|
||||||
|
public abstract HTMLChecker createCheckerObject(int type);
|
||||||
|
|
||||||
|
} // end interface EngineBackend
|
|
@ -0,0 +1,273 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
|
||||||
|
class FrontPageViewConfigImpl implements FrontPageViewConfig, Stashable
|
||||||
|
{
|
||||||
|
private int my_uid;
|
||||||
|
private int num_cols;
|
||||||
|
private Vector v_parts = new Vector();
|
||||||
|
private Vector v_params = new Vector();
|
||||||
|
private boolean is_modified = false;
|
||||||
|
|
||||||
|
FrontPageViewConfigImpl(Connection conn, int uid, int max_cols) throws DataException, SQLException
|
||||||
|
{
|
||||||
|
my_uid = uid;
|
||||||
|
num_cols = max_cols;
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT row, col, partid, param FROM topconfig WHERE uid = ");
|
||||||
|
sql.append(uid).append(';');
|
||||||
|
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
while (rs.next())
|
||||||
|
{ // make sure the column is in range first
|
||||||
|
int col = rs.getInt("col");
|
||||||
|
if ((col>=0) && (col<num_cols))
|
||||||
|
{ // get the row and find out how far down we have to go in the vector
|
||||||
|
int row = rs.getInt("row");
|
||||||
|
if (row>=0)
|
||||||
|
{ // now look for the right arrays to store into
|
||||||
|
String[] a_part = null;
|
||||||
|
String[] a_param = null;
|
||||||
|
|
||||||
|
if (row>=v_parts.size())
|
||||||
|
{ // need to extend the vector contents
|
||||||
|
while (row>=v_parts.size())
|
||||||
|
{ // append new arrays onto the config
|
||||||
|
a_part = new String[num_cols];
|
||||||
|
a_param = new String[num_cols];
|
||||||
|
for (int i=0; i<num_cols; i++)
|
||||||
|
{ // nuke the new arrays
|
||||||
|
a_part[i] = null;
|
||||||
|
a_param[i] = null;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
v_parts.addElement(a_part);
|
||||||
|
v_params.addElement(a_param);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // just fetch the existing arrays
|
||||||
|
a_part = (String[])(v_parts.elementAt(row));
|
||||||
|
a_param = (String[])(v_params.elementAt(row));
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
// and now save off the recordset data
|
||||||
|
a_part[col] = rs.getString("partid");
|
||||||
|
a_param[col] = rs.getString("param");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public int getNumRows()
|
||||||
|
{
|
||||||
|
return v_parts.size();
|
||||||
|
|
||||||
|
} // end getNumRows
|
||||||
|
|
||||||
|
public int getNumColumns()
|
||||||
|
{
|
||||||
|
return num_cols;
|
||||||
|
|
||||||
|
} // end getNumCols
|
||||||
|
|
||||||
|
public String getPartID(int row, int column)
|
||||||
|
{
|
||||||
|
if ((row<0) || (row>=v_parts.size()))
|
||||||
|
throw new IndexOutOfBoundsException("invalid row specified to FrontPageViewConfig.getPartID");
|
||||||
|
if ((column<0) || (column>=num_cols))
|
||||||
|
throw new IndexOutOfBoundsException("invalid column specified to FrontPageViewConfig.getPartID");
|
||||||
|
|
||||||
|
String[] array = (String[])(v_parts.elementAt(row));
|
||||||
|
return array[column];
|
||||||
|
|
||||||
|
} // end getPartID
|
||||||
|
|
||||||
|
public void setPartID(int row, int column, String partid)
|
||||||
|
{
|
||||||
|
if (row<0)
|
||||||
|
throw new IndexOutOfBoundsException("invalid row specified to FrontPageViewConfig.setPartID");
|
||||||
|
if ((column<0) || (column>=num_cols))
|
||||||
|
throw new IndexOutOfBoundsException("invalid column specified to FrontPageViewConfig.setPartID");
|
||||||
|
|
||||||
|
String[] a_part = null;
|
||||||
|
String[] a_param = null;
|
||||||
|
|
||||||
|
if (row>=v_parts.size())
|
||||||
|
{ // need to extend the vector contents
|
||||||
|
while (row>=v_parts.size())
|
||||||
|
{ // append new arrays onto the config
|
||||||
|
a_part = new String[num_cols];
|
||||||
|
a_param = new String[num_cols];
|
||||||
|
for (int i=0; i<num_cols; i++)
|
||||||
|
{ // nuke the new arrays
|
||||||
|
a_part[i] = null;
|
||||||
|
a_param[i] = null;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
v_parts.addElement(a_part);
|
||||||
|
v_params.addElement(a_param);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // just fetch the existing array
|
||||||
|
a_part = (String[])(v_parts.elementAt(row));
|
||||||
|
|
||||||
|
a_part[column] = partid;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setPartID
|
||||||
|
|
||||||
|
public String getParameter(int row, int column)
|
||||||
|
{
|
||||||
|
if ((row<0) || (row>=v_params.size()))
|
||||||
|
throw new IndexOutOfBoundsException("invalid row specified to FrontPageViewConfig.getParameter");
|
||||||
|
if ((column<0) || (column>=num_cols))
|
||||||
|
throw new IndexOutOfBoundsException("invalid column specified to FrontPageViewConfig.getParameter");
|
||||||
|
|
||||||
|
String[] array = (String[])(v_params.elementAt(row));
|
||||||
|
return array[column];
|
||||||
|
|
||||||
|
} // end getParameter
|
||||||
|
|
||||||
|
public void setParameter(int row, int column, String param)
|
||||||
|
{
|
||||||
|
if (row<0)
|
||||||
|
throw new IndexOutOfBoundsException("invalid row specified to FrontPageViewConfig.setParameter");
|
||||||
|
if ((column<0) || (column>=num_cols))
|
||||||
|
throw new IndexOutOfBoundsException("invalid column specified to FrontPageViewConfig.setParameter");
|
||||||
|
|
||||||
|
String[] a_part = null;
|
||||||
|
String[] a_param = null;
|
||||||
|
|
||||||
|
if (row>=v_parts.size())
|
||||||
|
{ // need to extend the vector contents
|
||||||
|
while (row>=v_parts.size())
|
||||||
|
{ // append new arrays onto the config
|
||||||
|
a_part = new String[num_cols];
|
||||||
|
a_param = new String[num_cols];
|
||||||
|
for (int i=0; i<num_cols; i++)
|
||||||
|
{ // nuke the new arrays
|
||||||
|
a_part[i] = null;
|
||||||
|
a_param[i] = null;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
v_parts.addElement(a_part);
|
||||||
|
v_params.addElement(a_param);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // just fetch the existing array
|
||||||
|
a_param = (String[])(v_params.elementAt(row));
|
||||||
|
|
||||||
|
a_param[column] = param;
|
||||||
|
is_modified = true;
|
||||||
|
|
||||||
|
} // end setParameter
|
||||||
|
|
||||||
|
public boolean getModified()
|
||||||
|
{
|
||||||
|
return is_modified;
|
||||||
|
|
||||||
|
} // end getModified
|
||||||
|
|
||||||
|
public int getStashableUID()
|
||||||
|
{
|
||||||
|
return my_uid;
|
||||||
|
|
||||||
|
} // end getStashableUID
|
||||||
|
|
||||||
|
public void stash(Connection conn) throws SQLException
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int row=0; row<v_parts.size(); row++)
|
||||||
|
{ // retrieve the row arrays first
|
||||||
|
String[] a_part = (String[])(v_parts.elementAt(row));
|
||||||
|
String[] a_param = (String[])(v_params.elementAt(row));
|
||||||
|
|
||||||
|
for (int col=0; col<num_cols; col++)
|
||||||
|
{ // add to the list as long as the part isn't NULL
|
||||||
|
if (a_part[col]!=null)
|
||||||
|
{ // append this set of values to the INSERT we're going to make later
|
||||||
|
if (buf.length()==0)
|
||||||
|
buf.append("INSERT INTO topconfig (uid, row, col, partid, param) VALUES ");
|
||||||
|
else
|
||||||
|
buf.append(", ");
|
||||||
|
buf.append('(').append(my_uid).append(", ").append(row).append(", ").append(col).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(a_part[col])).append(", ");
|
||||||
|
buf.append(SQLUtil.encodeStringArg(a_param[col])).append(')');
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end for (each column)
|
||||||
|
|
||||||
|
} // end for (each row)
|
||||||
|
|
||||||
|
String insert_cmd = null;
|
||||||
|
if (buf.length()>0)
|
||||||
|
{ // we've got the insert command
|
||||||
|
buf.append(';');
|
||||||
|
insert_cmd = buf.toString();
|
||||||
|
buf.setLength(0);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// now create the DELETE command
|
||||||
|
buf.append("DELETE FROM topconfig WHERE uid = ").append(my_uid).append(';');
|
||||||
|
|
||||||
|
// we need to lock the topconfig table while we do this
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES topconfig WRITE;");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // delete all existing records
|
||||||
|
stmt.executeUpdate(buf.toString());
|
||||||
|
|
||||||
|
// now insert the new records
|
||||||
|
if (insert_cmd!=null)
|
||||||
|
stmt.executeUpdate(insert_cmd);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure to unlock the tables when we're done
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end stash
|
||||||
|
|
||||||
|
} // end class FrontPageViewConfigImpl
|
73
src/com/silverwrist/venice/core/impl/ReadOnlyVector.java
Normal file
73
src/com/silverwrist/venice/core/impl/ReadOnlyVector.java
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
class ReadOnlyVector extends AbstractList
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Vector my_vec; // local vector
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ReadOnlyVector(Vector vec)
|
||||||
|
{
|
||||||
|
my_vec = vec;
|
||||||
|
my_vec.trimToSize();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* finalize() method
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
my_vec = null;
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from superclass AbstractList
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Object get(int index)
|
||||||
|
{
|
||||||
|
return my_vec.elementAt(index);
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return my_vec.size();
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
} // end class ReadOnlyVector
|
||||||
|
|
28
src/com/silverwrist/venice/core/impl/ReferencedData.java
Normal file
28
src/com/silverwrist/venice/core/impl/ReferencedData.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
public interface ReferencedData
|
||||||
|
{
|
||||||
|
public abstract int rd_addRef();
|
||||||
|
|
||||||
|
public abstract int rd_release();
|
||||||
|
|
||||||
|
public abstract boolean rd_unreferenced();
|
||||||
|
|
||||||
|
} // end interface ReferencedData
|
59
src/com/silverwrist/venice/core/impl/ReturnConfSeq.java
Normal file
59
src/com/silverwrist/venice/core/impl/ReturnConfSeq.java
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
class ReturnConfSeq
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private ConferenceData conf;
|
||||||
|
private short sequence;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ReturnConfSeq(ConferenceData conf, short sequence)
|
||||||
|
{
|
||||||
|
this.conf = conf;
|
||||||
|
this.sequence = sequence;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations (usable only inside package)
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ConferenceData getConference()
|
||||||
|
{
|
||||||
|
return conf;
|
||||||
|
|
||||||
|
} // end getConference
|
||||||
|
|
||||||
|
short getSequence()
|
||||||
|
{
|
||||||
|
return sequence;
|
||||||
|
|
||||||
|
} // end getSequence
|
||||||
|
|
||||||
|
} // end class ReturnConfSeq
|
36
src/com/silverwrist/venice/core/impl/SIGBackend.java
Normal file
36
src/com/silverwrist/venice/core/impl/SIGBackend.java
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface SIGBackend extends UserBackend
|
||||||
|
{
|
||||||
|
public abstract int realSIGID();
|
||||||
|
|
||||||
|
public abstract boolean userHideHiddenConferences();
|
||||||
|
|
||||||
|
public abstract int realSIGLevel();
|
||||||
|
|
||||||
|
public abstract ConferenceSIGContext getConferenceDataObject(int confid) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean userCanCreateSubobjects();
|
||||||
|
|
||||||
|
public abstract String realSIGAlias();
|
||||||
|
|
||||||
|
} // end interface SIGBackend
|
1534
src/com/silverwrist/venice/core/impl/SIGCoreData.java
Normal file
1534
src/com/silverwrist/venice/core/impl/SIGCoreData.java
Normal file
File diff suppressed because it is too large
Load Diff
139
src/com/silverwrist/venice/core/impl/SIGData.java
Normal file
139
src/com/silverwrist/venice/core/impl/SIGData.java
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.BitSet;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import com.silverwrist.venice.core.AccessError;
|
||||||
|
import com.silverwrist.venice.core.ContactInfo;
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface SIGData extends ReferencedData
|
||||||
|
{
|
||||||
|
public abstract int getID();
|
||||||
|
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract String getAlias();
|
||||||
|
|
||||||
|
public abstract boolean isPublicSIG();
|
||||||
|
|
||||||
|
public abstract int getCategoryID();
|
||||||
|
|
||||||
|
public abstract String getSynopsis();
|
||||||
|
|
||||||
|
public abstract int getHostUID();
|
||||||
|
|
||||||
|
public abstract String getLanguage();
|
||||||
|
|
||||||
|
public abstract String getRules();
|
||||||
|
|
||||||
|
public abstract int getContactID();
|
||||||
|
|
||||||
|
public abstract Date getCreationDate();
|
||||||
|
|
||||||
|
public abstract Date getLastAccessDate();
|
||||||
|
|
||||||
|
public abstract Date getLastUpdateDate();
|
||||||
|
|
||||||
|
public abstract void testMembership(int level, boolean is_member) throws AccessError;
|
||||||
|
|
||||||
|
public abstract boolean checkMembership(int level, boolean is_member);
|
||||||
|
|
||||||
|
public abstract boolean canReadSIGSubObjects(int level);
|
||||||
|
|
||||||
|
public abstract boolean canModifySIGProfile(int level);
|
||||||
|
|
||||||
|
public abstract boolean canCreateSIGSubObjects(int level);
|
||||||
|
|
||||||
|
public abstract boolean canDeleteSIG(int level);
|
||||||
|
|
||||||
|
public abstract boolean canJoinSIG(int uid, int level);
|
||||||
|
|
||||||
|
public abstract void putContactInfo(UserBackend user, ContactInfo ci) throws DataException;
|
||||||
|
|
||||||
|
public abstract BitSet getFeatureSet();
|
||||||
|
|
||||||
|
public abstract void putFeatureSet(UserBackend user, BitSet set) throws DataException;
|
||||||
|
|
||||||
|
public abstract List getSIGFeaturesList(int level);
|
||||||
|
|
||||||
|
public abstract String getDefaultApplet();
|
||||||
|
|
||||||
|
public abstract void setName(UserBackend user, String name) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setAlias(UserBackend user, String alias) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setCategoryID(UserBackend user, int catid) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setSynopsis(String synopsis) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setLanguage(String language) throws DataException;
|
||||||
|
|
||||||
|
public abstract void setRules(String rules) throws DataException;
|
||||||
|
|
||||||
|
public abstract void touch() throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean getHideDirectory();
|
||||||
|
|
||||||
|
public abstract boolean getHideSearch();
|
||||||
|
|
||||||
|
public abstract void setHideFlags(UserBackend user, boolean directory, boolean search) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean getMembersOnly();
|
||||||
|
|
||||||
|
public abstract void setMembersOnly(UserBackend user, boolean flag) throws DataException;
|
||||||
|
|
||||||
|
public abstract short getInitialFeatureIndex();
|
||||||
|
|
||||||
|
public abstract void setInitialFeatureIndex(short ndx) throws DataException;
|
||||||
|
|
||||||
|
public abstract String getJoinKey() throws DataException;
|
||||||
|
|
||||||
|
public abstract void setJoinKey(UserBackend user, String key) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getReadLevel();
|
||||||
|
|
||||||
|
public abstract int getWriteLevel();
|
||||||
|
|
||||||
|
public abstract int getCreateLevel();
|
||||||
|
|
||||||
|
public abstract int getDeleteLevel();
|
||||||
|
|
||||||
|
public abstract int getJoinLevel();
|
||||||
|
|
||||||
|
public abstract void setSecurityLevels(UserBackend user, int read, int write, int create, int delete,
|
||||||
|
int join) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean isAdminSIG();
|
||||||
|
|
||||||
|
public abstract void setMembership(UserBackend user, int uid, int grant_level, boolean locked,
|
||||||
|
boolean hidden) throws DataException;
|
||||||
|
|
||||||
|
public abstract int getMemberCount(boolean include_hidden) throws DataException;
|
||||||
|
|
||||||
|
public abstract boolean isFeaturePresent(String symbol);
|
||||||
|
|
||||||
|
public abstract ConferenceSIGContext getConferenceDataObject(int confid) throws DataException;
|
||||||
|
|
||||||
|
public abstract ConferenceSIGContext createConference(SIGBackend sig, String name, String alias,
|
||||||
|
String description, boolean pvt, boolean hide_list)
|
||||||
|
throws DataException;
|
||||||
|
|
||||||
|
} // end interface SIGData
|
24
src/com/silverwrist/venice/core/impl/SIGDataBackend.java
Normal file
24
src/com/silverwrist/venice/core/impl/SIGDataBackend.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
public interface SIGDataBackend
|
||||||
|
{
|
||||||
|
public abstract int realSIGID();
|
||||||
|
|
||||||
|
} // end interface SIGDataBackend
|
1587
src/com/silverwrist/venice/core/impl/SIGUserContextImpl.java
Normal file
1587
src/com/silverwrist/venice/core/impl/SIGUserContextImpl.java
Normal file
File diff suppressed because it is too large
Load Diff
129
src/com/silverwrist/venice/core/impl/SimpleEmailer.java
Normal file
129
src/com/silverwrist/venice/core/impl/SimpleEmailer.java
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import javax.mail.*;
|
||||||
|
import javax.mail.internet.*;
|
||||||
|
import com.silverwrist.venice.core.EmailException;
|
||||||
|
import com.silverwrist.venice.core.InternalStateError;
|
||||||
|
|
||||||
|
class SimpleEmailer
|
||||||
|
{
|
||||||
|
private Session session; // the email session
|
||||||
|
private MimeMessage msg; // the message being composed
|
||||||
|
|
||||||
|
public SimpleEmailer(Properties props, javax.mail.Session session)
|
||||||
|
{
|
||||||
|
this.session = session;
|
||||||
|
msg = new MimeMessage(session);
|
||||||
|
try
|
||||||
|
{ // set the X-Mailer header
|
||||||
|
msg.setHeader("X-Mailer",(String)(props.get("com.silverwrist.venice.email.mailer")));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // do nothing - we don't really care about this too much
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // set the From address on the message
|
||||||
|
msg.setFrom(InternetAddress.getLocalAddress(session));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException me)
|
||||||
|
{ // this should be impossible
|
||||||
|
throw new InternalStateError("condition should not apply to message here",me);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public void setTo(String to) throws EmailException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // create an Internet address and set the recipient to it
|
||||||
|
InternetAddress[] address = { new InternetAddress(to) };
|
||||||
|
msg.setRecipients(Message.RecipientType.TO,address);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (AddressException e1)
|
||||||
|
{ // the address was somehow invalid
|
||||||
|
throw new EmailException("invalid email recipient address",e1);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (MessagingException e2)
|
||||||
|
{ // msg.setRecipients should NOT be throwing a MessageException here!
|
||||||
|
throw new InternalStateError("condition should not apply to message here",e2);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end setTo
|
||||||
|
|
||||||
|
public void setSubject(String subject)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // set the mail message subject
|
||||||
|
msg.setSubject(subject);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException e2)
|
||||||
|
{ // msg.setSubject should NOT be throwing a MessageException here!
|
||||||
|
throw new InternalStateError("condition should not apply to message here",e2);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end setSubject
|
||||||
|
|
||||||
|
public void setText(String text)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // set the mail message subject
|
||||||
|
msg.setText(text);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (MessagingException e2)
|
||||||
|
{ // msg.setText should NOT be throwing a MessageException here!
|
||||||
|
throw new InternalStateError("condition should not apply to message here",e2);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end setText
|
||||||
|
|
||||||
|
public void send() throws EmailException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // attempt to send the transport message
|
||||||
|
Transport.send(msg);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SendFailedException e1)
|
||||||
|
{ // convert this exception into an EmailException
|
||||||
|
throw new EmailException("send of the email message failed: " + e1.getMessage(),e1);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (MessagingException e2)
|
||||||
|
{ // msg.setText should NOT be throwing a MessageException here!
|
||||||
|
throw new InternalStateError("condition should not apply to message here",e2);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end send
|
||||||
|
|
||||||
|
} // end class SimpleEmailer
|
||||||
|
|
30
src/com/silverwrist/venice/core/impl/Stashable.java
Normal file
30
src/com/silverwrist/venice/core/impl/Stashable.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface Stashable
|
||||||
|
{
|
||||||
|
public abstract int getStashableUID();
|
||||||
|
|
||||||
|
public abstract void stash(Connection conn) throws DataException, SQLException;
|
||||||
|
|
||||||
|
} // end interface Stashable
|
785
src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java
Normal file
785
src/com/silverwrist/venice/core/impl/TopicUserContextImpl.java
Normal file
|
@ -0,0 +1,785 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
|
||||||
|
class TopicUserContextImpl implements TopicContext
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(TopicUserContextImpl.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private EngineBackend engine;
|
||||||
|
private ConferenceBackend conf;
|
||||||
|
private DataPool datapool;
|
||||||
|
private int topicid;
|
||||||
|
private short topicnum;
|
||||||
|
private int creator_uid;
|
||||||
|
private int top_message;
|
||||||
|
private boolean frozen;
|
||||||
|
private boolean archived;
|
||||||
|
private java.util.Date created;
|
||||||
|
private java.util.Date lastupdate;
|
||||||
|
private String name;
|
||||||
|
private boolean hidden;
|
||||||
|
private int unread;
|
||||||
|
private boolean deleted = false;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected TopicUserContextImpl(EngineBackend engine, ConferenceBackend conf, DataPool datapool, int topicid,
|
||||||
|
short topicnum, int creator_uid, int top_message, boolean frozen,
|
||||||
|
boolean archived, java.util.Date created, java.util.Date lastupdate,
|
||||||
|
String name, boolean hidden, int unread)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.conf = conf;
|
||||||
|
this.datapool = datapool;
|
||||||
|
this.topicid = topicid;
|
||||||
|
this.topicnum = topicnum;
|
||||||
|
this.creator_uid = creator_uid;
|
||||||
|
this.top_message = top_message;
|
||||||
|
this.frozen = frozen;
|
||||||
|
this.archived = archived;
|
||||||
|
this.created = created;
|
||||||
|
this.lastupdate = lastupdate;
|
||||||
|
this.name = name;
|
||||||
|
this.hidden = hidden;
|
||||||
|
this.unread = unread;
|
||||||
|
|
||||||
|
} // end TopicUserContextImpl
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static ResultSet queryByTopic(Statement stmt, int topicid, int uid) throws SQLException
|
||||||
|
{
|
||||||
|
StringBuffer sql =
|
||||||
|
new StringBuffer("SELECT t.topicid, t.num, t.creator_uid, t.top_message, t.frozen, t.archived, "
|
||||||
|
+ "t.createdate, t.lastupdate, t.name, IFNULL(s.hidden,0) AS hidden, "
|
||||||
|
+ "(t.top_message - IFNULL(s.last_message,-1)) AS unread FROM topics t "
|
||||||
|
+ "LEFT JOIN topicsettings s ON t.topicid = s.topicid AND s.uid = ");
|
||||||
|
sql.append(uid).append(" WHERE t.topicid = ").append(topicid).append(';');
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
return stmt.executeQuery(sql.toString());
|
||||||
|
|
||||||
|
} // end queryByTopic
|
||||||
|
|
||||||
|
private void makeDeleted()
|
||||||
|
{
|
||||||
|
top_message = -1;
|
||||||
|
frozen = false;
|
||||||
|
archived = false;
|
||||||
|
created = null;
|
||||||
|
lastupdate = null;
|
||||||
|
name = null;
|
||||||
|
hidden = false;
|
||||||
|
unread = -1;
|
||||||
|
deleted = true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementatuions from interface TopicContext
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void refresh() throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("refreshing topic ID " + String.valueOf(topicid));
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// perform a requery of the database
|
||||||
|
ResultSet rs = queryByTopic(stmt,topicid,conf.realUID());
|
||||||
|
if (rs.next())
|
||||||
|
{ // update the fields that are capable of changing
|
||||||
|
top_message = rs.getInt(4);
|
||||||
|
frozen = rs.getBoolean(5);
|
||||||
|
archived = rs.getBoolean(6);
|
||||||
|
lastupdate = SQLUtil.getFullDateTime(rs,8);
|
||||||
|
hidden = rs.getBoolean(10);
|
||||||
|
unread = rs.getInt(11);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // this topic must have been deleted - fsck it
|
||||||
|
makeDeleted();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading topic data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve topic information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end refresh
|
||||||
|
|
||||||
|
public int getTopicID()
|
||||||
|
{
|
||||||
|
return topicid;
|
||||||
|
|
||||||
|
} // end getTopicID
|
||||||
|
|
||||||
|
public short getTopicNumber()
|
||||||
|
{
|
||||||
|
return topicnum;
|
||||||
|
|
||||||
|
} // end getTopicNumber
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public int getUnreadMessages()
|
||||||
|
{
|
||||||
|
return unread;
|
||||||
|
|
||||||
|
} // end getUnreadMessages
|
||||||
|
|
||||||
|
public int getTotalMessages()
|
||||||
|
{
|
||||||
|
return top_message + 1;
|
||||||
|
|
||||||
|
} // end getTotalMessages
|
||||||
|
|
||||||
|
public java.util.Date getLastUpdateDate()
|
||||||
|
{
|
||||||
|
return lastupdate;
|
||||||
|
|
||||||
|
} // end getLastUpdateDate
|
||||||
|
|
||||||
|
public int getCreatorUID()
|
||||||
|
{
|
||||||
|
return creator_uid;
|
||||||
|
|
||||||
|
} // end getCreatorUID
|
||||||
|
|
||||||
|
public boolean isFrozen()
|
||||||
|
{
|
||||||
|
return frozen;
|
||||||
|
|
||||||
|
} // end isFrozen
|
||||||
|
|
||||||
|
public boolean isArchived()
|
||||||
|
{
|
||||||
|
return archived;
|
||||||
|
|
||||||
|
} // end isArchived
|
||||||
|
|
||||||
|
public java.util.Date getCreatedDate()
|
||||||
|
{
|
||||||
|
return created;
|
||||||
|
|
||||||
|
} // end getCreatedDate
|
||||||
|
|
||||||
|
public boolean isHidden()
|
||||||
|
{
|
||||||
|
return hidden;
|
||||||
|
|
||||||
|
} // end isHidden
|
||||||
|
|
||||||
|
public boolean isDeleted()
|
||||||
|
{
|
||||||
|
return deleted;
|
||||||
|
|
||||||
|
} // end isDeleted
|
||||||
|
|
||||||
|
public boolean canFreeze()
|
||||||
|
{
|
||||||
|
return conf.userCanHide();
|
||||||
|
|
||||||
|
} // end canFreeze
|
||||||
|
|
||||||
|
public boolean canArchive()
|
||||||
|
{
|
||||||
|
return conf.userCanHide();
|
||||||
|
|
||||||
|
} // end canArchive
|
||||||
|
|
||||||
|
public void setFrozen(boolean flag) throws DataException, AccessError
|
||||||
|
{
|
||||||
|
if ((frozen==flag) || deleted)
|
||||||
|
return; // no-op
|
||||||
|
if (!(conf.userCanHide()))
|
||||||
|
{ // you can't freeze the topic!
|
||||||
|
logger.error("user cannot change frozen status of topic");
|
||||||
|
throw new AccessError("You are not permitted to freeze or unfreeze this topic.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
AuditRecord ar = null; // audit record indicating success
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// create the SQL statement to freeze or unfreeze the topic
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE topics SET frozen = ");
|
||||||
|
sql.append(flag ? '1' : '0').append(" WHERE topicid = ").append(topicid).append(';');
|
||||||
|
if (stmt.executeUpdate(sql.toString())>0)
|
||||||
|
{ // success! save the flag and generate an audit record
|
||||||
|
frozen = flag;
|
||||||
|
ar = new AuditRecord(AuditRecord.TOPIC_FREEZE,conf.realUID(),conf.userRemoteAddress(),
|
||||||
|
conf.realSIGID(),"conf=" + String.valueOf(conf.realConfID()) + ",topic="
|
||||||
|
+ String.valueOf(topicid),flag ? "freeze" : "unfreeze");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // somebody else must have deleted this topic
|
||||||
|
makeDeleted();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error setting topic data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to set topic frozen status: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setFrozen
|
||||||
|
|
||||||
|
public void setArchived(boolean flag) throws DataException, AccessError
|
||||||
|
{
|
||||||
|
if ((archived==flag) || deleted)
|
||||||
|
return; // no-op
|
||||||
|
if (!(conf.userCanHide()))
|
||||||
|
{ // you can't archive the topic!
|
||||||
|
logger.error("user cannot change archived status of topic");
|
||||||
|
throw new AccessError("You are not permitted to archive or unarchive this topic.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
AuditRecord ar = null; // audit record indicating success
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// create the SQL statement to freeze or unfreeze the topic
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE topics SET archived = ");
|
||||||
|
sql.append(flag ? '1' : '0').append(" WHERE topicid = ").append(topicid).append(';');
|
||||||
|
if (stmt.executeUpdate(sql.toString())>0)
|
||||||
|
{ // success! save the flag and generate an audit record
|
||||||
|
archived = flag;
|
||||||
|
ar = new AuditRecord(AuditRecord.TOPIC_ARCHIVE,conf.realUID(),conf.userRemoteAddress(),
|
||||||
|
conf.realSIGID(),"conf=" + String.valueOf(conf.realConfID()) + ",topic="
|
||||||
|
+ String.valueOf(topicid),flag ? "archive" : "unarchive");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // somebody else must have deleted this topic
|
||||||
|
makeDeleted();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error setting topic data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to set topic archived status: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setArchived
|
||||||
|
|
||||||
|
public void setHidden(boolean flag) throws DataException
|
||||||
|
{
|
||||||
|
if ((hidden==flag) || deleted)
|
||||||
|
return; // no-op
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES topicsettings WRITE, topics READ;");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // start by trying to see if we can update topicsettings directly
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE topicsettings SET hidden = ");
|
||||||
|
sql.append(flag ? '1' : '0').append(" WHERE topicid = ").append(topicid).append(" AND uid = ");
|
||||||
|
sql.append(conf.realUID()).append(';');
|
||||||
|
if (stmt.executeUpdate(sql.toString())>0)
|
||||||
|
{ // that was all we needed - just save the flag and exit
|
||||||
|
hidden = flag;
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// OK, check: Is the topic still there?!?
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("SELECT topicid from topics WHERE topicid = ").append(topicid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
{ // the topic's been deleted - bail out
|
||||||
|
makeDeleted();
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// OK, just insert a new row into topicsettings, why dontcha...
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO topicsettings (topicid, uid, hidden) VALUES (").append(topicid).append(", ");
|
||||||
|
sql.append(conf.realUID()).append(", ").append(flag ? '1' : '0').append(");");
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
hidden = flag; // successful completion
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error setting topic data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to set topic hidden status: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setHidden
|
||||||
|
|
||||||
|
public int getFirstUnreadMessage()
|
||||||
|
{
|
||||||
|
if (unread==0)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return top_message - (unread - 1);
|
||||||
|
|
||||||
|
} // end getFirstUnreadMessage
|
||||||
|
|
||||||
|
public void setUnreadMessages(int count) throws DataException
|
||||||
|
{
|
||||||
|
if (count>(top_message+1)) // constrain count to [0, top_message+1]
|
||||||
|
count = top_message + 1;
|
||||||
|
else if (count<0)
|
||||||
|
count = 0;
|
||||||
|
if ((count==unread) || deleted)
|
||||||
|
return; // no-op
|
||||||
|
|
||||||
|
int last_msg = top_message - count;
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate("LOCK TABLES confsettings WRITE, topicsettings WRITE, topics READ;");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // start by trying to see if we can update topicsettings directly
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE topicsettings SET last_message = ");
|
||||||
|
sql.append(last_msg).append(" WHERE topicid = ").append(topicid).append(" AND uid = ");
|
||||||
|
sql.append(conf.realUID()).append(';');
|
||||||
|
if (stmt.executeUpdate(sql.toString())>0)
|
||||||
|
{ // that was all we needed - just save the flag and exit
|
||||||
|
conf.touchRead(conn);
|
||||||
|
unread = count;
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// OK, check: Is the topic still there?!?
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("SELECT topicid from topics WHERE topicid = ").append(topicid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
{ // the topic's been deleted - bail out
|
||||||
|
makeDeleted();
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// OK, just insert a new row into topicsettings, why dontcha...
|
||||||
|
sql.setLength(0);
|
||||||
|
sql.append("INSERT INTO topicsettings (topicid, uid, last_message) VALUES (").append(topicid);
|
||||||
|
sql.append(", ").append(conf.realUID()).append(", ").append(last_msg).append(");");
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
conf.touchRead(conn);
|
||||||
|
unread = count; // successful completion
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // unlock the tables before we go
|
||||||
|
Statement ulk_stmt = conn.createStatement();
|
||||||
|
ulk_stmt.executeUpdate("UNLOCK TABLES;");
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error setting topic data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to set topic hidden status: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setUnreadMessages
|
||||||
|
|
||||||
|
public void fixSeen() throws DataException
|
||||||
|
{
|
||||||
|
setUnreadMessages(0);
|
||||||
|
|
||||||
|
} // end fixSeen
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations usable only from within the package
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static List getTopicList(EngineBackend engine, ConferenceBackend conf, DataPool datapool, int get_option,
|
||||||
|
int sort_option) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("getTopicList for conf # " + String.valueOf(conf.realConfID()) + ", user #"
|
||||||
|
+ String.valueOf(conf.realUID()));
|
||||||
|
Vector rc = new Vector(); // return from this function
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// Figure out what the "where" clause of the SQL statement will be. This is in addition to a
|
||||||
|
// WHERE t.confid = (confid) that is always present. (Some of these WHERE specifiers refer to
|
||||||
|
// computed fields of the SELECT.)
|
||||||
|
String where_clause;
|
||||||
|
switch (get_option)
|
||||||
|
{
|
||||||
|
case ConferenceContext.GET_ALL:
|
||||||
|
where_clause = null; // no filtering options
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.DISPLAY_NEW:
|
||||||
|
where_clause = "hidden = 0 AND unread > 0"; // only non-hidden topics w/unread messages
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.DISPLAY_ACTIVE:
|
||||||
|
where_clause = "t.archived = 0 AND hidden = 0"; // only non-hidden, non-archived topics
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.DISPLAY_ALL:
|
||||||
|
where_clause = "t.archived = 0 AND hidden = 0"; // only non-hidden, non-archived topics
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.DISPLAY_HIDDEN:
|
||||||
|
where_clause = "hidden = 1"; // only hidden topics
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.DISPLAY_ARCHIVED:
|
||||||
|
where_clause = "t.archived = 1 AND hidden = 0"; // only non-hidden, archived topics
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.error("ACK! get_option (" + String.valueOf(get_option) + ") is bogus!");
|
||||||
|
throw new DataException("Invalid retrieval option specified.");
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
// Figure out what the "order by" clause of the SQL statement will be. In the case of
|
||||||
|
// DISPLAY_NEW mode, this will be in addition to an ordering clause that puts all topics
|
||||||
|
// with unread messages first.
|
||||||
|
boolean reverse = false;
|
||||||
|
int real_sort_option = sort_option;
|
||||||
|
if (sort_option<0)
|
||||||
|
{ // did we specify a "reverse" option?
|
||||||
|
reverse = true;
|
||||||
|
real_sort_option = -sort_option;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
String order_by_clause;
|
||||||
|
switch (real_sort_option)
|
||||||
|
{
|
||||||
|
case ConferenceContext.SORT_TOPICID:
|
||||||
|
// no reverse possible here
|
||||||
|
order_by_clause = "t.topicid ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.SORT_NUMBER:
|
||||||
|
if (reverse)
|
||||||
|
order_by_clause = "t.num DESC";
|
||||||
|
else
|
||||||
|
order_by_clause = "t.num ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.SORT_NAME:
|
||||||
|
if (reverse)
|
||||||
|
order_by_clause = "t.name DESC, t.num DESC";
|
||||||
|
else
|
||||||
|
order_by_clause = "t.name ASC, t.num ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.SORT_UNREAD:
|
||||||
|
if (reverse)
|
||||||
|
order_by_clause = "unread ASC, t.num DESC";
|
||||||
|
else
|
||||||
|
order_by_clause = "unread DESC, t.num ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.SORT_TOTAL:
|
||||||
|
if (reverse)
|
||||||
|
order_by_clause = "t.top_message ASC, t.num DESC";
|
||||||
|
else
|
||||||
|
order_by_clause = "t.top_message DESC, t.num ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConferenceContext.SORT_DATE:
|
||||||
|
if (reverse)
|
||||||
|
order_by_clause = "t.lastupdate ASC, t.num DESC";
|
||||||
|
else
|
||||||
|
order_by_clause = "t.lastupdate DESC, t.num ASC";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.error("ACK! sort_option (" + String.valueOf(sort_option) + ") is bogus!");
|
||||||
|
throw new DataException("Invalid sort option specified.");
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
// Build the huge SQL statement to feed to the database.
|
||||||
|
StringBuffer sql =
|
||||||
|
new StringBuffer("SELECT t.topicid, t.num, t.creator_uid, t.top_message, t.frozen, t.archived, "
|
||||||
|
+ "t.createdate, t.lastupdate, t.name, IFNULL(s.hidden,0) AS hidden, "
|
||||||
|
+ "(t.top_message - IFNULL(s.last_message,-1)) AS unread");
|
||||||
|
if (get_option==ConferenceContext.DISPLAY_ACTIVE)
|
||||||
|
sql.append(", SIGN(t.top_message - IFNULL(s.last_message,-1)) AS newflag");
|
||||||
|
sql.append(" FROM topics t LEFT JOIN topicsettings s ON t.topicid = s.topicid AND s.uid = ");
|
||||||
|
sql.append(conf.realUID()).append(" WHERE t.confid = ").append(conf.realConfID());
|
||||||
|
if (where_clause!=null)
|
||||||
|
sql.append(" AND ").append(where_clause);
|
||||||
|
sql.append(" ORDER BY ");
|
||||||
|
if (get_option==ConferenceContext.DISPLAY_ACTIVE)
|
||||||
|
sql.append("newflag DESC, ");
|
||||||
|
sql.append(order_by_clause).append(';');
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
|
||||||
|
// Now pass this query off to the database!
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
|
||||||
|
while (rs.next())
|
||||||
|
{ // create the returned objects and add them to the vector
|
||||||
|
TopicContext top =
|
||||||
|
new TopicUserContextImpl(engine,conf,datapool,rs.getInt(1),rs.getShort(2),rs.getInt(3),
|
||||||
|
rs.getInt(4),rs.getBoolean(5),rs.getBoolean(6),
|
||||||
|
SQLUtil.getFullDateTime(rs,7),SQLUtil.getFullDateTime(rs,8),
|
||||||
|
rs.getString(9),rs.getBoolean(10),rs.getInt(11));
|
||||||
|
rc.add(top);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading topic entries: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve topic information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return new ReadOnlyVector(rc);
|
||||||
|
|
||||||
|
} // end getTopicList
|
||||||
|
|
||||||
|
static TopicContext getTopicByID(EngineBackend engine, ConferenceBackend conf, DataPool datapool,
|
||||||
|
int topicid) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("getTopicByID for topic # " + String.valueOf(topicid) + ", user #"
|
||||||
|
+ String.valueOf(conf.realUID()));
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// Query the dtabase by topic ID.
|
||||||
|
ResultSet rs = queryByTopic(stmt,topicid,conf.realUID());
|
||||||
|
if (rs.next()) // found it!
|
||||||
|
return new TopicUserContextImpl(engine,conf,datapool,topicid,rs.getShort(2),rs.getInt(3),
|
||||||
|
rs.getInt(4),rs.getBoolean(5),rs.getBoolean(6),
|
||||||
|
SQLUtil.getFullDateTime(rs,7),SQLUtil.getFullDateTime(rs,8),
|
||||||
|
rs.getString(9),rs.getBoolean(10),rs.getInt(11));
|
||||||
|
// else fall out and return null
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading topic entries: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve topic information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return null; // default return
|
||||||
|
|
||||||
|
} // end getTopicByID
|
||||||
|
|
||||||
|
static TopicContext getTopicByNumber(EngineBackend engine, ConferenceBackend conf, DataPool datapool,
|
||||||
|
short topicnum) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("getTopicByNumber for topic # " + String.valueOf(topicnum) + ", conf # "
|
||||||
|
+ String.valueOf(conf.realConfID()) + ", user #" + String.valueOf(conf.realUID()));
|
||||||
|
|
||||||
|
Connection conn = null; // pooled database connection
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// Build the database query.
|
||||||
|
StringBuffer sql =
|
||||||
|
new StringBuffer("SELECT t.topicid, t.num, t.creator_uid, t.top_message, t.frozen, t.archived, "
|
||||||
|
+ "t.createdate, t.lastupdate, t.name, IFNULL(s.hidden,0) AS hidden, "
|
||||||
|
+ "(t.top_message - IFNULL(s.last_message,-1)) AS unread FROM topics t "
|
||||||
|
+ "LEFT JOIN topicsettings s ON t.topicid = s.topicid AND s.uid = ");
|
||||||
|
sql.append(conf.realUID()).append(" WHERE t.confid = ").append(conf.realConfID());
|
||||||
|
sql.append(" AND t.num = ").append(topicnum).append(';');
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("SQL: " + sql.toString());
|
||||||
|
|
||||||
|
// Now pass this query off to the database!
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next()) // found it!
|
||||||
|
return new TopicUserContextImpl(engine,conf,datapool,rs.getInt(1),topicnum,rs.getInt(3),
|
||||||
|
rs.getInt(4),rs.getBoolean(5),rs.getBoolean(6),
|
||||||
|
SQLUtil.getFullDateTime(rs,7),SQLUtil.getFullDateTime(rs,8),
|
||||||
|
rs.getString(9),rs.getBoolean(10),rs.getInt(11));
|
||||||
|
// else fall out and return null
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error reading topic entries: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve topic information: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure we release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
return null; // default return
|
||||||
|
|
||||||
|
} // end getTopicByNumber
|
||||||
|
|
||||||
|
} // end class TopicUserContextImpl
|
32
src/com/silverwrist/venice/core/impl/UserBackend.java
Normal file
32
src/com/silverwrist/venice/core/impl/UserBackend.java
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.core.DataException;
|
||||||
|
|
||||||
|
public interface UserBackend
|
||||||
|
{
|
||||||
|
public abstract int realUID();
|
||||||
|
|
||||||
|
public abstract int realBaseLevel();
|
||||||
|
|
||||||
|
public abstract String userRemoteAddress();
|
||||||
|
|
||||||
|
public abstract String userDefaultPseud() throws DataException;
|
||||||
|
|
||||||
|
} // end interface UserBackend
|
988
src/com/silverwrist/venice/core/impl/UserContextImpl.java
Normal file
988
src/com/silverwrist/venice/core/impl/UserContextImpl.java
Normal file
|
@ -0,0 +1,988 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.sql.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
|
import com.silverwrist.venice.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
import com.silverwrist.venice.security.PasswordHash;
|
||||||
|
import com.silverwrist.venice.security.Capability;
|
||||||
|
import com.silverwrist.venice.security.DefaultLevels;
|
||||||
|
import com.silverwrist.venice.security.AuditRecord;
|
||||||
|
|
||||||
|
class UserContextImpl implements UserContext, UserBackend
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(UserContextImpl.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private EngineBackend engine; // the back end of the engine
|
||||||
|
private DataPool datapool; // the data pool used by this object
|
||||||
|
private String remote_addr; // remote address identifier
|
||||||
|
private int uid = -1; // the user ID we're using
|
||||||
|
private int contactid; // ID of our contact information
|
||||||
|
private int level; // base security level for this user
|
||||||
|
private int confirm_num; // email confirmation number for this user
|
||||||
|
private boolean is_anon = false; // is this the anonymous user?
|
||||||
|
private boolean email_verified = false; // has email address been verified?
|
||||||
|
private String username; // the user name we're using
|
||||||
|
private java.util.Date created; // when was this user created? (GMT)
|
||||||
|
private java.util.Date last_access; // when did we last log in? (GMT)
|
||||||
|
private String description; // personal description
|
||||||
|
private String my_email = null; // my email address (cached)
|
||||||
|
private String my_pseud = null; // my pseud (cached)
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
UserContextImpl(EngineBackend engine, DataPool datapool)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.datapool = datapool;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* finalize() method
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void finalize()
|
||||||
|
{
|
||||||
|
engine = null;
|
||||||
|
datapool = null;
|
||||||
|
username = null;
|
||||||
|
created = null;
|
||||||
|
last_access = null;
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void loadUserData(ResultSet rs) throws SQLException
|
||||||
|
{
|
||||||
|
uid = rs.getInt("uid");
|
||||||
|
username = rs.getString("username");
|
||||||
|
// skip field "passhash"
|
||||||
|
contactid = rs.getInt("contactid");
|
||||||
|
is_anon = rs.getBoolean("is_anon");
|
||||||
|
email_verified = rs.getBoolean("verify_email");
|
||||||
|
// skip fields "lockout", "access_tries"
|
||||||
|
confirm_num = rs.getInt("email_confnum");
|
||||||
|
level = rs.getInt("base_lvl");
|
||||||
|
created = SQLUtil.getFullDateTime(rs,"created");
|
||||||
|
last_access = SQLUtil.getFullDateTime(rs,"lastaccess");
|
||||||
|
// skip field "passreminder"
|
||||||
|
description = rs.getString("description");
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
{ // spit it all out to debug info
|
||||||
|
logger.debug("Loaded: UID " + String.valueOf(uid) + ", username \"" + username + "\", contactid "
|
||||||
|
+ String.valueOf(contactid));
|
||||||
|
logger.debug("...is_anon " + String.valueOf(is_anon) + ", email_verified "
|
||||||
|
+ String.valueOf(email_verified));
|
||||||
|
logger.debug("... level " + String.valueOf(level));
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end loadUserData
|
||||||
|
|
||||||
|
private void sendEmailConfirmation() throws DataException, EmailException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("sendEmailConfirmation(): sending to \"" + my_email + "\"");
|
||||||
|
|
||||||
|
// Create the message to be sent.
|
||||||
|
String message = engine.getStockMessage("email-confirm");
|
||||||
|
if (message==null)
|
||||||
|
{ // no message defined? oy!
|
||||||
|
logger.error("internal error condition: email-confirm stock message not defined");
|
||||||
|
throw new DataException("INTERNAL: email-confirm message not defined");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
message = StringUtil.replaceAllInstances(message,"$USERNAME",username);
|
||||||
|
message = StringUtil.replaceAllInstances(message,"$CONFNUM",String.valueOf(confirm_num));
|
||||||
|
|
||||||
|
// Create the emailer and send the message.
|
||||||
|
SimpleEmailer emailer = engine.createEmailer();
|
||||||
|
emailer.setTo(my_email);
|
||||||
|
emailer.setSubject("Venice Email Confirmation");
|
||||||
|
emailer.setText(message);
|
||||||
|
emailer.send();
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...email sent!");
|
||||||
|
|
||||||
|
} // end sendEmailConfirmation
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface UserContext
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getUID()
|
||||||
|
{
|
||||||
|
return uid;
|
||||||
|
|
||||||
|
} // end getUID
|
||||||
|
|
||||||
|
public String getUserName()
|
||||||
|
{
|
||||||
|
return username;
|
||||||
|
|
||||||
|
} // end getUserName
|
||||||
|
|
||||||
|
public int getContactID()
|
||||||
|
{
|
||||||
|
return contactid;
|
||||||
|
|
||||||
|
} // end getContactID
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
public boolean isLoggedIn()
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("isLoggedIn(): uid = " + String.valueOf(uid) + ", is_anon = " + String.valueOf(is_anon));
|
||||||
|
return ((uid!=-1) && !is_anon);
|
||||||
|
|
||||||
|
} // end is_logged_in
|
||||||
|
|
||||||
|
public boolean isEmailVerified()
|
||||||
|
{
|
||||||
|
return email_verified;
|
||||||
|
|
||||||
|
} // end isEmailVerified
|
||||||
|
|
||||||
|
public void authenticate(String username, String password) throws AccessError, DataException
|
||||||
|
{
|
||||||
|
if (isLoggedIn())
|
||||||
|
{ // already authenticated, can't authenticate again
|
||||||
|
logger.error("UserContext already authenticated (with uid " + String.valueOf(uid) + ")");
|
||||||
|
throw new InternalStateError("context already authenticated");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("authenticate(): authenticating user \"" + username + "\"...");
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
AuditRecord ar = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // look for a user name matching this user record
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = '"
|
||||||
|
+ SQLUtil.encodeString(username) + "';");
|
||||||
|
|
||||||
|
if (!(rs.next()))
|
||||||
|
{ // user not found
|
||||||
|
logger.error("...user not found");
|
||||||
|
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,0,remote_addr,"Bad username: " + username);
|
||||||
|
throw new AccessError("The user account you have specified does not exist. Please try again.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
int the_uid = rs.getInt("uid");
|
||||||
|
|
||||||
|
if (rs.getBoolean("is_anon"))
|
||||||
|
{ // can't log in as Anonymous Honyak
|
||||||
|
logger.error("...user is the Anonymous Honyak, can't explicitly login");
|
||||||
|
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,the_uid,remote_addr,"Anonymous user");
|
||||||
|
throw new AccessError("This account cannot be explicitly logged into. Please try again.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (rs.getBoolean("lockout"))
|
||||||
|
{ // account locked out
|
||||||
|
logger.error("...user is locked out by the Admin");
|
||||||
|
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,the_uid,remote_addr,"Account locked out");
|
||||||
|
throw new AccessError("This account has been administratively locked out. Please contact "
|
||||||
|
+ "the system administrator for assistance.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// hash the password and compare it to the stored password hash
|
||||||
|
PasswordHash phash = new PasswordHash(password);
|
||||||
|
if (!(phash.equals(rs.getString("passhash"))))
|
||||||
|
{ // they specified an incorrect password
|
||||||
|
// TODO: advance an "invalid" counter and lock the account out if more than X tries
|
||||||
|
logger.warn("...invalid password");
|
||||||
|
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,the_uid,remote_addr,"Bad password");
|
||||||
|
throw new AccessError("The password you have specified is incorrect. Please try again.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...authenticated");
|
||||||
|
|
||||||
|
// we're authenticated - load the user data into the context
|
||||||
|
loadUserData(rs);
|
||||||
|
|
||||||
|
// update the "last access" time in the database
|
||||||
|
java.util.Date mydate = new java.util.Date();
|
||||||
|
stmt.executeUpdate("UPDATE users SET lastaccess = '" + SQLUtil.encodeDate(mydate)
|
||||||
|
+ "' WHERE uid = " + uid + ";");
|
||||||
|
|
||||||
|
// update the "last access" time in this object
|
||||||
|
last_access = mydate;
|
||||||
|
|
||||||
|
// an audit record indicating we logged in OK
|
||||||
|
ar = new AuditRecord(AuditRecord.LOGIN_OK,the_uid,remote_addr);
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...context loaded, we're ready :-)");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error reading user data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to access user data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end authenticate
|
||||||
|
|
||||||
|
public void confirmEmail(int conf_num) throws AccessError, DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("confirmEmail(): confirming for UID " + String.valueOf(uid));
|
||||||
|
if ((email_verified) || Capability.exemptFromEmailVerification(level))
|
||||||
|
{ // already confirmed
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...user has either already confirmed or is exempt");
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
AuditRecord ar = null;
|
||||||
|
|
||||||
|
if (conf_num!=confirm_num)
|
||||||
|
{ // the confirmation number is wrong
|
||||||
|
logger.warn("...confirmation number incorrect");
|
||||||
|
ar = new AuditRecord(AuditRecord.VERIFY_FAIL,uid,remote_addr,"Invalid confirmation number");
|
||||||
|
engine.saveAuditRecord(ar);
|
||||||
|
throw new AccessError("Confirmation number is incorrect. Please try again.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a connection and set the user's status to reflect the verification
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 1, base_lvl = ");
|
||||||
|
sql.append(DefaultLevels.afterEmailVerification()).append(" WHERE uid = ").append(uid).append(';');
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
email_verified = true;
|
||||||
|
level = DefaultLevels.afterEmailVerification();
|
||||||
|
|
||||||
|
// record an audit message indicating that we verified OK
|
||||||
|
ar = new AuditRecord(AuditRecord.VERIFY_OK,uid,remote_addr);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error updating user data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to update user data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end confirmEmail
|
||||||
|
|
||||||
|
public void resendEmailConfirmation() throws DataException, EmailException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("resendEmailConfirmation(): resending for UID " + String.valueOf(uid));
|
||||||
|
if ((email_verified) || Capability.exemptFromEmailVerification(level))
|
||||||
|
{ // already confirmed, no need to resend
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...user has either already confirmed or is exempt");
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (my_email==null)
|
||||||
|
getContactInfo(); // forces my_email to be updated
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
AuditRecord ar = null;
|
||||||
|
try
|
||||||
|
{ // need to change the user's email confirmation number first
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
|
||||||
|
// generate new confirmation number
|
||||||
|
int new_confirm_num = engine.getNewConfirmationNumber();
|
||||||
|
|
||||||
|
// create an SQL statement to reset the user account information, and execute it
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE users SET email_confnum = ");
|
||||||
|
sql.append(new_confirm_num).append(" WHERE uid = ").append(uid).append(';');
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
confirm_num = new_confirm_num; // save changed value
|
||||||
|
|
||||||
|
// now send the email confirmation!
|
||||||
|
sendEmailConfirmation();
|
||||||
|
|
||||||
|
// log that a resend was performed...
|
||||||
|
ar = new AuditRecord(AuditRecord.RESEND_CONFIRM,uid,remote_addr);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error updating user data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to update user data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end resendEmailConfirmation
|
||||||
|
|
||||||
|
public ContactInfo getContactInfo() throws DataException
|
||||||
|
{
|
||||||
|
ContactInfoImpl rc;
|
||||||
|
if (contactid>=0)
|
||||||
|
rc = new ContactInfoImpl(datapool,contactid);
|
||||||
|
else
|
||||||
|
rc = new ContactInfoImpl(uid);
|
||||||
|
if (my_email==null)
|
||||||
|
my_email = rc.getEmail();
|
||||||
|
if (my_pseud==null)
|
||||||
|
my_pseud = rc.getGivenName() + " " + rc.getFamilyName();
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end getContactInfo
|
||||||
|
|
||||||
|
public boolean putContactInfo(ContactInfo ci) throws DataException, EmailException
|
||||||
|
{
|
||||||
|
boolean email_changed = false;
|
||||||
|
if ((ci.getOwnerUID()!=uid) || (ci.getOwnerSIGID()>=0))
|
||||||
|
{ // the contact information is not owned correctly
|
||||||
|
logger.error("ContactInfo ownership wrong (it's " + String.valueOf(ci.getOwnerUID()) + ", "
|
||||||
|
+ String.valueOf(ci.getOwnerSIGID()) + "), should be (" + String.valueOf(uid) + ", -1)");
|
||||||
|
throw new DataException("invalid contact information record");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (is_anon)
|
||||||
|
{ // we can't change Anonymous Honyak this way!
|
||||||
|
logger.error("cannot modify anonymous user contact info");
|
||||||
|
throw new DataException("unmodifiable contact information");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null; // database connection
|
||||||
|
AuditRecord ar = null; // audit record
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Stashable obj = (Stashable)ci;
|
||||||
|
|
||||||
|
// save the contact information
|
||||||
|
obj.stash(conn);
|
||||||
|
|
||||||
|
if (contactid<0)
|
||||||
|
{ // contact being established for the first time
|
||||||
|
contactid = ci.getContactID();
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...established initial contact (" + String.valueOf(contactid) + ") for user");
|
||||||
|
my_email = ci.getEmail();
|
||||||
|
sendEmailConfirmation();
|
||||||
|
email_changed = true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
my_pseud = ci.getGivenName() + " " + ci.getFamilyName(); // update this field
|
||||||
|
|
||||||
|
if (my_email==null) // filling in, this is not necessarily the first time
|
||||||
|
my_email = ci.getEmail();
|
||||||
|
else if (!(my_email.equals(ci.getEmail())) && !Capability.exemptFromEmailVerification(level))
|
||||||
|
{ // email address change - need to reconfirm - but choose a new confirmation
|
||||||
|
// number and save it in the database first; also turn off the verify flag
|
||||||
|
// and set the base level to GLOBAL_UNVERIFIED
|
||||||
|
// NOTE: Administrators are exempt from this requirement!
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("email address changed, need to reconfirm");
|
||||||
|
|
||||||
|
// generate new confirmation number
|
||||||
|
int new_confirm_num = engine.getNewConfirmationNumber();
|
||||||
|
|
||||||
|
// create an SQL statement to reset the user account information, and execute it
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 0, email_confnum = ");
|
||||||
|
sql.append(new_confirm_num).append(", base_lvl = ").append(DefaultLevels.afterEmailAddressChange());
|
||||||
|
sql.append(" WHERE uid = ").append(uid).append(';');
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// save off changed data
|
||||||
|
email_verified = false;
|
||||||
|
confirm_num = new_confirm_num;
|
||||||
|
level = DefaultLevels.afterEmailAddressChange();
|
||||||
|
|
||||||
|
// now send the email confirmation!
|
||||||
|
sendEmailConfirmation();
|
||||||
|
|
||||||
|
email_changed = true;
|
||||||
|
|
||||||
|
} // end else if
|
||||||
|
|
||||||
|
ar = new AuditRecord(AuditRecord.USER_CONTACT_INFO,uid,remote_addr,
|
||||||
|
"contactid=" + String.valueOf(contactid));
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassCastException cce)
|
||||||
|
{ // we need to be able to coerce the ContactInfo to a Stashable
|
||||||
|
logger.error("ContactInfo needs to be a Stashable for this to work");
|
||||||
|
throw new DataException("improper contact information record");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("DB error updating contact info: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to access user contact data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return email_changed;
|
||||||
|
|
||||||
|
} // end putContactInfo
|
||||||
|
|
||||||
|
public UserProfile getProfile(String xusername) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("getProfile(\"" + xusername + "\")...");
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
UserProfileImpl prof = new UserProfileImpl(engine,conn,xusername,
|
||||||
|
Capability.canSeeHiddenContactFields(level));
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...found it!");
|
||||||
|
return prof;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error looking up profile information: " + e.getMessage(),e);
|
||||||
|
throw new DataException("Unable to look up user info: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getProfile
|
||||||
|
|
||||||
|
public UserProfile getProfile(int xuid) throws DataException
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("getProfile(#" + String.valueOf(xuid) + ")...");
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
UserProfileImpl prof = new UserProfileImpl(engine,conn,xuid,Capability.canSeeHiddenContactFields(level));
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...found it!");
|
||||||
|
return prof;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error looking up profile information: " + e.getMessage(),e);
|
||||||
|
throw new DataException("Unable to look up user info: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getProfile
|
||||||
|
|
||||||
|
public void setPassword(String password, String reminder) throws DataException
|
||||||
|
{
|
||||||
|
if (is_anon)
|
||||||
|
{ // trying to change Anonymous Honyak's (nonexistent) password?
|
||||||
|
logger.error("cannot change password of anonymous account");
|
||||||
|
throw new DataException("The anonymous account cannot change its password.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
AuditRecord ar = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
PasswordHash phash = new PasswordHash(password);
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE users SET passhash = '");
|
||||||
|
sql.append(phash.toString()).append("', passreminder = '").append(SQLUtil.encodeString(reminder));
|
||||||
|
sql.append("' WHERE uid = ").append(uid).append(';');
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
// record an audit record for this user
|
||||||
|
ar = new AuditRecord(AuditRecord.PASSWORD_CHANGE,uid,remote_addr);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error changing password: " + e.getMessage(),e);
|
||||||
|
throw new DataException("Unable to set user password: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
try
|
||||||
|
{ // save off the audit record before we go, though
|
||||||
|
if ((ar!=null) && (conn!=null))
|
||||||
|
ar.store(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // we couldn't store the audit record!
|
||||||
|
logger.error("DB error saving audit record: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setPassword
|
||||||
|
|
||||||
|
public void setDescription(String new_descr) throws DataException
|
||||||
|
{
|
||||||
|
if (is_anon)
|
||||||
|
{ // trying to change Anonymous Honyak's (nonexistent) description?
|
||||||
|
logger.error("cannot change description of anonymous account");
|
||||||
|
throw new DataException("The anonymous account cannot change its description.");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("UPDATE users SET description = '");
|
||||||
|
sql.append(SQLUtil.encodeString(new_descr)).append("' WHERE uid = ").append(uid).append(';');
|
||||||
|
stmt.executeUpdate(sql.toString());
|
||||||
|
|
||||||
|
description = new_descr; // change stored information
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error changing description: " + e.getMessage(),e);
|
||||||
|
throw new DataException("Unable to set user description: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end setDescription
|
||||||
|
|
||||||
|
public FrontPageViewConfig getFrontPageViewConfig(int max_cols) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// create new object
|
||||||
|
return new FrontPageViewConfigImpl(conn,uid,max_cols);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error getting front page view config: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to retrieve front page view config: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end getFrontPageViewConfig
|
||||||
|
|
||||||
|
public void putFrontPageViewConfig(FrontPageViewConfig cfg) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // coerce the value to a Stashable first
|
||||||
|
Stashable obj = (Stashable)cfg;
|
||||||
|
if (obj.getStashableUID()!=uid)
|
||||||
|
{ // wrong UID for configuration - this is bogus
|
||||||
|
logger.error("invalid ownership of FrontPageViewConfig (was "
|
||||||
|
+ String.valueOf(obj.getStashableUID()) + ", should be " + String.valueOf(uid) + ")");
|
||||||
|
throw new DataException("invalid front page view config record");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
|
||||||
|
// stash the object
|
||||||
|
obj.stash(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassCastException cce)
|
||||||
|
{ // we need to be able to coerce the FrontPageViewConfig to a Stashable
|
||||||
|
logger.error("FrontPageViewConfig was not a Stashable");
|
||||||
|
throw new DataException("improper front page view config record");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // turn SQLException into data exception
|
||||||
|
logger.error("DB error saving front page view config: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to save front page view config: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end putFrontPageViewConfig
|
||||||
|
|
||||||
|
public List getMemberSIGs() throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getMemberSIGEntries(engine,this,datapool);
|
||||||
|
|
||||||
|
} // end getMemberSIGs
|
||||||
|
|
||||||
|
public SIGContext getSIGContext(int sigid) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getSIGContext(engine,this,datapool,sigid);
|
||||||
|
|
||||||
|
} // end getSIGContext
|
||||||
|
|
||||||
|
public SIGContext getSIGContext(String alias) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getSIGContext(engine,this,datapool,alias);
|
||||||
|
|
||||||
|
} // end getSIGContext
|
||||||
|
|
||||||
|
public List getRootCategoryList() throws DataException
|
||||||
|
{
|
||||||
|
return CategoryDescriptorImpl.getTopLevelCategoryList(datapool,Capability.hideHiddenCategories(level));
|
||||||
|
|
||||||
|
} // end getRootCategoryList
|
||||||
|
|
||||||
|
public CategoryDescriptor getCategoryDescriptor(int catid) throws DataException
|
||||||
|
{
|
||||||
|
return new CategoryDescriptorImpl(datapool,catid,Capability.hideHiddenCategories(level));
|
||||||
|
|
||||||
|
} // end getCategoryDescriptor
|
||||||
|
|
||||||
|
public List searchForSIGs(int field, int mode, String term, int offset, int count) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.searchForSIGs(engine,this,datapool,field,mode,term,offset,count);
|
||||||
|
|
||||||
|
} // end searchForSIGs
|
||||||
|
|
||||||
|
public int getSearchSIGCount(int field, int mode, String term) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getSearchSIGCount(this,datapool,field,mode,term);
|
||||||
|
|
||||||
|
} // end getSearchSIGCount
|
||||||
|
|
||||||
|
public List getSIGsInCategory(int catid, int offset, int count) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getSIGsInCategory(engine,this,datapool,catid,offset,count);
|
||||||
|
|
||||||
|
} // end getSIGsInCategory
|
||||||
|
|
||||||
|
public List getSIGsInCategory(CategoryDescriptor cat, int offset, int count) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getSIGsInCategory(engine,this,datapool,cat.getLinkedCategoryID(),offset,count);
|
||||||
|
|
||||||
|
} // end getSIGsInCategory
|
||||||
|
|
||||||
|
public int getNumSIGsInCategory(int catid) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getNumSIGsInCategory(this,datapool,catid);
|
||||||
|
|
||||||
|
} // end getNumSIGsInCategory
|
||||||
|
|
||||||
|
public int getNumSIGsInCategory(CategoryDescriptor cat) throws DataException
|
||||||
|
{
|
||||||
|
return SIGUserContextImpl.getNumSIGsInCategory(this,datapool,cat.getLinkedCategoryID());
|
||||||
|
|
||||||
|
} // end getNumSIGsInCategory
|
||||||
|
|
||||||
|
public List searchForCategories(int mode, String term, int offset, int count) throws DataException
|
||||||
|
{
|
||||||
|
return CategoryDescriptorImpl.searchForCategories(datapool,Capability.hideHiddenCategories(level),
|
||||||
|
Capability.showHiddenSearchCategories(level),mode,
|
||||||
|
term,offset,count);
|
||||||
|
|
||||||
|
} // end searchForCategories
|
||||||
|
|
||||||
|
public int getSearchCategoryCount(int mode, String term) throws DataException
|
||||||
|
{
|
||||||
|
return CategoryDescriptorImpl.getSearchCategoryCount(datapool,Capability.hideHiddenCategories(level),
|
||||||
|
Capability.showHiddenSearchCategories(level),
|
||||||
|
mode,term);
|
||||||
|
|
||||||
|
} // end getSearchCategoryCount
|
||||||
|
|
||||||
|
public SIGContext createSIG(String name, String alias, String language, String synopsis, String rules,
|
||||||
|
String joinkey, int hide_mode) throws DataException, AccessError
|
||||||
|
{
|
||||||
|
if (!(Capability.canCreateSIG(level)))
|
||||||
|
throw new AccessError("You are not authorized to create new SIGs.");
|
||||||
|
|
||||||
|
// Convert the "hide mode" value int othe two hide flags.
|
||||||
|
boolean hide_dir = (hide_mode!=SIGContext.HIDE_NONE);
|
||||||
|
boolean hide_search = (hide_mode==SIGContext.HIDE_BOTH);
|
||||||
|
|
||||||
|
// Create the new SIG's database entries and internal data.
|
||||||
|
SIGData new_sig = SIGCoreData.createSIG(engine,this,datapool,name,alias,uid,language,synopsis,rules,
|
||||||
|
joinkey,hide_dir,hide_search);
|
||||||
|
|
||||||
|
// Create the SIG context we return to the user.
|
||||||
|
SIGContext rc = new SIGUserContextImpl(engine,this,datapool,new_sig);
|
||||||
|
|
||||||
|
new_sig.rd_release(); // release the extra reference we have on SIGData
|
||||||
|
|
||||||
|
// And that's it! You expected lightning bolts maybe? :-)
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end createSIG
|
||||||
|
|
||||||
|
public boolean canCreateSIG()
|
||||||
|
{
|
||||||
|
return Capability.canCreateSIG(level);
|
||||||
|
|
||||||
|
} // end canCreateSIG
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface UserBackend
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int realUID()
|
||||||
|
{
|
||||||
|
return uid;
|
||||||
|
|
||||||
|
} // end realUID
|
||||||
|
|
||||||
|
public int realBaseLevel()
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
|
||||||
|
} // end realBaseLevel
|
||||||
|
|
||||||
|
public String userRemoteAddress()
|
||||||
|
{
|
||||||
|
return remote_addr;
|
||||||
|
|
||||||
|
} // end userRemoteAddress
|
||||||
|
|
||||||
|
public String userDefaultPseud() throws DataException
|
||||||
|
{
|
||||||
|
if (my_pseud==null)
|
||||||
|
getContactInfo();
|
||||||
|
return my_pseud;
|
||||||
|
|
||||||
|
} // end userDefaultPseud
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Operations private to implementation package
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void loadAnonymous(String remote_addr) throws DataException
|
||||||
|
{
|
||||||
|
Connection conn = null;
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("loadAnonymous() on UserContext: addr " + remote_addr);
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve a connection from the data pool
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE is_anon = 1;");
|
||||||
|
if (!(rs.next()))
|
||||||
|
{ // could not find the anonymous user - this is an internal error
|
||||||
|
logger.error("WTF? anonymous user not found?!?");
|
||||||
|
throw new DataException("INTERNAL ERROR - cannot find anonymous user");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
loadUserData(rs); // load the data for Anonymous Honyak
|
||||||
|
|
||||||
|
this.remote_addr = remote_addr;
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error - this is a DataException
|
||||||
|
logger.error("error loading anonymous user data: " + e.getMessage(),e);
|
||||||
|
throw new DataException("unable to access user data: " + e.getMessage(),e);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure the connection is released before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end loadAnonymous
|
||||||
|
|
||||||
|
void loadNewUser(String remote_addr, int uid, int level, String username, int confirm_num,
|
||||||
|
java.util.Date created, java.util.Date last_access)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("loadNewUser() on UserContext: addr " + remote_addr + ", uid " + String.valueOf(uid)
|
||||||
|
+ ", level " + String.valueOf(level) + ", username \"" + username + "\"");
|
||||||
|
|
||||||
|
this.remote_addr = remote_addr;
|
||||||
|
this.uid = uid;
|
||||||
|
this.contactid = -1;
|
||||||
|
this.level = level;
|
||||||
|
this.username = username;
|
||||||
|
this.confirm_num = confirm_num;
|
||||||
|
this.created = created;
|
||||||
|
this.last_access = last_access;
|
||||||
|
|
||||||
|
} // end loadNewUser
|
||||||
|
|
||||||
|
} // end class UserContextImpl
|
132
src/com/silverwrist/venice/core/impl/UserFoundImpl.java
Normal file
132
src/com/silverwrist/venice/core/impl/UserFoundImpl.java
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
|
||||||
|
class UserFoundImpl implements UserFound
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private int uid;
|
||||||
|
private String name;
|
||||||
|
private String description;
|
||||||
|
private String given_name;
|
||||||
|
private String family_name;
|
||||||
|
private String locality;
|
||||||
|
private String region;
|
||||||
|
private String country;
|
||||||
|
private int level = -1;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
UserFoundImpl(int uid, String name, String description, String given_name, String family_name,
|
||||||
|
String locality, String region, String country)
|
||||||
|
{
|
||||||
|
this.uid = uid;
|
||||||
|
this.name = name;
|
||||||
|
this.description = description;
|
||||||
|
this.given_name = given_name;
|
||||||
|
this.family_name = family_name;
|
||||||
|
this.locality = locality;
|
||||||
|
this.region = region;
|
||||||
|
this.country = country;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
UserFoundImpl(int uid, String name, String description, String given_name, String family_name,
|
||||||
|
String locality, String region, String country, int level)
|
||||||
|
{
|
||||||
|
this.uid = uid;
|
||||||
|
this.name = name;
|
||||||
|
this.description = description;
|
||||||
|
this.given_name = given_name;
|
||||||
|
this.family_name = family_name;
|
||||||
|
this.locality = locality;
|
||||||
|
this.region = region;
|
||||||
|
this.country = country;
|
||||||
|
this.level = level;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface UserFound
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getUID()
|
||||||
|
{
|
||||||
|
return uid;
|
||||||
|
|
||||||
|
} // end getUID
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
public String getGivenName()
|
||||||
|
{
|
||||||
|
return given_name;
|
||||||
|
|
||||||
|
} // end getGivenName
|
||||||
|
|
||||||
|
public String getFamilyName()
|
||||||
|
{
|
||||||
|
return family_name;
|
||||||
|
|
||||||
|
} // end getFamilyName
|
||||||
|
|
||||||
|
public String getLocality()
|
||||||
|
{
|
||||||
|
return locality;
|
||||||
|
|
||||||
|
} // end getLocality
|
||||||
|
|
||||||
|
public String getRegion()
|
||||||
|
{
|
||||||
|
return region;
|
||||||
|
|
||||||
|
} // end getRegion
|
||||||
|
|
||||||
|
public String getCountry()
|
||||||
|
{
|
||||||
|
return country;
|
||||||
|
|
||||||
|
} // end getCountry
|
||||||
|
|
||||||
|
public int getLevel()
|
||||||
|
{
|
||||||
|
return level;
|
||||||
|
|
||||||
|
} // end getLevel
|
||||||
|
|
||||||
|
} // end class UserFoundImpl
|
347
src/com/silverwrist/venice/core/impl/UserProfileImpl.java
Normal file
347
src/com/silverwrist/venice/core/impl/UserProfileImpl.java
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.core.impl;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.db.*;
|
||||||
|
|
||||||
|
class UserProfileImpl implements UserProfile
|
||||||
|
{
|
||||||
|
private EngineBackend engine; // the engine back end
|
||||||
|
private int uid; // user ID
|
||||||
|
private String username; // user name
|
||||||
|
private String given_name; // given name ("first name")
|
||||||
|
private String family_name; // family name ("last name")
|
||||||
|
private char middle_initial; // middle initial (natch)
|
||||||
|
private String prefix; // prefix (Mr., Ms., Prof., Dr., etc.)
|
||||||
|
private String suffix; // suffix (Jr., III, etc.)
|
||||||
|
private String company; // company name
|
||||||
|
private String addr1; // address line 1
|
||||||
|
private String addr2; // address line 2
|
||||||
|
private String locality; // locality ("city")
|
||||||
|
private String region; // region ("state")
|
||||||
|
private String postal_code; // postal code ("ZIP code")
|
||||||
|
private String country; // 2-character ISO 3166 country code
|
||||||
|
private String phone; // voice phone number
|
||||||
|
private String fax; // facsimile (fax) number
|
||||||
|
private String mobile; // mobile phone (cellphone) number
|
||||||
|
private String email; // email address
|
||||||
|
private String photo_url; // URL of user photo
|
||||||
|
private String url; // URL of user's homepage
|
||||||
|
private String descr; // user's self-description
|
||||||
|
private java.util.Date created; // date created
|
||||||
|
private java.util.Date last_login; // date of last login
|
||||||
|
private java.util.Date last_update; // date of last update
|
||||||
|
private String real_email; // real email address
|
||||||
|
|
||||||
|
UserProfileImpl(EngineBackend engine, Connection conn, String username, boolean override)
|
||||||
|
throws DataException, SQLException
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
|
||||||
|
// first retrieve from the users table
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT uid, username, contactid, created, lastaccess, description "
|
||||||
|
+ "FROM users WHERE username = '");
|
||||||
|
sql.append(SQLUtil.encodeString(username)).append("';");
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new DataException("User '" + username + "' not found.");
|
||||||
|
|
||||||
|
// load the "elementary" fields
|
||||||
|
this.uid = rs.getInt("uid");
|
||||||
|
this.username = rs.getString("username");
|
||||||
|
int contact_id = rs.getInt("contactid");
|
||||||
|
created = SQLUtil.getFullDateTime(rs,"created");
|
||||||
|
last_login = SQLUtil.getFullDateTime(rs,"lastaccess");
|
||||||
|
descr = rs.getString("description");
|
||||||
|
|
||||||
|
loadContact(conn,contact_id,override);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
UserProfileImpl(EngineBackend engine, Connection conn, int uid, boolean override)
|
||||||
|
throws DataException, SQLException
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
|
||||||
|
// first retrieve from the users table
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT uid, username, contactid, created, lastaccess, description "
|
||||||
|
+ "FROM users WHERE uid = ");
|
||||||
|
sql.append(uid).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new DataException("User #" + String.valueOf(uid) + " not found.");
|
||||||
|
|
||||||
|
// load the "elementary" fields
|
||||||
|
this.uid = rs.getInt("uid");
|
||||||
|
this.username = rs.getString("username");
|
||||||
|
int contact_id = rs.getInt("contactid");
|
||||||
|
created = SQLUtil.getFullDateTime(rs,"created");
|
||||||
|
last_login = SQLUtil.getFullDateTime(rs,"lastaccess");
|
||||||
|
descr = rs.getString("description");
|
||||||
|
|
||||||
|
loadContact(conn,contact_id,override);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
private void loadContact(Connection conn, int contact_id, boolean override) throws SQLException
|
||||||
|
{
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * FROM contacts WHERE contactid = ");
|
||||||
|
sql.append(contact_id).append(';');
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (rs.next())
|
||||||
|
{ // load all the record data
|
||||||
|
given_name = rs.getString("given_name");
|
||||||
|
family_name = rs.getString("family_name");
|
||||||
|
String blort = rs.getString("middle_init");
|
||||||
|
if ((blort==null) || (blort.length()<1))
|
||||||
|
middle_initial = ' ';
|
||||||
|
else
|
||||||
|
middle_initial = blort.charAt(0);
|
||||||
|
prefix = rs.getString("prefix");
|
||||||
|
suffix = rs.getString("suffix");
|
||||||
|
company = rs.getString("company");
|
||||||
|
if (!override && rs.getBoolean("pvt_addr"))
|
||||||
|
{ // enforce address privacy
|
||||||
|
addr1 = null;
|
||||||
|
addr2 = null;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // load the address strings
|
||||||
|
addr1 = rs.getString("addr1");
|
||||||
|
addr2 = rs.getString("addr2");
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
locality = rs.getString("locality");
|
||||||
|
region = rs.getString("region");
|
||||||
|
postal_code = rs.getString("pcode");
|
||||||
|
country = rs.getString("country");
|
||||||
|
if (!override && rs.getBoolean("pvt_phone"))
|
||||||
|
{ // enforce phone privacy
|
||||||
|
phone = null;
|
||||||
|
mobile = null;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // load the phone strings
|
||||||
|
phone = rs.getString("phone");
|
||||||
|
mobile = rs.getString("mobile");
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
if (!override && rs.getBoolean("pvt_fax"))
|
||||||
|
fax = null;
|
||||||
|
else
|
||||||
|
fax = rs.getString("fax");
|
||||||
|
|
||||||
|
real_email = rs.getString("email");
|
||||||
|
if (!override && rs.getBoolean("pvt_email"))
|
||||||
|
email = null;
|
||||||
|
else
|
||||||
|
email = real_email;
|
||||||
|
|
||||||
|
photo_url = rs.getString("photo_url");
|
||||||
|
url = rs.getString("url");
|
||||||
|
last_update = SQLUtil.getFullDateTime(rs,"lastupdate");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // no contact ID - just default all the data
|
||||||
|
given_name = null;
|
||||||
|
family_name = null;
|
||||||
|
middle_initial = ' ';
|
||||||
|
prefix = null;
|
||||||
|
suffix = null;
|
||||||
|
company = null;
|
||||||
|
addr1 = null;
|
||||||
|
addr2 = null;
|
||||||
|
locality = null;
|
||||||
|
region = null;
|
||||||
|
postal_code = null;
|
||||||
|
country = null;
|
||||||
|
phone = null;
|
||||||
|
fax = null;
|
||||||
|
mobile = null;
|
||||||
|
email = null;
|
||||||
|
photo_url = null;
|
||||||
|
url = null;
|
||||||
|
last_update = null;
|
||||||
|
real_email = null;
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end loadContact
|
||||||
|
|
||||||
|
public int getUID()
|
||||||
|
{
|
||||||
|
return uid;
|
||||||
|
|
||||||
|
} // end getUID
|
||||||
|
|
||||||
|
public String getUserName()
|
||||||
|
{
|
||||||
|
return username;
|
||||||
|
|
||||||
|
} // end getUserName
|
||||||
|
|
||||||
|
public String getGivenName()
|
||||||
|
{
|
||||||
|
return given_name;
|
||||||
|
|
||||||
|
} // end getGivenName
|
||||||
|
|
||||||
|
public String getFamilyName()
|
||||||
|
{
|
||||||
|
return family_name;
|
||||||
|
|
||||||
|
} // end getFamilyName
|
||||||
|
|
||||||
|
public char getMiddleInitial()
|
||||||
|
{
|
||||||
|
return middle_initial;
|
||||||
|
|
||||||
|
} // end getMiddleInitial
|
||||||
|
|
||||||
|
public String getNamePrefix()
|
||||||
|
{
|
||||||
|
return prefix;
|
||||||
|
|
||||||
|
} // end getNamePrefix
|
||||||
|
|
||||||
|
public String getNameSuffix()
|
||||||
|
{
|
||||||
|
return suffix;
|
||||||
|
|
||||||
|
} // end getNameSuffix
|
||||||
|
|
||||||
|
public String getCompany()
|
||||||
|
{
|
||||||
|
return company;
|
||||||
|
|
||||||
|
} // end getCompany
|
||||||
|
|
||||||
|
public String getAddressLine1()
|
||||||
|
{
|
||||||
|
return addr1;
|
||||||
|
|
||||||
|
} // end getAddressLine1
|
||||||
|
|
||||||
|
public String getAddressLine2()
|
||||||
|
{
|
||||||
|
return addr2;
|
||||||
|
|
||||||
|
} // end getAddressLine2
|
||||||
|
|
||||||
|
public String getLocality()
|
||||||
|
{
|
||||||
|
return locality;
|
||||||
|
|
||||||
|
} // end getLocality
|
||||||
|
|
||||||
|
public String getRegion()
|
||||||
|
{
|
||||||
|
return region;
|
||||||
|
|
||||||
|
} // end getRegion
|
||||||
|
|
||||||
|
public String getPostalCode()
|
||||||
|
{
|
||||||
|
return postal_code;
|
||||||
|
|
||||||
|
} // end getPostalCode
|
||||||
|
|
||||||
|
public String getCountry()
|
||||||
|
{
|
||||||
|
return country;
|
||||||
|
|
||||||
|
} // end getCountry
|
||||||
|
|
||||||
|
public String getFullCountry()
|
||||||
|
{
|
||||||
|
return engine.getCountryNameForCode(country);
|
||||||
|
|
||||||
|
} // end getFullCountry
|
||||||
|
|
||||||
|
public String getPhone()
|
||||||
|
{
|
||||||
|
return phone;
|
||||||
|
|
||||||
|
} // end getPhone
|
||||||
|
|
||||||
|
public String getFax()
|
||||||
|
{
|
||||||
|
return fax;
|
||||||
|
|
||||||
|
} // end getFax
|
||||||
|
|
||||||
|
public String getMobile()
|
||||||
|
{
|
||||||
|
return mobile;
|
||||||
|
|
||||||
|
} // end getMobile
|
||||||
|
|
||||||
|
public String getEmail()
|
||||||
|
{
|
||||||
|
return email;
|
||||||
|
|
||||||
|
} // end getEmail
|
||||||
|
|
||||||
|
public String getPhotoURL()
|
||||||
|
{
|
||||||
|
return photo_url;
|
||||||
|
|
||||||
|
} // end getPhotoURL
|
||||||
|
|
||||||
|
public String getURL()
|
||||||
|
{
|
||||||
|
return url;
|
||||||
|
|
||||||
|
} // end getURL
|
||||||
|
|
||||||
|
public java.util.Date getCreateDate()
|
||||||
|
{
|
||||||
|
return created;
|
||||||
|
|
||||||
|
} // end getCreateDate
|
||||||
|
|
||||||
|
public java.util.Date getLastLoginDate()
|
||||||
|
{
|
||||||
|
return last_login;
|
||||||
|
|
||||||
|
} // end getLastLoginDate
|
||||||
|
|
||||||
|
public java.util.Date getLastUpdate()
|
||||||
|
{
|
||||||
|
return last_update;
|
||||||
|
|
||||||
|
} // end getLastUpdate
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return descr;
|
||||||
|
|
||||||
|
} // end getDescription
|
||||||
|
|
||||||
|
} // end class UserProfileImpl
|
1560
src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java
Normal file
1560
src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java
Normal file
File diff suppressed because it is too large
Load Diff
421
src/com/silverwrist/venice/db/DataPool.java
Normal file
421
src/com/silverwrist/venice/db/DataPool.java
Normal file
|
@ -0,0 +1,421 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.sql.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import com.silverwrist.util.DOMElementHelper;
|
||||||
|
import com.silverwrist.venice.core.ConfigException;
|
||||||
|
|
||||||
|
public class DataPool implements Runnable
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data values
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(DataPool.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String driver; // name of JDBC driver class
|
||||||
|
private String url; // URL for JDBC connection
|
||||||
|
private String username; // username for JDBC connection
|
||||||
|
private String password; // password for JDBC connection
|
||||||
|
private int max_conns; // maximum number of possible connections
|
||||||
|
private boolean wait_if_busy; // do we wait for a connection if none is available?
|
||||||
|
private boolean pending = false; // pending connection being created?
|
||||||
|
private Vector avail_connections; // connections which are available for use
|
||||||
|
private Vector busy_connections; // connections which are currently in use
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public DataPool(Element cfg) throws ConfigException, SQLException
|
||||||
|
{
|
||||||
|
// Make sure they passed the <database/> section to us.
|
||||||
|
if (!(cfg.getTagName().equals("database")))
|
||||||
|
{ // not the right section name
|
||||||
|
logger.fatal("configuration section is not <database/>");
|
||||||
|
throw new ConfigException("improper configuration section",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// Use a DOMElementHelper to read off the configuration for the DataPool.
|
||||||
|
DOMElementHelper cfgx = new DOMElementHelper(cfg);
|
||||||
|
driver = cfgx.getSubElementText("driver");
|
||||||
|
if (driver==null)
|
||||||
|
{ // no driver found!
|
||||||
|
logger.fatal("no <driver/> name inside <database/> section");
|
||||||
|
throw new ConfigException("no <driver/> name specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool driver: " + driver);
|
||||||
|
|
||||||
|
url = cfgx.getSubElementText("uri");
|
||||||
|
if (url==null)
|
||||||
|
{ // no database URI found!
|
||||||
|
logger.fatal("no <uri/> name inside <database/> section");
|
||||||
|
throw new ConfigException("no database <uri/> specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool URI: " + url);
|
||||||
|
|
||||||
|
username = cfgx.getSubElementText("username");
|
||||||
|
if (username==null)
|
||||||
|
{ // no database username found
|
||||||
|
logger.fatal("no <username/> inside <database/> section");
|
||||||
|
throw new ConfigException("no database <username/> specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool username: " + url);
|
||||||
|
|
||||||
|
password = cfgx.getSubElementText("password");
|
||||||
|
if (password==null)
|
||||||
|
{ // no database password found
|
||||||
|
logger.fatal("no user <password/> inside <database/> section");
|
||||||
|
throw new ConfigException("no database <password/> specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
int initial_conns = 0;
|
||||||
|
try
|
||||||
|
{ // retrieve the initial-conns figure and make it an integer
|
||||||
|
String tmp = cfgx.getSubElementText("initial-conns");
|
||||||
|
if (tmp==null)
|
||||||
|
{ // the connections value was not specified
|
||||||
|
logger.fatal("database <initial-conns/> value not specified");
|
||||||
|
throw new ConfigException("no <initial-conns/> value specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
initial_conns = Integer.parseInt(tmp);
|
||||||
|
if (initial_conns<0)
|
||||||
|
{ // the connections value was out of range
|
||||||
|
logger.fatal("database <initial-conns/> value was out of range");
|
||||||
|
throw new ConfigException("<initial-conns/> value out of range",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{ // the value wasn't a valid integer
|
||||||
|
logger.fatal("database <initial-conns/> value was not a number");
|
||||||
|
throw new ConfigException("<initial-conns/> value is not a number",e,cfg);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool initial connections: " + String.valueOf(initial_conns));
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // retrieve the max-conns figure and make it an integer
|
||||||
|
String tmp = cfgx.getSubElementText("max-conns");
|
||||||
|
if (tmp==null)
|
||||||
|
{ // maximum connections value not specified
|
||||||
|
logger.fatal("database <max-conns/> value not specified");
|
||||||
|
throw new ConfigException("no <max-conns/> value specified",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
max_conns = Integer.parseInt(tmp);
|
||||||
|
if (max_conns<=0)
|
||||||
|
{ // value must be greater than 0!
|
||||||
|
logger.fatal("database <max-conns/> value was out of range");
|
||||||
|
throw new ConfigException("<max-conns/> value out of range",cfg);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{ // the value wasn't a valid integer
|
||||||
|
logger.fatal("database <max-conns/> value was not a number");
|
||||||
|
throw new ConfigException("<max-conns/> value is not a number",e,cfg);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool maximum connections: " + String.valueOf(max_conns));
|
||||||
|
|
||||||
|
wait_if_busy = cfgx.hasChildElement("wait-if-busy");
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("DataPool wait if busy: " + String.valueOf(wait_if_busy));
|
||||||
|
|
||||||
|
if (initial_conns>max_conns)
|
||||||
|
{ // fix initial value if above maximum
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("N.B.: reducing configured initial connections");
|
||||||
|
initial_conns = max_conns;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// Create the vectors that hold connections.
|
||||||
|
avail_connections = new Vector(initial_conns);
|
||||||
|
busy_connections = new Vector();
|
||||||
|
|
||||||
|
// Populate the "available connection" vector.
|
||||||
|
for (int i=0; i<initial_conns; i++)
|
||||||
|
avail_connections.addElement(makeNewConnection());
|
||||||
|
|
||||||
|
logger.info("DataPool initialized");
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* finalize() function
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected void finalize()
|
||||||
|
{
|
||||||
|
closeConnections(avail_connections);
|
||||||
|
avail_connections = null;
|
||||||
|
closeConnections(busy_connections);
|
||||||
|
busy_connections = null;
|
||||||
|
driver = null;
|
||||||
|
url = null;
|
||||||
|
username = null;
|
||||||
|
password = null;
|
||||||
|
|
||||||
|
} // end finalize
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Connection makeNewConnection() throws SQLException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // make the connection and return it
|
||||||
|
Class.forName(driver).newInstance(); // preload driver class
|
||||||
|
// the newInstance() call above is to work around some broken Java implementations
|
||||||
|
return DriverManager.getConnection(url,username,password);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassNotFoundException e)
|
||||||
|
{ // convert a ClassNotFoundException to a nicer SQLException
|
||||||
|
logger.error("JDBC driver class \"" + driver + "\" not found",e);
|
||||||
|
throw new SQLException("Can't find class for driver: " + driver);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (IllegalAccessException e2)
|
||||||
|
{ // convert this to a nicer SQLException
|
||||||
|
logger.fatal("Can't access \"" + driver + "\" constructor: " + e2.getMessage(),e2);
|
||||||
|
throw new SQLException("Can't access class for driver: " + driver);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (InstantiationException e3)
|
||||||
|
{ // convert this to a nicer SQLException
|
||||||
|
logger.fatal("Can't create instance of \"" + driver + "\": " + e3.getMessage(),e3);
|
||||||
|
throw new SQLException("Can't create class for driver: " + driver);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end makeNewConnection
|
||||||
|
|
||||||
|
private void makeBackgroundConnection()
|
||||||
|
{
|
||||||
|
pending = true;
|
||||||
|
try
|
||||||
|
{ // spin off the connection attempt to the background
|
||||||
|
Thread thrd = new Thread(this);
|
||||||
|
thrd.start();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (OutOfMemoryError e)
|
||||||
|
{ // give up on new connection
|
||||||
|
logger.warn("memory failure spinning off background-connect thread");
|
||||||
|
pending = false;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end makeBackgroundConnection
|
||||||
|
|
||||||
|
private void closeConnections(Vector vconn)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)");
|
||||||
|
|
||||||
|
for (int i=0; i<vconn.size(); i++)
|
||||||
|
{ // loop over the entire vector
|
||||||
|
try
|
||||||
|
{ // take each connection and close it
|
||||||
|
Connection c = (Connection)(vconn.get(i));
|
||||||
|
if (!(c.isClosed()))
|
||||||
|
c.close();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // what do we care, this connection is dying anyhow
|
||||||
|
logger.warn("got a SQLException in closeConnections (ignored): " + e.getMessage());
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
} // end closeConnections
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Runnable
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // attempt to create another connection in the background
|
||||||
|
Connection c = makeNewConnection();
|
||||||
|
synchronized (this)
|
||||||
|
{ // we've got a new available connection - let everyone know
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("created new connection in the background");
|
||||||
|
avail_connections.addElement(c);
|
||||||
|
pending = false;
|
||||||
|
notifyAll();
|
||||||
|
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (Exception e)
|
||||||
|
{ // caught an SQLException or an OutOfMemory exception
|
||||||
|
logger.warn("background connection thread caught " + e.getClass().getName() + ": " + e.getMessage());
|
||||||
|
// ditch this new connection and wait until an existing one frees up
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end run
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized int numConnections()
|
||||||
|
{
|
||||||
|
int rc = avail_connections.size() + busy_connections.size();
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("numConnections() => " + String.valueOf(rc));
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end numConnections
|
||||||
|
|
||||||
|
public synchronized Connection getConnection() throws SQLException
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{ // loop until we get a connection or throw an exception
|
||||||
|
if (avail_connections.isEmpty())
|
||||||
|
{ // no connections available - we may need to make a new one
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("no connections available - looking to get one");
|
||||||
|
if ((numConnections() < max_conns) && !pending)
|
||||||
|
makeBackgroundConnection(); // try to create a new connection
|
||||||
|
else if (!wait_if_busy)
|
||||||
|
{ // don't want to wait? tough, we're h0sed!
|
||||||
|
logger.error("exhausted maximum connection limit (" + String.valueOf(max_conns) + ")");
|
||||||
|
throw new SQLException("connection limit reached");
|
||||||
|
|
||||||
|
} // end else if
|
||||||
|
|
||||||
|
// Wait for the background connect attempt to finish, or for
|
||||||
|
// someone to return a connection.
|
||||||
|
try
|
||||||
|
{ // park the thread here until we know what's up
|
||||||
|
wait();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (InterruptedException e)
|
||||||
|
{ // do nothing
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// now fall through the loop and try again
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // pull the last connection off the available list...
|
||||||
|
int ndx = avail_connections.size() - 1;
|
||||||
|
Connection rc = (Connection)(avail_connections.elementAt(ndx));
|
||||||
|
avail_connections.removeElementAt(ndx);
|
||||||
|
if (rc.isClosed())
|
||||||
|
{ // this connection is closed - discard it, and notify any waiters that a slot
|
||||||
|
// has opened up
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("discarding closed connection");
|
||||||
|
notifyAll();
|
||||||
|
rc = null;
|
||||||
|
// fall out to the end of the loop and try again
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // this connection is OK - return it
|
||||||
|
busy_connections.addElement(rc);
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end else (at least one connection available)
|
||||||
|
|
||||||
|
} // end for (ever)
|
||||||
|
|
||||||
|
} // end getConnection
|
||||||
|
|
||||||
|
public synchronized void releaseConnection(Connection c)
|
||||||
|
{
|
||||||
|
busy_connections.removeElement(c); // move from one vector to another
|
||||||
|
avail_connections.addElement(c);
|
||||||
|
notifyAll(); // wake up! Got a new connection for you!
|
||||||
|
|
||||||
|
} // end releaseConnection
|
||||||
|
|
||||||
|
public synchronized void closeAllConnections()
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("closing ALL connections!");
|
||||||
|
closeConnections(avail_connections);
|
||||||
|
avail_connections = new Vector();
|
||||||
|
closeConnections(busy_connections);
|
||||||
|
busy_connections = new Vector();
|
||||||
|
|
||||||
|
} // end closeAllConnections
|
||||||
|
|
||||||
|
public synchronized String toString()
|
||||||
|
{
|
||||||
|
StringBuffer info = new StringBuffer();
|
||||||
|
info.append("DataPool(\"").append(url).append("\",\"").append(username).append("\"), ");
|
||||||
|
info.append(avail_connections.size()).append(" avail, ").append(busy_connections.size());
|
||||||
|
info.append(" busy, ").append(max_conns).append(" max");
|
||||||
|
return info.toString();
|
||||||
|
|
||||||
|
} // end toString
|
||||||
|
|
||||||
|
} // end class DataPool
|
||||||
|
|
||||||
|
|
371
src/com/silverwrist/venice/db/PostLinkDecoder.java
Normal file
371
src/com/silverwrist/venice/db/PostLinkDecoder.java
Normal file
|
@ -0,0 +1,371 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
|
import com.silverwrist.venice.ValidationException;
|
||||||
|
import com.silverwrist.venice.core.IDUtils;
|
||||||
|
|
||||||
|
public class PostLinkDecoder
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final int MAX_LINK_LEN = 130;
|
||||||
|
private static final int MAX_SIG_LEN = 32;
|
||||||
|
private static final int MAX_CONF_LEN = 64;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String signame = null;
|
||||||
|
private String confname = null;
|
||||||
|
private short topicnum = -1;
|
||||||
|
private int first_post = -1;
|
||||||
|
private int last_post = -1;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public PostLinkDecoder(String data) throws ValidationException
|
||||||
|
{
|
||||||
|
if (StringUtil.isStringEmpty(data))
|
||||||
|
throw new ValidationException("empty string");
|
||||||
|
if (data.length()>MAX_LINK_LEN)
|
||||||
|
throw new ValidationException("post link string too long");
|
||||||
|
|
||||||
|
// turn the data into a StringBuffer so we can parse it
|
||||||
|
StringBuffer work = new StringBuffer(data);
|
||||||
|
|
||||||
|
// First Test: Bang
|
||||||
|
int pos = work.toString().indexOf('!');
|
||||||
|
if (pos>0)
|
||||||
|
{ // We have "sig!something" ... store off the SIG name
|
||||||
|
setSIGName(work.substring(0,pos));
|
||||||
|
work.delete(0,pos+1);
|
||||||
|
if (work.length()==0)
|
||||||
|
return; // we had just "sig!" - that's the syntax for a SIG link
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else if (pos==0)
|
||||||
|
throw new ValidationException("! at beginning of string");
|
||||||
|
|
||||||
|
// Second Test: Dot Number One
|
||||||
|
pos = work.toString().indexOf('.');
|
||||||
|
if (pos<0)
|
||||||
|
{ // there's no dots in here...this must have been either "postlink" or "sig!conference"
|
||||||
|
if (signame!=null) // it's "sig!conference"
|
||||||
|
setConferenceName(work.toString());
|
||||||
|
else // it's "postlink"
|
||||||
|
setPostRange(work);
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else if (pos==0)
|
||||||
|
throw new ValidationException(". at beginning of string");
|
||||||
|
|
||||||
|
// Peel off the initial substring.
|
||||||
|
String conf_or_topic = work.substring(0,pos);
|
||||||
|
work.delete(0,pos+1);
|
||||||
|
|
||||||
|
if (work.length()==0)
|
||||||
|
{ // we had "conference." or "topic." (or perhaps "sig!conference.")
|
||||||
|
if (signame==null)
|
||||||
|
{ // it's either "conference." or "topic." - try topic first
|
||||||
|
try
|
||||||
|
{ // try it as a topic number first...
|
||||||
|
setTopicNumber(conf_or_topic);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ValidationException ve)
|
||||||
|
{ // it's not a topic number - try it as a conference name!
|
||||||
|
setConferenceName(conf_or_topic);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // it was "sig!conference."...save it off
|
||||||
|
setConferenceName(conf_or_topic);
|
||||||
|
|
||||||
|
return; // all done here...
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// Third Test: Dot Number Two
|
||||||
|
pos = work.toString().indexOf('.');
|
||||||
|
if (pos<0)
|
||||||
|
{ // we had "conference.topic" or "topic.posts" (or perhaps "sig!conference.topic")
|
||||||
|
if (signame==null)
|
||||||
|
{ // we have "conference.topic" or "topic.posts" - have to determine this
|
||||||
|
boolean is_topic = false; // what does "work" currently hold?
|
||||||
|
try
|
||||||
|
{ // try the "topic.posts" possibility first...
|
||||||
|
setTopicNumber(conf_or_topic);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ValidationException ve)
|
||||||
|
{ // nope, it's gotta be "conference.topic"
|
||||||
|
setConferenceName(conf_or_topic);
|
||||||
|
is_topic = true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// complete the parsing here
|
||||||
|
if (is_topic)
|
||||||
|
setTopicNumber(work.toString());
|
||||||
|
else
|
||||||
|
setPostRange(work);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // it's "sig!conference.topic"...set 'em up accordingly
|
||||||
|
setConferenceName(conf_or_topic);
|
||||||
|
setTopicNumber(work.toString());
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
return; // all done
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else if (pos==0)
|
||||||
|
throw new ValidationException(". at beginning of string");
|
||||||
|
|
||||||
|
// We definitely have "conference.topic.something" (or "sig!conference.topic.sonething") now,
|
||||||
|
// so save off the conference name and topic number.
|
||||||
|
setConferenceName(conf_or_topic);
|
||||||
|
setTopicNumber(work.substring(0,pos));
|
||||||
|
work.delete(0,pos+1);
|
||||||
|
|
||||||
|
if (work.length()==0)
|
||||||
|
return; // we just had "conference.topic." or "sig!conference.topic.", which is valid
|
||||||
|
|
||||||
|
setPostRange(work); // the rest must be the post range!
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static boolean isAllDigits(String str)
|
||||||
|
{
|
||||||
|
for (int i=0; i<str.length(); i++)
|
||||||
|
{ // if any character is not a digit, bail out!
|
||||||
|
if (!(Character.isDigit(str.charAt(i))))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} // end isAllDigits
|
||||||
|
|
||||||
|
private void setSIGName(String name) throws ValidationException
|
||||||
|
{
|
||||||
|
if (name.length()>MAX_SIG_LEN)
|
||||||
|
throw new ValidationException("SIG alias is too long");
|
||||||
|
if (!(IDUtils.isValidVeniceID(name)))
|
||||||
|
throw new ValidationException("SIG alias is not a valid Venice identifier");
|
||||||
|
signame = name;
|
||||||
|
|
||||||
|
} // end setSIGName
|
||||||
|
|
||||||
|
private void setConferenceName(String name) throws ValidationException
|
||||||
|
{
|
||||||
|
if (name.length()>MAX_CONF_LEN)
|
||||||
|
throw new ValidationException("conference alias is too long");
|
||||||
|
if (!(IDUtils.isValidVeniceID(name)))
|
||||||
|
throw new ValidationException("conference alias is not a valid Venice identifier");
|
||||||
|
confname = name;
|
||||||
|
|
||||||
|
} // end setConferenceName
|
||||||
|
|
||||||
|
private void setTopicNumber(String val) throws ValidationException
|
||||||
|
{
|
||||||
|
if (!isAllDigits(val))
|
||||||
|
throw new ValidationException("invalid topic number reference");
|
||||||
|
short temp_val;
|
||||||
|
try
|
||||||
|
{ // parse the temp value
|
||||||
|
temp_val = Short.parseShort(val);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException nfe)
|
||||||
|
{ // if there's a validation exception, it goes here
|
||||||
|
throw new ValidationException("invalid topic number reference");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
topicnum = temp_val;
|
||||||
|
|
||||||
|
} // end setTopicNumber
|
||||||
|
|
||||||
|
private void setPostRange(StringBuffer buf) throws ValidationException
|
||||||
|
{
|
||||||
|
int pos = buf.toString().indexOf('-');
|
||||||
|
String temp = null;
|
||||||
|
int temp_val = -1;
|
||||||
|
if (pos>0)
|
||||||
|
{ // we've got "temp-something" here...make sure "temp" is a valid post number
|
||||||
|
temp = buf.substring(0,pos);
|
||||||
|
buf.delete(0,pos+1);
|
||||||
|
if (!isAllDigits(temp))
|
||||||
|
throw new ValidationException("invalid post number reference");
|
||||||
|
try
|
||||||
|
{ // parse the temp value
|
||||||
|
temp_val = Integer.parseInt(temp);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException nfe)
|
||||||
|
{ // if there's a validation exception, it goes here
|
||||||
|
throw new ValidationException("invalid post number reference");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (buf.length()==0)
|
||||||
|
{ // we just had "first-"...set it up
|
||||||
|
first_post = temp_val;
|
||||||
|
last_post = -1;
|
||||||
|
return;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else if (pos==0)
|
||||||
|
throw new ValidationException("- at beginning of post range");
|
||||||
|
|
||||||
|
// the remaining string must be all digits at this point
|
||||||
|
if (!isAllDigits(buf.toString()))
|
||||||
|
throw new ValidationException("invalid post number reference");
|
||||||
|
try
|
||||||
|
{ // parse the first value
|
||||||
|
first_post = Integer.parseInt(buf.toString());
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException nfe)
|
||||||
|
{ // if there's a validation exception, it goes here
|
||||||
|
throw new ValidationException("invalid post number reference");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
if (temp!=null)
|
||||||
|
{ // we converted a "temp_val" above - include it
|
||||||
|
if (temp_val<first_post)
|
||||||
|
{ // put the "temp_val" up front
|
||||||
|
last_post = first_post;
|
||||||
|
first_post = temp_val;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // reverse order - arrange them correctly
|
||||||
|
last_post = temp_val;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // we have a "range" of one post
|
||||||
|
last_post = first_post;
|
||||||
|
|
||||||
|
} // end setPostRange
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getSIG()
|
||||||
|
{
|
||||||
|
return signame;
|
||||||
|
|
||||||
|
} // end getSIG
|
||||||
|
|
||||||
|
public String getConference()
|
||||||
|
{
|
||||||
|
return confname;
|
||||||
|
|
||||||
|
} // end getConference
|
||||||
|
|
||||||
|
public short getTopic()
|
||||||
|
{
|
||||||
|
return topicnum;
|
||||||
|
|
||||||
|
} // end getTopic
|
||||||
|
|
||||||
|
public int getFirstPost()
|
||||||
|
{
|
||||||
|
return first_post;
|
||||||
|
|
||||||
|
} // end getFirstPost
|
||||||
|
|
||||||
|
public int getLastPost()
|
||||||
|
{
|
||||||
|
return last_post;
|
||||||
|
|
||||||
|
} // end getFirstPost
|
||||||
|
|
||||||
|
public boolean needDatabaseVerification()
|
||||||
|
{
|
||||||
|
return ((signame!=null) || (confname!=null));
|
||||||
|
|
||||||
|
} // end needDatabaseVerification
|
||||||
|
|
||||||
|
public void verifyNames(Connection conn) throws ValidationException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ // do the necessary database stuff
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer();
|
||||||
|
ResultSet rs;
|
||||||
|
|
||||||
|
if (signame!=null)
|
||||||
|
{ // verify the SIG name against the database
|
||||||
|
sql.append("SELECT sigid FROM sigs WHERE alias = '").append(SQLUtil.encodeString(signame));
|
||||||
|
sql.append("';");
|
||||||
|
rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new ValidationException("SIG alias not found");
|
||||||
|
sql.setLength(0);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (confname!=null)
|
||||||
|
{ // verify the conference name against the database
|
||||||
|
sql.append("SELECT confid FROM confalias WHERE alias = '").append(SQLUtil.encodeString(confname));
|
||||||
|
sql.append("';");
|
||||||
|
rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
throw new ValidationException("conference alias not found");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // database error verifying stuff!
|
||||||
|
throw new ValidationException("unable to verify names in post link");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end verifyNames
|
||||||
|
|
||||||
|
} // end class PostLinkDecoder
|
||||||
|
|
67
src/com/silverwrist/venice/db/PostLinkDecoderContext.java
Normal file
67
src/com/silverwrist/venice/db/PostLinkDecoderContext.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
public class PostLinkDecoderContext
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String signame; // SIG name that's cached
|
||||||
|
private String confname; // conference name that's cached
|
||||||
|
private short topic; // topic that's cached
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public PostLinkDecoderContext(String signame, String confname, short topic)
|
||||||
|
{
|
||||||
|
this.signame = signame;
|
||||||
|
this.confname = confname;
|
||||||
|
this.topic = topic;
|
||||||
|
|
||||||
|
} // end PostLinkDecoderContext
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getSIGName()
|
||||||
|
{
|
||||||
|
return signame;
|
||||||
|
|
||||||
|
} // end getSIGName
|
||||||
|
|
||||||
|
public String getConferenceName()
|
||||||
|
{
|
||||||
|
return confname;
|
||||||
|
|
||||||
|
} // end getConferenceName
|
||||||
|
|
||||||
|
public short getTopicNumber()
|
||||||
|
{
|
||||||
|
return topic;
|
||||||
|
|
||||||
|
} // end getTopicNumber
|
||||||
|
|
||||||
|
} // end class PostLinkDecoderContext
|
188
src/com/silverwrist/venice/db/PostLinkRewriter.java
Normal file
188
src/com/silverwrist/venice/db/PostLinkRewriter.java
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
|
import com.silverwrist.venice.ValidationException;
|
||||||
|
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||||
|
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||||
|
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||||
|
import com.silverwrist.venice.core.IDUtils;
|
||||||
|
|
||||||
|
public class PostLinkRewriter implements Rewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private DataPool datapool;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public PostLinkRewriter(DataPool datapool)
|
||||||
|
{
|
||||||
|
this.datapool = datapool;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static String buildPostLink(PostLinkDecoder pl, PostLinkDecoderContext ctxt)
|
||||||
|
{
|
||||||
|
StringBuffer b = new StringBuffer("x-postlink:");
|
||||||
|
boolean started = false;
|
||||||
|
if (pl.getSIG()==null)
|
||||||
|
b.append(ctxt.getSIGName());
|
||||||
|
else
|
||||||
|
{ // append the real SIG name
|
||||||
|
started = true;
|
||||||
|
b.append(pl.getSIG());
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
b.append('!');
|
||||||
|
if (pl.getConference()==null)
|
||||||
|
{ // need to default the context
|
||||||
|
if (started)
|
||||||
|
return b.toString();
|
||||||
|
b.append(ctxt.getConferenceName());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // append the proper conference name
|
||||||
|
started = true;
|
||||||
|
b.append(pl.getConference());
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
b.append('.');
|
||||||
|
if (pl.getTopic()==-1)
|
||||||
|
{ // need to default the topic number
|
||||||
|
if (started)
|
||||||
|
return b.toString();
|
||||||
|
b.append(ctxt.getTopicNumber());
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // append the proper topic number
|
||||||
|
started = true;
|
||||||
|
b.append(pl.getTopic());
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
// append the post link information, if applicable
|
||||||
|
b.append('.');
|
||||||
|
if (pl.getFirstPost()==-1)
|
||||||
|
return b.toString();
|
||||||
|
b.append(pl.getFirstPost());
|
||||||
|
if (pl.getFirstPost()==pl.getLastPost())
|
||||||
|
return b.toString();
|
||||||
|
b.append('-');
|
||||||
|
if (pl.getLastPost()==-1)
|
||||||
|
return b.toString();
|
||||||
|
b.append(pl.getLastPost());
|
||||||
|
return b.toString();
|
||||||
|
|
||||||
|
} // end buildPostLink
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Rewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, RewriterServices svc)
|
||||||
|
{
|
||||||
|
PostLinkDecoderContext ctxt;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // attempt to get the decoder context
|
||||||
|
ctxt = (PostLinkDecoderContext)(svc.getRewriterContextValue("PostLinkDecoderContext"));
|
||||||
|
if (ctxt==null)
|
||||||
|
return null; // decoder can't function
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ClassCastException x)
|
||||||
|
{ // decoder can't function without the context
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
PostLinkDecoder pl;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // create the post link decoder
|
||||||
|
pl = new PostLinkDecoder(data);
|
||||||
|
|
||||||
|
if (pl.needDatabaseVerification())
|
||||||
|
{ // open up a database connection and verify the SIG/conference names
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // verify against the database
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
pl.verifyNames(conn);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // just return null on failures
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // release the connection when we're done
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (ValidationException ve)
|
||||||
|
{ // we can't validate the post link - just bail out
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
// build the necessary markup and return it
|
||||||
|
StringBuffer open_a = new StringBuffer("<A HREF=\"");
|
||||||
|
open_a.append(buildPostLink(pl,ctxt)).append("\"");
|
||||||
|
String catenate = svc.getRewriterAttrValue("ANCHORTAIL");
|
||||||
|
if (!(StringUtil.isStringEmpty(catenate)))
|
||||||
|
open_a.append(' ').append(catenate);
|
||||||
|
open_a.append('>');
|
||||||
|
return new MarkupData(open_a.toString(),data,"</A>");
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
} // end class PostLinkRewriter
|
176
src/com/silverwrist/venice/db/SQLUtil.java
Normal file
176
src/com/silverwrist/venice/db/SQLUtil.java
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
|
|
||||||
|
public class SQLUtil
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static java.util.Date convertDateTimeString(String dstr) throws SQLException
|
||||||
|
{
|
||||||
|
if (dstr==null)
|
||||||
|
return null; // null values are the same
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // do almost the reverse process of formatting it into a string
|
||||||
|
GregorianCalendar cal = new GregorianCalendar(new SimpleTimeZone(0,"UTC"));
|
||||||
|
cal.set(Calendar.YEAR,Integer.parseInt(dstr.substring(0,4)));
|
||||||
|
cal.set(Calendar.MONTH,Integer.parseInt(dstr.substring(5,7)) - 1 + Calendar.JANUARY);
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH,Integer.parseInt(dstr.substring(8,10)));
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY,Integer.parseInt(dstr.substring(11,13)));
|
||||||
|
cal.set(Calendar.MINUTE,Integer.parseInt(dstr.substring(14,16)));
|
||||||
|
cal.set(Calendar.SECOND,Integer.parseInt(dstr.substring(17,19)));
|
||||||
|
return cal.getTime();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{ // the NumberFormatException becomes an SQLException
|
||||||
|
throw new SQLException("invalid DATETIME field format");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end convertDateString
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static String encodeString(String str)
|
||||||
|
{
|
||||||
|
return StringUtil.encodeStringSQL(str);
|
||||||
|
|
||||||
|
} // end encodeString
|
||||||
|
|
||||||
|
public static String encodeStringArg(String str)
|
||||||
|
{
|
||||||
|
if (str==null)
|
||||||
|
return "NULL";
|
||||||
|
StringBuffer b = new StringBuffer("'");
|
||||||
|
b.append(StringUtil.encodeStringSQL(str)).append('\'');
|
||||||
|
return b.toString();
|
||||||
|
|
||||||
|
} // end encodeStringArg
|
||||||
|
|
||||||
|
public static String encodeStringWildcards(String str)
|
||||||
|
{
|
||||||
|
if ((str.indexOf('_')<0) && (str.indexOf('%')<0))
|
||||||
|
return StringUtil.encodeStringSQL(str);
|
||||||
|
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int i=0; i<str.length(); i++)
|
||||||
|
{ // loop through the string encoding its characters
|
||||||
|
char c = str.charAt(i);
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\'':
|
||||||
|
buf.append("\'\'");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '_':
|
||||||
|
buf.append("\\_");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '%':
|
||||||
|
buf.append("\\%");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
buf.append(c);
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end encodeStringWildcards
|
||||||
|
|
||||||
|
public static String encodeDate(java.util.Date d)
|
||||||
|
{
|
||||||
|
// Break down the date as a UTC value.
|
||||||
|
GregorianCalendar cal = new GregorianCalendar(new SimpleTimeZone(0,"UTC"));
|
||||||
|
cal.setTime(d);
|
||||||
|
|
||||||
|
// Create the two string buffers converting the date.
|
||||||
|
StringBuffer rc = new StringBuffer();
|
||||||
|
StringBuffer conv = new StringBuffer();
|
||||||
|
String c;
|
||||||
|
|
||||||
|
// Encode the year first.
|
||||||
|
conv.append("0000").append(cal.get(Calendar.YEAR));
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-4)).append('-');
|
||||||
|
|
||||||
|
// Now the month...
|
||||||
|
conv.setLength(0);
|
||||||
|
conv.append("00").append(cal.get(Calendar.MONTH) - Calendar.JANUARY + 1);
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-2)).append('-');
|
||||||
|
|
||||||
|
// And the day...
|
||||||
|
conv.setLength(0);
|
||||||
|
conv.append("00").append(cal.get(Calendar.DAY_OF_MONTH));
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-2)).append(' ');
|
||||||
|
|
||||||
|
// And the hour...
|
||||||
|
conv.setLength(0);
|
||||||
|
conv.append("00").append(cal.get(Calendar.HOUR_OF_DAY));
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-2)).append(':');
|
||||||
|
|
||||||
|
// And the minute...
|
||||||
|
conv.setLength(0);
|
||||||
|
conv.append("00").append(cal.get(Calendar.MINUTE));
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-2)).append(':');
|
||||||
|
|
||||||
|
// And the second...
|
||||||
|
conv.setLength(0);
|
||||||
|
conv.append("00").append(cal.get(Calendar.SECOND));
|
||||||
|
c = conv.toString();
|
||||||
|
rc.append(c.substring(c.length()-2));
|
||||||
|
|
||||||
|
// This is the resulting date/time value.
|
||||||
|
return rc.toString();
|
||||||
|
|
||||||
|
} // end encodeDate
|
||||||
|
|
||||||
|
public static java.util.Date getFullDateTime(ResultSet rs, String column) throws SQLException
|
||||||
|
{
|
||||||
|
return convertDateTimeString(rs.getString(column));
|
||||||
|
|
||||||
|
} // end getFullDateTime
|
||||||
|
|
||||||
|
public static java.util.Date getFullDateTime(ResultSet rs, int column) throws SQLException
|
||||||
|
{
|
||||||
|
return convertDateTimeString(rs.getString(column));
|
||||||
|
|
||||||
|
} // end getFullDateTime
|
||||||
|
|
||||||
|
} // end class SQLUtil
|
||||||
|
|
98
src/com/silverwrist/venice/db/UserNameRewriter.java
Normal file
98
src/com/silverwrist/venice/db/UserNameRewriter.java
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.db;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import com.silverwrist.util.StringUtil;
|
||||||
|
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||||
|
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||||
|
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||||
|
import com.silverwrist.venice.core.IDUtils;
|
||||||
|
|
||||||
|
public class UserNameRewriter implements Rewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private DataPool datapool;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public UserNameRewriter(DataPool datapool)
|
||||||
|
{
|
||||||
|
this.datapool = datapool;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Rewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, RewriterServices svc)
|
||||||
|
{
|
||||||
|
if (StringUtil.isStringEmpty(data) || (data.length()>64) || !(IDUtils.isValidVeniceID(data)))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Connection conn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // get a database connection and create a statement
|
||||||
|
conn = datapool.getConnection();
|
||||||
|
Statement stmt = conn.createStatement();
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT uid FROM users WHERE username = '");
|
||||||
|
sql.append(SQLUtil.encodeString(data)).append("';");
|
||||||
|
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||||
|
if (!(rs.next()))
|
||||||
|
return null; // not found
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (SQLException e)
|
||||||
|
{ // if we hit a database error, just return null...
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // make sure and release the connection before we go
|
||||||
|
if (conn!=null)
|
||||||
|
datapool.releaseConnection(conn);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
StringBuffer open_a = new StringBuffer("<A HREF=\"x-userlink:");
|
||||||
|
open_a.append(data).append("\"");
|
||||||
|
String catenate = svc.getRewriterAttrValue("ANCHORTAIL");
|
||||||
|
if (!(StringUtil.isStringEmpty(catenate)))
|
||||||
|
open_a.append(' ').append(catenate);
|
||||||
|
open_a.append('>');
|
||||||
|
return new MarkupData(open_a.toString(),data,"</A>");
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
} // end class UserNameRewriter
|
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public class AlreadyFinishedException extends HTMLCheckerException
|
||||||
|
{
|
||||||
|
public AlreadyFinishedException()
|
||||||
|
{
|
||||||
|
super("The HTML Checker is already in a finished state.");
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end AlreadyFinishedException
|
40
src/com/silverwrist/venice/htmlcheck/HTMLChecker.java
Normal file
40
src/com/silverwrist/venice/htmlcheck/HTMLChecker.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface HTMLChecker
|
||||||
|
{
|
||||||
|
public abstract void append(String str) throws AlreadyFinishedException;
|
||||||
|
|
||||||
|
public abstract void finish() throws AlreadyFinishedException;
|
||||||
|
|
||||||
|
public abstract void reset();
|
||||||
|
|
||||||
|
public abstract String getValue() throws NotYetFinishedException;
|
||||||
|
|
||||||
|
public abstract int getLength() throws NotYetFinishedException;
|
||||||
|
|
||||||
|
public abstract int getLines() throws NotYetFinishedException;
|
||||||
|
|
||||||
|
public abstract int getCounter(String name) throws NotYetFinishedException;
|
||||||
|
|
||||||
|
public abstract Object getContextValue(String name);
|
||||||
|
|
||||||
|
public abstract void setContextValue(String name, Object val);
|
||||||
|
|
||||||
|
} // end interface HTMLChecker
|
66
src/com/silverwrist/venice/htmlcheck/HTMLCheckerConfig.java
Normal file
66
src/com/silverwrist/venice/htmlcheck/HTMLCheckerConfig.java
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface HTMLCheckerConfig extends HTMLTagSets
|
||||||
|
{
|
||||||
|
public abstract short getWordWrapLength();
|
||||||
|
|
||||||
|
public abstract void setWordWrapLength(short val);
|
||||||
|
|
||||||
|
public abstract boolean getProcessAngles();
|
||||||
|
|
||||||
|
public abstract void setProcessAngles(boolean val);
|
||||||
|
|
||||||
|
public abstract boolean getProcessParens();
|
||||||
|
|
||||||
|
public abstract void setProcessParens(boolean val);
|
||||||
|
|
||||||
|
public abstract boolean getDiscardHTMLTags();
|
||||||
|
|
||||||
|
public abstract void setDiscardHTMLTags(boolean val);
|
||||||
|
|
||||||
|
public abstract String getAnchorTail();
|
||||||
|
|
||||||
|
public abstract void setAnchorTail(String s);
|
||||||
|
|
||||||
|
public abstract void addOutputFilter(OutputFilter filter);
|
||||||
|
|
||||||
|
public abstract void addRawOutputFilter(OutputFilter filter);
|
||||||
|
|
||||||
|
public abstract void addStringRewriter(Rewriter rewriter);
|
||||||
|
|
||||||
|
public abstract void addWordRewriter(Rewriter rewriter);
|
||||||
|
|
||||||
|
public abstract void addTagRewriter(Rewriter rewriter);
|
||||||
|
|
||||||
|
public abstract void addParenRewriter(Rewriter rewriter);
|
||||||
|
|
||||||
|
public abstract boolean isTagSetAllowed(int setid);
|
||||||
|
|
||||||
|
public abstract void allowTagSet(int setid);
|
||||||
|
|
||||||
|
public abstract void disallowTagSet(int setid);
|
||||||
|
|
||||||
|
public abstract void configureNormalTagSet();
|
||||||
|
|
||||||
|
public abstract void configureRestrictedTagSet();
|
||||||
|
|
||||||
|
public abstract HTMLChecker createHTMLChecker();
|
||||||
|
|
||||||
|
} // end interface HTMLCheckerConfig
|
30
src/com/silverwrist/venice/htmlcheck/HTMLCheckerCreator.java
Normal file
30
src/com/silverwrist/venice/htmlcheck/HTMLCheckerCreator.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.htmlcheck.impl.HTMLCheckerConfigImpl;
|
||||||
|
|
||||||
|
public class HTMLCheckerCreator
|
||||||
|
{
|
||||||
|
public static HTMLCheckerConfig create()
|
||||||
|
{
|
||||||
|
return HTMLCheckerConfigImpl.createHTMLCheckerConfig();
|
||||||
|
|
||||||
|
} // end create
|
||||||
|
|
||||||
|
} // end HTMLCheckerCreator
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public class HTMLCheckerException extends com.silverwrist.venice.VeniceException
|
||||||
|
{
|
||||||
|
public HTMLCheckerException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public HTMLCheckerException(String msg)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public HTMLCheckerException(Exception e)
|
||||||
|
{
|
||||||
|
super(e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public HTMLCheckerException(String msg, Exception e)
|
||||||
|
{
|
||||||
|
super(msg,e);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end class HTMLCheckerException
|
138
src/com/silverwrist/venice/htmlcheck/HTMLTagSets.java
Normal file
138
src/com/silverwrist/venice/htmlcheck/HTMLTagSets.java
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface HTMLTagSets
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Denotes all tags that affect "inline" formatting only, such as
|
||||||
|
* <EM> and <B>. These are usually allowed.
|
||||||
|
*/
|
||||||
|
public static final int INLINE_FORMAT = 1;
|
||||||
|
/**
|
||||||
|
* Denotes the "A" tag.
|
||||||
|
*/
|
||||||
|
public static final int ANCHOR = 2;
|
||||||
|
/**
|
||||||
|
* Denotes all tags that affect "block-level" formatting, such as
|
||||||
|
* <P> and <Hn>.
|
||||||
|
*/
|
||||||
|
public static final int BLOCK_FORMAT = 3;
|
||||||
|
/**
|
||||||
|
* Denotes all tags that cause "active" content to be included in the
|
||||||
|
* HTML document, such as <OBJECT>, <APPLET>, and <SCRIPT>.
|
||||||
|
* These are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int ACTIVE_CONTENT = 4;
|
||||||
|
/**
|
||||||
|
* Denotes the tags that create clickable image maps, such as <AREA> and
|
||||||
|
* <MAP>.
|
||||||
|
*/
|
||||||
|
public static final int IMAGE_MAPS = 5;
|
||||||
|
/**
|
||||||
|
* Denotes the tags that are used for document-level formatting and structure, such as
|
||||||
|
* <HTML>, <BODY>, and <TITLE>. These are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int DOC_FORMAT = 6;
|
||||||
|
/**
|
||||||
|
* Denotes the <FONT> tag.
|
||||||
|
*/
|
||||||
|
public static final int FONT_FORMAT = 7;
|
||||||
|
/**
|
||||||
|
* Denotes all tags that are used in conjunction with forms, such as
|
||||||
|
* <FORM>, <INPUT>, and <SELECT>.
|
||||||
|
*/
|
||||||
|
public static final int FORMS = 8;
|
||||||
|
/**
|
||||||
|
* Denotes all tags that are used in conjunction with tables, such as
|
||||||
|
* <TABLE>, <TR>, and <TD>.
|
||||||
|
*/
|
||||||
|
public static final int TABLES = 9;
|
||||||
|
/**
|
||||||
|
* Denotes the <DEL> and <INS> tags, which are used for change markup.
|
||||||
|
*/
|
||||||
|
public static final int CHANGE_MARKUP = 10;
|
||||||
|
/**
|
||||||
|
* Denotes all tags related to frames, such as <FRAMESET> and <FRAME>.
|
||||||
|
* These are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int FRAMES = 11;
|
||||||
|
/**
|
||||||
|
* Denotes the <IMG> tag.
|
||||||
|
*/
|
||||||
|
public static final int IMAGES = 12;
|
||||||
|
/**
|
||||||
|
* Denotes tags like <PRE>, which are used to preformat input text.
|
||||||
|
*/
|
||||||
|
public static final int PREFORMAT = 13;
|
||||||
|
/**
|
||||||
|
* Denotes Netscape-specific inline formatting, such as the hated <BLINK>.
|
||||||
|
*/
|
||||||
|
public static final int NSCP_INLINE_FORMAT = 14;
|
||||||
|
/**
|
||||||
|
* Denotes Netscape's layer tags, such as <LAYER> and <ILAYER>. These are
|
||||||
|
* generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int NSCP_LAYERS = 15;
|
||||||
|
/**
|
||||||
|
* Denotes Netscape-specific form tags, like <KEYGEN>. These are generally
|
||||||
|
* not allowed.
|
||||||
|
*/
|
||||||
|
public static final int NSCP_FORMS = 16;
|
||||||
|
/**
|
||||||
|
* Denotes Netscape-specific block formatting tags, like <MULTICOL>. These are
|
||||||
|
* generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int NSCP_BLOCK_FORMAT = 17;
|
||||||
|
/**
|
||||||
|
* Denotes the Netscape <SERVER> tag, used for server-side execution. This is
|
||||||
|
* generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int NSCP_SERVER = 18;
|
||||||
|
/**
|
||||||
|
* Denotes Microsoft-specific document formatting tags, such as <BGSOUND>. These
|
||||||
|
* are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int MSFT_DOC_FORMAT = 19;
|
||||||
|
/**
|
||||||
|
* Denotes Microsoft-specific inline formatting tags, such as <COMMENT>. These
|
||||||
|
* are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int MSFT_INLINE_FORMAT = 20;
|
||||||
|
/**
|
||||||
|
* Denotes Microsoft-specific block formatting tags, such as <MARQUEE>. These
|
||||||
|
* are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int MSFT_BLOCK_FORMAT = 21;
|
||||||
|
/**
|
||||||
|
* Denotes Microsoft-specific active-content tags, such as <XML>. These
|
||||||
|
* are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int MSFT_ACTIVE_CONTENT = 22;
|
||||||
|
/**
|
||||||
|
* Denotes constructs for server-side page use only, such as with Microsoft Active
|
||||||
|
* Server Pages and Sun Java Server Pages. These are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int SERVER_PAGE = 23;
|
||||||
|
/**
|
||||||
|
* Denotes tags used by the Sun Java Server and other Java-compatible servers for
|
||||||
|
* including server-side components. These are generally not allowed.
|
||||||
|
*/
|
||||||
|
public static final int JAVA_SERVER = 24;
|
||||||
|
|
||||||
|
} // end interface HTMLTagSets
|
67
src/com/silverwrist/venice/htmlcheck/MarkupData.java
Normal file
67
src/com/silverwrist/venice/htmlcheck/MarkupData.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public class MarkupData
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String begin_markup;
|
||||||
|
private String text;
|
||||||
|
private String end_markup;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public MarkupData(String begin_markup, String text, String end_markup)
|
||||||
|
{
|
||||||
|
this.begin_markup = begin_markup;
|
||||||
|
this.text = text;
|
||||||
|
this.end_markup = end_markup;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getBeginMarkup()
|
||||||
|
{
|
||||||
|
return begin_markup;
|
||||||
|
|
||||||
|
} // end getBeginMarkup
|
||||||
|
|
||||||
|
public String getText()
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
|
||||||
|
} // end getText
|
||||||
|
|
||||||
|
public String getEndMarkup()
|
||||||
|
{
|
||||||
|
return end_markup;
|
||||||
|
|
||||||
|
} // end getEndMarkup
|
||||||
|
|
||||||
|
} // end class MarkupData
|
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface ModSpellingDictionary extends SpellingDictionary
|
||||||
|
{
|
||||||
|
public abstract void addWord(String word);
|
||||||
|
|
||||||
|
public abstract void delWord(String word);
|
||||||
|
|
||||||
|
public abstract void clear();
|
||||||
|
|
||||||
|
} // end interface ModSpellingDictionary
|
||||||
|
|
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public class NotYetFinishedException extends HTMLCheckerException
|
||||||
|
{
|
||||||
|
public NotYetFinishedException()
|
||||||
|
{
|
||||||
|
super("The HTML Checker is not yet in a finished state.");
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
} // end NotYetFinishedException
|
28
src/com/silverwrist/venice/htmlcheck/OutputFilter.java
Normal file
28
src/com/silverwrist/venice/htmlcheck/OutputFilter.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface OutputFilter
|
||||||
|
{
|
||||||
|
public abstract boolean tryOutputCharacter(StringBuffer buf, char ch);
|
||||||
|
|
||||||
|
public abstract boolean matchCharacter(char ch);
|
||||||
|
|
||||||
|
public abstract int lengthNoMatch(String s);
|
||||||
|
|
||||||
|
} // end interface OutputFilter
|
26
src/com/silverwrist/venice/htmlcheck/Rewriter.java
Normal file
26
src/com/silverwrist/venice/htmlcheck/Rewriter.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface Rewriter
|
||||||
|
{
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public abstract MarkupData rewrite(String data, RewriterServices svc);
|
||||||
|
|
||||||
|
} // end interface Rewriter
|
26
src/com/silverwrist/venice/htmlcheck/RewriterServices.java
Normal file
26
src/com/silverwrist/venice/htmlcheck/RewriterServices.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface RewriterServices
|
||||||
|
{
|
||||||
|
public abstract String getRewriterAttrValue(String name);
|
||||||
|
|
||||||
|
public abstract Object getRewriterContextValue(String name);
|
||||||
|
|
||||||
|
} // end interface RewriterServices
|
26
src/com/silverwrist/venice/htmlcheck/SpellingDictionary.java
Normal file
26
src/com/silverwrist/venice/htmlcheck/SpellingDictionary.java
Normal file
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck;
|
||||||
|
|
||||||
|
public interface SpellingDictionary
|
||||||
|
{
|
||||||
|
public abstract int size();
|
||||||
|
|
||||||
|
public abstract boolean checkWord(String word);
|
||||||
|
|
||||||
|
} // end interface SpellingDictionary
|
144
src/com/silverwrist/venice/htmlcheck/dict/LazyLexicon.java
Normal file
144
src/com/silverwrist/venice/htmlcheck/dict/LazyLexicon.java
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.dict;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.SpellingDictionary;
|
||||||
|
|
||||||
|
public class LazyLexicon implements Runnable, SpellingDictionary
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data values
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(LazyLexicon.class.getName());
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Lexicon inner_lex = null;
|
||||||
|
private String[] filenames;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public LazyLexicon(String[] filenames)
|
||||||
|
{
|
||||||
|
this.filenames = filenames; // save off the file names to be loaded
|
||||||
|
|
||||||
|
// spin off the load process into the background
|
||||||
|
Thread thrd = new Thread(this);
|
||||||
|
thrd.start();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private synchronized Lexicon getLex()
|
||||||
|
{
|
||||||
|
while (inner_lex==null)
|
||||||
|
{ // wait for the inner thread to finish creating the lexicon
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("LazyLexicon: waiting for lex 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 inner_lex;
|
||||||
|
|
||||||
|
} // end getLex
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Runnable
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
Lexicon lex = new Lexicon();
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("LazyLexicon loading " + String.valueOf(filenames.length) + " lexicon(s)");
|
||||||
|
|
||||||
|
for (int i=0; i<filenames.length; i++)
|
||||||
|
{ // load data into the lexicon in turn
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("LazyLexicon loading file: " + filenames[i]);
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // start reading the file
|
||||||
|
lex.readFile(filenames[i]);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // trap it and go on to the next one
|
||||||
|
logger.error("IOException loading lexfile " + filenames[i] + ": " + e.getMessage());
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("LazyLexicon load complete.");
|
||||||
|
|
||||||
|
synchronized (this)
|
||||||
|
{ // set the lexicon reference and wake up all waiting threads
|
||||||
|
inner_lex = lex;
|
||||||
|
notifyAll();
|
||||||
|
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
System.gc(); // free any extra crap generated by the lexicon load
|
||||||
|
|
||||||
|
} // end run
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface SpellingDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return getLex().size();
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
public boolean checkWord(String word)
|
||||||
|
{
|
||||||
|
return getLex().checkWord(word);
|
||||||
|
|
||||||
|
} // end checkWord
|
||||||
|
|
||||||
|
} // end class LazyLexicon
|
239
src/com/silverwrist/venice/htmlcheck/dict/Lexicon.java
Normal file
239
src/com/silverwrist/venice/htmlcheck/dict/Lexicon.java
Normal file
|
@ -0,0 +1,239 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.dict;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.zip.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.ModSpellingDictionary;
|
||||||
|
|
||||||
|
public class Lexicon implements ModSpellingDictionary, Serializable
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private HashSet[] sets; // 26 word sets, one for each letter of the alphabet
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Lexicon()
|
||||||
|
{
|
||||||
|
sets = new HashSet[26];
|
||||||
|
for (int i=0; i<26; i++)
|
||||||
|
sets[i] = new HashSet(500,0.9F);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface SpellingDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized int size()
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
for (int i=0; i<26; i++)
|
||||||
|
rc += sets[i].size();
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end size
|
||||||
|
|
||||||
|
public synchronized boolean checkWord(String word)
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
int ndx = (int)(real_word.charAt(0) - 'a');
|
||||||
|
return sets[ndx].contains(real_word);
|
||||||
|
|
||||||
|
} // end checkWord
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface ModSpellingDictionary
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized void addWord(String word)
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
int ndx = (int)(real_word.charAt(0) - 'a');
|
||||||
|
sets[ndx].add(real_word);
|
||||||
|
|
||||||
|
} // end addWord
|
||||||
|
|
||||||
|
public synchronized void delWord(String word)
|
||||||
|
{
|
||||||
|
String real_word = word.toLowerCase();
|
||||||
|
int ndx = (int)(real_word.charAt(0) - 'a');
|
||||||
|
sets[ndx].remove(real_word);
|
||||||
|
|
||||||
|
} // end delWord
|
||||||
|
|
||||||
|
public synchronized void clear()
|
||||||
|
{
|
||||||
|
for (int i=0; i<26; i++)
|
||||||
|
sets[i].clear();
|
||||||
|
|
||||||
|
} // end clear
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public synchronized void saveToStream(OutputStream stm, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
ObjectOutputStream real_stm;
|
||||||
|
if (compress)
|
||||||
|
{ // run through a GZIP object before writing
|
||||||
|
GZIPOutputStream gz_stm = new GZIPOutputStream(stm);
|
||||||
|
real_stm = new ObjectOutputStream(gz_stm);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // just create the ObjectOutputStream directly
|
||||||
|
real_stm = new ObjectOutputStream(stm);
|
||||||
|
|
||||||
|
real_stm.writeObject(this);
|
||||||
|
real_stm.flush();
|
||||||
|
|
||||||
|
} // end saveToStream
|
||||||
|
|
||||||
|
public synchronized void saveToFile(File file, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
FileOutputStream fstm = new FileOutputStream(file);
|
||||||
|
try
|
||||||
|
{ // save the object data
|
||||||
|
saveToStream(fstm,compress);
|
||||||
|
fstm.flush();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure we close the file before leaving
|
||||||
|
fstm.close();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end saveToFile
|
||||||
|
|
||||||
|
public synchronized void saveToFile(String filename, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
FileOutputStream fstm = new FileOutputStream(filename);
|
||||||
|
try
|
||||||
|
{ // save the object data
|
||||||
|
saveToStream(fstm,compress);
|
||||||
|
fstm.flush();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure we close the file before leaving
|
||||||
|
fstm.close();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end saveToFile
|
||||||
|
|
||||||
|
public synchronized void readFile(String filename) throws IOException
|
||||||
|
{
|
||||||
|
BufferedReader rdr = new BufferedReader(new FileReader(filename));
|
||||||
|
|
||||||
|
String word = rdr.readLine();
|
||||||
|
while (word!=null)
|
||||||
|
{ // add each word to the lexicon as we go
|
||||||
|
addWord(word);
|
||||||
|
word = rdr.readLine();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
rdr.close();
|
||||||
|
|
||||||
|
} // end readFile
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static Lexicon loadFromStream(InputStream stm, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
ObjectInputStream real_stm;
|
||||||
|
if (compress)
|
||||||
|
{ // chain in a decompressor before we read the object
|
||||||
|
GZIPInputStream gz_stm = new GZIPInputStream(stm);
|
||||||
|
real_stm = new ObjectInputStream(gz_stm);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // just load uncompressed
|
||||||
|
real_stm = new ObjectInputStream(stm);
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // attempt to read the LExicon object
|
||||||
|
Object tmp = real_stm.readObject();
|
||||||
|
if (tmp instanceof Lexicon)
|
||||||
|
return (Lexicon)tmp;
|
||||||
|
throw new IOException("invalid stream data format");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (OptionalDataException od)
|
||||||
|
{ // translate exception here so we only throw one type
|
||||||
|
throw new IOException("invalid stream data format");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (ClassNotFoundException cnf)
|
||||||
|
{ // translate exception here so we only throw one type
|
||||||
|
throw new IOException("invalid stream data format");
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
} // end loadFromStream
|
||||||
|
|
||||||
|
public static Lexicon loadFromFile(File file, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
FileInputStream fstm = new FileInputStream(file);
|
||||||
|
try
|
||||||
|
{ // load the object data and return it
|
||||||
|
return loadFromStream(fstm,compress);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // close the file before leaving
|
||||||
|
fstm.close();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end loadFromFile
|
||||||
|
|
||||||
|
public static Lexicon loadFromFile(String filename, boolean compress) throws IOException
|
||||||
|
{
|
||||||
|
FileInputStream fstm = new FileInputStream(filename);
|
||||||
|
try
|
||||||
|
{ // load the object data and return it
|
||||||
|
return loadFromStream(fstm,compress);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // close the file before leaving
|
||||||
|
fstm.close();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end loadFromFile
|
||||||
|
|
||||||
|
} // end class Lexicon
|
117
src/com/silverwrist/venice/htmlcheck/dict/LexiconBuilder.java
Normal file
117
src/com/silverwrist/venice/htmlcheck/dict/LexiconBuilder.java
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.dict;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
public class LexiconBuilder
|
||||||
|
{
|
||||||
|
private LexiconBuilder()
|
||||||
|
{ // cannot construct this object
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
private static final String USAGE = "Usage: LexiconBuilder [-c] outputfile inputfile [...]";
|
||||||
|
|
||||||
|
public static void main(String args[])
|
||||||
|
{
|
||||||
|
if (args.length==0)
|
||||||
|
{ // print the usage string and exit
|
||||||
|
System.err.println(USAGE);
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
boolean compress = false;
|
||||||
|
int ofx = 0;
|
||||||
|
if (args[0].equals("-c"))
|
||||||
|
{ // we're compressing the output
|
||||||
|
compress = true;
|
||||||
|
if (++ofx>=args.length)
|
||||||
|
{ // no output filename specified!
|
||||||
|
System.err.println("No output file specified!");
|
||||||
|
System.err.println(USAGE);
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
int ifx = ofx + 1;
|
||||||
|
if (ifx>=args.length)
|
||||||
|
{ // no input filename specified!
|
||||||
|
System.err.println("No input file specified!");
|
||||||
|
System.err.println(USAGE);
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
Lexicon lex = new Lexicon(); // initialize lexicon object
|
||||||
|
|
||||||
|
while (ifx<args.length)
|
||||||
|
{ // load each file in turn
|
||||||
|
try
|
||||||
|
{ // start reading the file
|
||||||
|
BufferedReader rdr = new BufferedReader(new FileReader(args[ifx]));
|
||||||
|
System.out.println("Loading from file " + args[ifx]);
|
||||||
|
|
||||||
|
int ctr = 0;
|
||||||
|
String word = rdr.readLine();
|
||||||
|
while (word!=null)
|
||||||
|
{ // add each word to the lexicon as we go
|
||||||
|
lex.addWord(word);
|
||||||
|
if (((++ctr) % 1000)==0)
|
||||||
|
System.out.println("...read " + String.valueOf(ctr) + " words");
|
||||||
|
word = rdr.readLine();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
rdr.close();
|
||||||
|
System.out.println("Finished reading " + args[ifx] + ", " + String.valueOf(ctr) + " words read");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // just die on IOException
|
||||||
|
System.err.println("Error loading " + args[ifx] + ": " + e.getMessage());
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
ifx++; // go to next file
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
System.out.println("All input files loaded, " + String.valueOf(lex.size()) + " words in total");
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // save the lexicon to its very own file
|
||||||
|
lex.saveToFile(args[ofx],compress);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // just die on IOException
|
||||||
|
System.err.println("Error writing to " + args[ofx] + ": " + e.getMessage());
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
System.out.println("Wrote " + args[ofx] + ", LexiconBuilder complete.");
|
||||||
|
System.exit(0);
|
||||||
|
|
||||||
|
} // end main
|
||||||
|
|
||||||
|
} // end class LexiconBuilder
|
89
src/com/silverwrist/venice/htmlcheck/dict/LexiconTest.java
Normal file
89
src/com/silverwrist/venice/htmlcheck/dict/LexiconTest.java
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.dict;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class LexiconTest
|
||||||
|
{
|
||||||
|
private LexiconTest()
|
||||||
|
{ // this class cannot be instantiated
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
private static final String USAGE = "Usage: LexiconTest [-c] lexfile word [...]";
|
||||||
|
|
||||||
|
public static void main(String args[])
|
||||||
|
{
|
||||||
|
if (args.length==0)
|
||||||
|
{ // print the usage string and exit
|
||||||
|
System.err.println(USAGE);
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
boolean compress = false;
|
||||||
|
int ifx = 0;
|
||||||
|
if (args[0].equals("-c"))
|
||||||
|
{ // we're compressing the output
|
||||||
|
compress = true;
|
||||||
|
if (++ifx>=args.length)
|
||||||
|
{ // no lexicon specified!
|
||||||
|
System.err.println("No lexicon file specified!");
|
||||||
|
System.err.println(USAGE);
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
int wfx = ifx + 1;
|
||||||
|
Lexicon lex = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // save the lexicon to its very own file
|
||||||
|
System.out.println("Loading " + args[ifx] + "...");
|
||||||
|
Date start = new Date();
|
||||||
|
lex = Lexicon.loadFromFile(args[ifx],compress);
|
||||||
|
Date stop = new Date();
|
||||||
|
long interval = stop.getTime() - start.getTime();
|
||||||
|
System.out.println("Loaded " + args[ifx] + ", elapsed time " + String.valueOf(interval/1000) + "."
|
||||||
|
+ String.valueOf(interval%1000) + " seconds");
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // just die on IOException
|
||||||
|
System.err.println("Error loading from " + args[ifx] + ": " + e.getMessage());
|
||||||
|
System.exit(1);
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
|
||||||
|
while (wfx<args.length)
|
||||||
|
{ // check each word specified on the command line
|
||||||
|
if (lex.checkWord(args[wfx]))
|
||||||
|
System.out.println(args[wfx] + ": in the dictionary");
|
||||||
|
else
|
||||||
|
System.out.println(args[wfx] + ": NOT in the dictionary");
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
System.exit(0);
|
||||||
|
|
||||||
|
} // end main
|
||||||
|
|
||||||
|
} // end class LexiconTest
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.filters;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||||
|
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||||
|
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||||
|
|
||||||
|
public class EmailRewriter implements Rewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public EmailRewriter()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Rewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, RewriterServices svc)
|
||||||
|
{
|
||||||
|
int at_pos = data.indexOf('@');
|
||||||
|
if ((at_pos<=0) || (at_pos==(data.length()-1)))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// TODO: put in more validation checking
|
||||||
|
|
||||||
|
// build the <A> tag (the gnarliest part)
|
||||||
|
StringBuffer open_a = new StringBuffer("<A HREF=\"mailto:");
|
||||||
|
open_a.append(data).append("\"");
|
||||||
|
String catenate = svc.getRewriterAttrValue("ANCHORTAIL");
|
||||||
|
if ((catenate!=null) && (catenate.length()>0))
|
||||||
|
open_a.append(' ').append(catenate);
|
||||||
|
open_a.append('>');
|
||||||
|
|
||||||
|
// return the markup data back to the checker
|
||||||
|
return new MarkupData(open_a.toString(),data,"</A>");
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
} // end class EmailRewriter
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.filters;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.htmlcheck.OutputFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An output filter for <CODE>HTMLChecker</CODE> that escapes the three basic characters
|
||||||
|
* used by HTML formatting. It translates the following characters:
|
||||||
|
* <UL>
|
||||||
|
* <LI>< - &lt;</LI>
|
||||||
|
* <LI>> - &gt;</LI>
|
||||||
|
* <LI>& - &amp;</LI>
|
||||||
|
* </UL>
|
||||||
|
*
|
||||||
|
* @author Eric J. Bowersox <erbo@silcom.com>
|
||||||
|
* @see HTMLOutputFilter
|
||||||
|
* @see HTMLChecker#addOutputFilter
|
||||||
|
*/
|
||||||
|
public class HTMLEncodingFilter implements OutputFilter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String ESCAPED_CHARACTERS = "<>&";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of <CODE>HTMLEncodingFilter.</CODE>
|
||||||
|
*/
|
||||||
|
public HTMLEncodingFilter()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface OutputFilter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks and possibly outputs a character. If the character <CODE>ch</CODE> is '<',
|
||||||
|
* '>', or '&', it appends the appropriate string to the string buffer
|
||||||
|
* <CODE>buf</CODE> and returns <CODE>true</CODE>. If not, it returns <CODE>false</CODE>
|
||||||
|
* and leaves the buffer alone.
|
||||||
|
*
|
||||||
|
* @param buf The string buffer to append the character equivalent to.
|
||||||
|
* @param ch The character to be checked and possibly output.
|
||||||
|
* @return <CODE>true</CODE> if the character matches and was output,
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
* @see #matchCharacter
|
||||||
|
* @see HTMLOutputFilter#tryOutputCharacter
|
||||||
|
*/
|
||||||
|
public boolean tryOutputCharacter(StringBuffer buf, char ch)
|
||||||
|
{
|
||||||
|
switch (ch)
|
||||||
|
{ // turn the HTML flag characters into appropriate entity escapes
|
||||||
|
case '<':
|
||||||
|
buf.append("<");
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case '>':
|
||||||
|
buf.append(">");
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case '&':
|
||||||
|
buf.append("&");
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end switch
|
||||||
|
|
||||||
|
return false; // bail out! not one we handle!
|
||||||
|
|
||||||
|
} // end tryOutputCharacter
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns <CODE>true</CODE> if the character <CODE>ch</CODE> is '<', '>', or '&',
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
*
|
||||||
|
* @param ch The character to be tested.
|
||||||
|
* @return <CODE>true</CODE> if the character <CODE>ch</CODE> is '<', '>', or '&',
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
* @see #tryOutputCharacter
|
||||||
|
* @see #lengthNoMatch
|
||||||
|
* @see HTMLOutputFilter#matchCharacter
|
||||||
|
*/
|
||||||
|
public boolean matchCharacter(char ch)
|
||||||
|
{
|
||||||
|
return (ESCAPED_CHARACTERS.indexOf(ch)>=0);
|
||||||
|
|
||||||
|
} // end matchCharacter
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a character string, returns the total number of characters in that string,
|
||||||
|
* starting from the beginning, that are <I>not</I> handled by this filter before
|
||||||
|
* one that <I>is</I> appears. If none of the characters in this string are handled
|
||||||
|
* by the filter, the length of the string is returned.
|
||||||
|
*
|
||||||
|
* @param s The string to scan through.
|
||||||
|
* @return The length of the initial sequence of non-matching characters in this string.
|
||||||
|
* @see #matchCharacter
|
||||||
|
* @see HTMLOutputFilter#lengthNoMatch
|
||||||
|
*/
|
||||||
|
public int lengthNoMatch(String s)
|
||||||
|
{
|
||||||
|
int rc = s.length();
|
||||||
|
int i;
|
||||||
|
for (i=0; i<ESCAPED_CHARACTERS.length(); i++)
|
||||||
|
{ // look for one of the escaped characters in the string...
|
||||||
|
int tmp = s.indexOf(ESCAPED_CHARACTERS.charAt(i));
|
||||||
|
if ((tmp>=0) && (tmp<rc))
|
||||||
|
{ // we have a new return value
|
||||||
|
rc = tmp;
|
||||||
|
if (rc==0)
|
||||||
|
break; // can't get any lower!
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end lengthNoMatch
|
||||||
|
|
||||||
|
} // end class HTMLEncodingFilter
|
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.filters;
|
||||||
|
|
||||||
|
import com.silverwrist.venice.htmlcheck.OutputFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An output filter for <CODE>HTMLChecker</CODE> that escapes the apostrophe character
|
||||||
|
* (the SQL quote character) by doubling it.
|
||||||
|
*
|
||||||
|
* @author Eric J. Bowersox <erbo@silcom.com>
|
||||||
|
* @see OutputFilter
|
||||||
|
* @see HTMLChecker#addOutputFilter
|
||||||
|
*/
|
||||||
|
public class SQLEncodingFilter implements OutputFilter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of <CODE>SQLEncodingFilter.</CODE>
|
||||||
|
*/
|
||||||
|
public SQLEncodingFilter()
|
||||||
|
{ // do nothing
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface OutputFilter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks and possibly outputs a character. If the character <CODE>ch</CODE> is
|
||||||
|
* an apostrophe, it appends two apostrophes to the string buffer
|
||||||
|
* <CODE>buf</CODE> and returns <CODE>true</CODE>. If not, it returns <CODE>false</CODE>
|
||||||
|
* and leaves the buffer alone.
|
||||||
|
*
|
||||||
|
* @param buf The string buffer to append the character equivalent to.
|
||||||
|
* @param ch The character to be checked and possibly output.
|
||||||
|
* @return <CODE>true</CODE> if the character matches and was output,
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
* @see #matchCharacter
|
||||||
|
* @see HTMLOutputFilter#tryOutputCharacter
|
||||||
|
*/
|
||||||
|
public boolean tryOutputCharacter(StringBuffer buf, char ch)
|
||||||
|
{
|
||||||
|
if (ch=='\'')
|
||||||
|
{ // convert one apostrophe into two
|
||||||
|
buf.append("\'\'");
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end tryOutputCharacter
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns <CODE>true</CODE> if the character <CODE>ch</CODE> is an apostrophe,
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
*
|
||||||
|
* @param ch The character to be tested.
|
||||||
|
* @return <CODE>true</CODE> if the character <CODE>ch</CODE> is an apostrophe,
|
||||||
|
* <CODE>false</CODE> if not.
|
||||||
|
* @see #tryOutputCharacter
|
||||||
|
* @see #lengthNoMatch
|
||||||
|
* @see HTMLOutputFilter#matchCharacter
|
||||||
|
*/
|
||||||
|
public boolean matchCharacter(char ch)
|
||||||
|
{
|
||||||
|
return (ch=='\'');
|
||||||
|
|
||||||
|
} // end matchCharacter
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a character string, returns the total number of characters in that string,
|
||||||
|
* starting from the beginning, that are <I>not</I> handled by this filter before
|
||||||
|
* one that <I>is</I> appears. If none of the characters in this string are handled
|
||||||
|
* by the filter, the length of the string is returned.
|
||||||
|
*
|
||||||
|
* @param s The string to scan through.
|
||||||
|
* @return The length of the initial sequence of non-matching characters in this string.
|
||||||
|
* @see #matchCharacter
|
||||||
|
* @see HTMLOutputFilter#lengthNoMatch
|
||||||
|
*/
|
||||||
|
public int lengthNoMatch(String s)
|
||||||
|
{
|
||||||
|
int rc = s.indexOf('\'');
|
||||||
|
if (rc<0)
|
||||||
|
rc = s.length();
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end lengthNoMatch
|
||||||
|
|
||||||
|
} // end class SQLEncodingFilter
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.filters;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||||
|
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||||
|
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||||
|
import com.silverwrist.venice.htmlcheck.SpellingDictionary;
|
||||||
|
|
||||||
|
public class SpellingRewriter implements Rewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String DEFAULT_BEGIN_ERROR = "<FONT COLOR=\"red\"><B>";
|
||||||
|
private static final String DEFAULT_END_ERROR = "</B></FONT>";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Vector dictionaries = new Vector();
|
||||||
|
private String begin_error = DEFAULT_BEGIN_ERROR;
|
||||||
|
private String end_error = DEFAULT_END_ERROR;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public SpellingRewriter()
|
||||||
|
{ // do nothing here
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Rewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return "spelling";
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, RewriterServices svc)
|
||||||
|
{
|
||||||
|
Iterator it = dictionaries.iterator();
|
||||||
|
while (it.hasNext())
|
||||||
|
{ // check each stored dictionary in turn
|
||||||
|
SpellingDictionary dict = (SpellingDictionary)(it.next());
|
||||||
|
if (dict.checkWord(data))
|
||||||
|
return null; // it's in a dictionary, that means it's spelled right
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
// not found - it's spelled wrong
|
||||||
|
return new MarkupData(begin_error,data,end_error);
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void addDictionary(SpellingDictionary dict)
|
||||||
|
{
|
||||||
|
dictionaries.add(dict);
|
||||||
|
|
||||||
|
} // end addDictionary
|
||||||
|
|
||||||
|
public String getBeginError()
|
||||||
|
{
|
||||||
|
return begin_error;
|
||||||
|
|
||||||
|
} // end getBeginError
|
||||||
|
|
||||||
|
public void setBeginError(String val)
|
||||||
|
{
|
||||||
|
begin_error = val;
|
||||||
|
|
||||||
|
} // end setBeginError
|
||||||
|
|
||||||
|
public String getEndError()
|
||||||
|
{
|
||||||
|
return end_error;
|
||||||
|
|
||||||
|
} // end getEndError
|
||||||
|
|
||||||
|
public void setEndError(String val)
|
||||||
|
{
|
||||||
|
end_error = val;
|
||||||
|
|
||||||
|
} // end setEndError
|
||||||
|
|
||||||
|
} // end class SpellingRewriter
|
||||||
|
|
||||||
|
|
114
src/com/silverwrist/venice/htmlcheck/filters/URLRewriter.java
Normal file
114
src/com/silverwrist/venice/htmlcheck/filters/URLRewriter.java
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.filters;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||||
|
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||||
|
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||||
|
|
||||||
|
public class URLRewriter implements Rewriter
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String NULLSTRING = "";
|
||||||
|
private static Hashtable prefix_list = null;
|
||||||
|
private static boolean set_up = true;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public URLRewriter()
|
||||||
|
{
|
||||||
|
setUpPrefixes(); // make sure the prefix data is set up
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static void setUpPrefixes()
|
||||||
|
{
|
||||||
|
if (set_up)
|
||||||
|
{ // allocate the hash table
|
||||||
|
set_up = false;
|
||||||
|
prefix_list = new Hashtable(10,0.9F);
|
||||||
|
|
||||||
|
// fill it with the proper URL prefixes
|
||||||
|
prefix_list.put("http:",NULLSTRING);
|
||||||
|
prefix_list.put("ftp:",NULLSTRING);
|
||||||
|
prefix_list.put("gopher:",NULLSTRING);
|
||||||
|
prefix_list.put("mailto:",NULLSTRING);
|
||||||
|
prefix_list.put("news:",NULLSTRING);
|
||||||
|
prefix_list.put("nntp:",NULLSTRING);
|
||||||
|
prefix_list.put("telnet:",NULLSTRING);
|
||||||
|
prefix_list.put("tn3270:",NULLSTRING);
|
||||||
|
prefix_list.put("www.",new String("http://"));
|
||||||
|
prefix_list.put("ftp.",new String("ftp://"));
|
||||||
|
prefix_list.put("gopher.",new String("gopher://"));
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end setUpPrefixes
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface Rewriter
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
public MarkupData rewrite(String data, RewriterServices svc)
|
||||||
|
{
|
||||||
|
Enumeration prefixes = prefix_list.keys();
|
||||||
|
while (prefixes.hasMoreElements())
|
||||||
|
{ // get the next prefix and compare against the beginning of the string
|
||||||
|
String pfx = (String)(prefixes.nextElement());
|
||||||
|
if (data.regionMatches(true,0,pfx,0,pfx.length()))
|
||||||
|
{ // good enough! build the open <A> tag (the gnarliest part of the markup)
|
||||||
|
StringBuffer open_a = new StringBuffer("<A HREF=\"");
|
||||||
|
String catenate = (String)(prefix_list.get(pfx));
|
||||||
|
open_a.append(catenate).append(data).append("\"");
|
||||||
|
catenate = svc.getRewriterAttrValue("ANCHORTAIL");
|
||||||
|
if ((catenate!=null) && (catenate.length()>0))
|
||||||
|
open_a.append(' ').append(catenate);
|
||||||
|
open_a.append('>');
|
||||||
|
|
||||||
|
// here's how you mark it up!
|
||||||
|
return new MarkupData(open_a.toString(),data,"</A>");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
return null; // sorry, no can do
|
||||||
|
|
||||||
|
} // end rewrite
|
||||||
|
|
||||||
|
} // end class URLRewriter
|
49
src/com/silverwrist/venice/htmlcheck/impl/BalancedTag.java
Normal file
49
src/com/silverwrist/venice/htmlcheck/impl/BalancedTag.java
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class BalancedTag extends OpenCloseTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
BalancedTag(String name, boolean brk)
|
||||||
|
{
|
||||||
|
super(name,brk);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public final boolean balanceTags()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} // end balanceTags
|
||||||
|
|
||||||
|
} // end class BalancedTag
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
public interface HTMLCheckerBackend
|
||||||
|
{
|
||||||
|
public abstract String getCheckerAttrValue(String name);
|
||||||
|
|
||||||
|
public abstract void sendTagMessage(String msg);
|
||||||
|
|
||||||
|
public abstract Object getCheckerContextValue(String name);
|
||||||
|
|
||||||
|
} // end interface HTMLCheckerBackend
|
|
@ -0,0 +1,252 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.*;
|
||||||
|
|
||||||
|
public class HTMLCheckerConfigImpl implements HTMLCheckerConfig
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String DEFAULT_ANCHOR_TAIL = "TARGET=\"Wander\"";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private boolean process_angles = true; // process angle-bracketed strings?
|
||||||
|
private boolean process_parens = true; // process parenthesized strings?
|
||||||
|
private boolean discard_html_tags = false; // discard all HTML tags?
|
||||||
|
private short word_wrap_length = 0; // word wrap length
|
||||||
|
private String anchor_tail = DEFAULT_ANCHOR_TAIL; // the tail end of the anchor
|
||||||
|
private BitSet allowed_tagsets = new BitSet(); // which tagsets are allowed?
|
||||||
|
private Vector output_filters = new Vector(); // output filters
|
||||||
|
private Vector raw_output_filters = new Vector(); // output filters only applied in "raw mode"
|
||||||
|
private Vector string_rewriters = new Vector(); // rewriters that operate on full "strings"
|
||||||
|
private Vector word_rewriters = new Vector(); // rewriters that operate on "words" only
|
||||||
|
private Vector tag_rewriters = new Vector(); // rewriters that operate on <tags> only
|
||||||
|
private Vector paren_rewriters = new Vector(); // rewriters that operate on (parens) only
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
HTMLCheckerConfigImpl()
|
||||||
|
{
|
||||||
|
TagRepository.init();
|
||||||
|
TagRepository.configureNormalSet(allowed_tagsets);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface HTMLCheckerConfig
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public short getWordWrapLength()
|
||||||
|
{
|
||||||
|
return word_wrap_length;
|
||||||
|
|
||||||
|
} // end getWordWrapLength
|
||||||
|
|
||||||
|
public void setWordWrapLength(short val)
|
||||||
|
{
|
||||||
|
if (val<0)
|
||||||
|
word_wrap_length = 0;
|
||||||
|
else
|
||||||
|
word_wrap_length = val;
|
||||||
|
|
||||||
|
} // end setWordWrapLength
|
||||||
|
|
||||||
|
public boolean getProcessAngles()
|
||||||
|
{
|
||||||
|
return process_angles;
|
||||||
|
|
||||||
|
} // end getProcessAngles
|
||||||
|
|
||||||
|
public void setProcessAngles(boolean val)
|
||||||
|
{
|
||||||
|
process_angles = val;
|
||||||
|
|
||||||
|
} // end setProcessAngles
|
||||||
|
|
||||||
|
public boolean getProcessParens()
|
||||||
|
{
|
||||||
|
return process_parens;
|
||||||
|
|
||||||
|
} // end getProcessParens
|
||||||
|
|
||||||
|
public void setProcessParens(boolean val)
|
||||||
|
{
|
||||||
|
process_parens = val;
|
||||||
|
|
||||||
|
} // end setProcessParens
|
||||||
|
|
||||||
|
public boolean getDiscardHTMLTags()
|
||||||
|
{
|
||||||
|
return discard_html_tags;
|
||||||
|
|
||||||
|
} // end getDiscardHTMLTags
|
||||||
|
|
||||||
|
public void setDiscardHTMLTags(boolean val)
|
||||||
|
{
|
||||||
|
discard_html_tags = val;
|
||||||
|
|
||||||
|
} // end setDiscardHTMLTags
|
||||||
|
|
||||||
|
public String getAnchorTail()
|
||||||
|
{
|
||||||
|
return anchor_tail;
|
||||||
|
|
||||||
|
} // end getAnchorTail
|
||||||
|
|
||||||
|
public void setAnchorTail(String s)
|
||||||
|
{
|
||||||
|
anchor_tail = s;
|
||||||
|
|
||||||
|
} // end setAnchorTail
|
||||||
|
|
||||||
|
public void addOutputFilter(OutputFilter filter)
|
||||||
|
{
|
||||||
|
output_filters.add(filter);
|
||||||
|
|
||||||
|
} // end addOutputFilter
|
||||||
|
|
||||||
|
public void addRawOutputFilter(OutputFilter filter)
|
||||||
|
{
|
||||||
|
raw_output_filters.add(filter);
|
||||||
|
|
||||||
|
} // end addRawOutputFilter
|
||||||
|
|
||||||
|
public void addStringRewriter(Rewriter rewriter)
|
||||||
|
{
|
||||||
|
string_rewriters.add(rewriter);
|
||||||
|
|
||||||
|
} // end addStringRewriter
|
||||||
|
|
||||||
|
public void addWordRewriter(Rewriter rewriter)
|
||||||
|
{
|
||||||
|
word_rewriters.add(rewriter);
|
||||||
|
|
||||||
|
} // end addWordRewriter
|
||||||
|
|
||||||
|
public void addTagRewriter(Rewriter rewriter)
|
||||||
|
{
|
||||||
|
tag_rewriters.add(rewriter);
|
||||||
|
|
||||||
|
} // end addTagRewriter
|
||||||
|
|
||||||
|
public void addParenRewriter(Rewriter rewriter)
|
||||||
|
{
|
||||||
|
} // end addParenRewriter
|
||||||
|
|
||||||
|
public boolean isTagSetAllowed(int setid)
|
||||||
|
{
|
||||||
|
return allowed_tagsets.get(setid);
|
||||||
|
|
||||||
|
} // end isTagSetAllowed
|
||||||
|
|
||||||
|
public void allowTagSet(int setid)
|
||||||
|
{
|
||||||
|
allowed_tagsets.set(setid);
|
||||||
|
|
||||||
|
} // end allowTagSet
|
||||||
|
|
||||||
|
public void disallowTagSet(int setid)
|
||||||
|
{
|
||||||
|
allowed_tagsets.clear(setid);
|
||||||
|
|
||||||
|
} // end disallowTagSet
|
||||||
|
|
||||||
|
public void configureNormalTagSet()
|
||||||
|
{
|
||||||
|
TagRepository.configureNormalSet(allowed_tagsets);
|
||||||
|
|
||||||
|
} // end configureNormalTagSet
|
||||||
|
|
||||||
|
public void configureRestrictedTagSet()
|
||||||
|
{
|
||||||
|
TagRepository.configureRestrictedSet(allowed_tagsets);
|
||||||
|
|
||||||
|
} // end configureRestrictedTagSet
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Operations usable only from within the package
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
List getOutputFilters()
|
||||||
|
{
|
||||||
|
return output_filters;
|
||||||
|
|
||||||
|
} // end getOutputFilters
|
||||||
|
|
||||||
|
List getRawOutputFilters()
|
||||||
|
{
|
||||||
|
return raw_output_filters;
|
||||||
|
|
||||||
|
} // end getRawOutputFilters
|
||||||
|
|
||||||
|
List getStringRewriters()
|
||||||
|
{
|
||||||
|
return string_rewriters;
|
||||||
|
|
||||||
|
} // end getStringRewriters
|
||||||
|
|
||||||
|
List getWordRewriters()
|
||||||
|
{
|
||||||
|
return word_rewriters;
|
||||||
|
|
||||||
|
} // end getWordRewriters
|
||||||
|
|
||||||
|
List getTagRewriters()
|
||||||
|
{
|
||||||
|
return tag_rewriters;
|
||||||
|
|
||||||
|
} // end getTagRewriters
|
||||||
|
|
||||||
|
List getParenRewriters()
|
||||||
|
{
|
||||||
|
return paren_rewriters;
|
||||||
|
|
||||||
|
} // end getParenRewriters
|
||||||
|
|
||||||
|
public HTMLChecker createHTMLChecker()
|
||||||
|
{
|
||||||
|
return new HTMLCheckerImpl(this);
|
||||||
|
|
||||||
|
} // end createHTMLChecker
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static HTMLCheckerConfig createHTMLCheckerConfig()
|
||||||
|
{
|
||||||
|
return new HTMLCheckerConfigImpl();
|
||||||
|
|
||||||
|
} // end createHTMLCheckerConfig
|
||||||
|
|
||||||
|
} // end class HTMLCheckerConfigImpl
|
1111
src/com/silverwrist/venice/htmlcheck/impl/HTMLCheckerImpl.java
Normal file
1111
src/com/silverwrist/venice/htmlcheck/impl/HTMLCheckerImpl.java
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class ListElementTag extends OpenCloseTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ListElementTag(String name)
|
||||||
|
{
|
||||||
|
super(name,true);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public boolean causeLineBreak(boolean is_closing)
|
||||||
|
{
|
||||||
|
return !is_closing;
|
||||||
|
|
||||||
|
} // end causeLineBreak
|
||||||
|
|
||||||
|
} // end class ListElementTag
|
50
src/com/silverwrist/venice/htmlcheck/impl/OpenCloseTag.java
Normal file
50
src/com/silverwrist/venice/htmlcheck/impl/OpenCloseTag.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class OpenCloseTag extends SimpleTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
OpenCloseTag(String name, boolean brk)
|
||||||
|
{
|
||||||
|
super(name,brk);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public final boolean allowClose()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} // end allowClose
|
||||||
|
|
||||||
|
public final String makeClosingTag()
|
||||||
|
{
|
||||||
|
return "</" + getTagName() + ">";
|
||||||
|
|
||||||
|
} // end makeClosingTag
|
||||||
|
|
||||||
|
} // end class OpenCloseTag
|
103
src/com/silverwrist/venice/htmlcheck/impl/SimpleTag.java
Normal file
103
src/com/silverwrist/venice/htmlcheck/impl/SimpleTag.java
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class SimpleTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String tagname; // the name of the tag
|
||||||
|
private boolean linebreak; // does tag cause line breaks?
|
||||||
|
private int index; // index of the tag
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SimpleTag(String name, boolean brk)
|
||||||
|
{
|
||||||
|
tagname = name.toUpperCase();
|
||||||
|
linebreak = brk;
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Operations usable only within the package
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
final void setIndex(int ndx)
|
||||||
|
{
|
||||||
|
if (index==-1)
|
||||||
|
index = ndx;
|
||||||
|
|
||||||
|
} // end setIndex
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getTagName()
|
||||||
|
{
|
||||||
|
return tagname;
|
||||||
|
|
||||||
|
} // end getTagName
|
||||||
|
|
||||||
|
public boolean allowClose()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end allowClose
|
||||||
|
|
||||||
|
public boolean balanceTags()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} // end balanceTags
|
||||||
|
|
||||||
|
public boolean causeLineBreak(boolean is_closing)
|
||||||
|
{
|
||||||
|
return linebreak;
|
||||||
|
|
||||||
|
} // end causeLineBreak
|
||||||
|
|
||||||
|
public final int getIndex()
|
||||||
|
{
|
||||||
|
return index;
|
||||||
|
|
||||||
|
} // end getIndex
|
||||||
|
|
||||||
|
public String makeClosingTag()
|
||||||
|
{
|
||||||
|
throw new RuntimeException("cannot make closing tags of SimpleTag");
|
||||||
|
|
||||||
|
} // end makeClosingTag
|
||||||
|
|
||||||
|
public String rewriteTagContents(String contents, boolean is_closing, HTMLCheckerBackend context)
|
||||||
|
{
|
||||||
|
return contents; // just let everything pass for now
|
||||||
|
|
||||||
|
} // end rewriteTagContents
|
||||||
|
|
||||||
|
} // end class SimpleTag
|
124
src/com/silverwrist/venice/htmlcheck/impl/TagA.java
Normal file
124
src/com/silverwrist/venice/htmlcheck/impl/TagA.java
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class TagA extends BalancedTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal static data
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String TARGET_ATTR = "TARGET";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
TagA()
|
||||||
|
{
|
||||||
|
super("A",false);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String rewriteTagContents(String contents, boolean is_closing, HTMLCheckerBackend context)
|
||||||
|
{
|
||||||
|
if (is_closing)
|
||||||
|
return contents; // don't bother checking close tags
|
||||||
|
|
||||||
|
// Skip over the initial word of the tag data, as that's the tag name.
|
||||||
|
int i = 0;
|
||||||
|
while ((i!=contents.length()) && !(Character.isWhitespace(contents.charAt(i))))
|
||||||
|
i++;
|
||||||
|
|
||||||
|
// Search for the TARGET= attribute in the tag data.
|
||||||
|
boolean target_seen = false;
|
||||||
|
while (i!=contents.length())
|
||||||
|
{ // skip over any whitespace between one attribute (or the name) and the next one
|
||||||
|
while ((i!=contents.length()) && Character.isWhitespace(contents.charAt(i)))
|
||||||
|
i++;
|
||||||
|
if (i==contents.length())
|
||||||
|
break; // reached end of string, all done searching
|
||||||
|
|
||||||
|
// Mark the start of this attribute name and start skipping over it.
|
||||||
|
int start_name = i;
|
||||||
|
while ((i!=contents.length()) && !(Character.isWhitespace(contents.charAt(i)))
|
||||||
|
&& (contents.charAt(i)!='='))
|
||||||
|
i++;
|
||||||
|
|
||||||
|
// We now know where the attribute name is, see if it's "TARGET".
|
||||||
|
if ((i-start_name)==TARGET_ATTR.length())
|
||||||
|
{ // compare the substring to see if it's right
|
||||||
|
String name = contents.substring(start_name,i);
|
||||||
|
if (name.equalsIgnoreCase(TARGET_ATTR))
|
||||||
|
{ // OK, we saw the TARGET tag in the list! Bail out!
|
||||||
|
target_seen = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
while ((i!=contents.length()) && Character.isWhitespace(contents.charAt(i)))
|
||||||
|
i++; // skip over whitespace at end of name but before the = sign
|
||||||
|
|
||||||
|
if ((i<contents.length()) && (contents.charAt(i)=='='))
|
||||||
|
{ // skip over the = sign first
|
||||||
|
i++;
|
||||||
|
while ((i!=contents.length()) && Character.isWhitespace(contents.charAt(i)))
|
||||||
|
i++; // skip over whitespace after the = sign
|
||||||
|
|
||||||
|
if (i==contents.length())
|
||||||
|
break; // reached end of string, all done searching
|
||||||
|
|
||||||
|
if ((contents.charAt(i)=='\'') || (contents.charAt(i)=='\"'))
|
||||||
|
{ // this is a quoted string - swallow it
|
||||||
|
char quote_char = contents.charAt(i++); // skip the quote part
|
||||||
|
while ((i!=contents.length()) && (contents.charAt(i)!=quote_char))
|
||||||
|
i++; // skip over data between quotes
|
||||||
|
if (i!=contents.length())
|
||||||
|
i++; // skip over last quote
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
{ // skip over a single word
|
||||||
|
while ((i!=contents.length()) && !(Character.isWhitespace(contents.charAt(i))))
|
||||||
|
i++;
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
// else this tag had no value - just go on to the next one
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
if (target_seen)
|
||||||
|
return contents; // no need to alter the string
|
||||||
|
|
||||||
|
String tail = (String)(context.getCheckerAttrValue("ANCHORTAIL"));
|
||||||
|
return new String(contents + " " + tail);
|
||||||
|
|
||||||
|
} // end rewriteTagContents
|
||||||
|
|
||||||
|
} // end class TagA
|
48
src/com/silverwrist/venice/htmlcheck/impl/TagNOBR.java
Normal file
48
src/com/silverwrist/venice/htmlcheck/impl/TagNOBR.java
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class TagNOBR extends BalancedTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
TagNOBR()
|
||||||
|
{
|
||||||
|
super("NOBR",false);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String rewriteTagContents(String contents, boolean is_closing, HTMLCheckerBackend context)
|
||||||
|
{
|
||||||
|
if (is_closing)
|
||||||
|
context.sendTagMessage("/NOBR");
|
||||||
|
else
|
||||||
|
context.sendTagMessage("NOBR");
|
||||||
|
return contents;
|
||||||
|
|
||||||
|
} // end rewriteTagContents
|
||||||
|
|
||||||
|
} // end class TagNOBR
|
243
src/com/silverwrist/venice/htmlcheck/impl/TagRepository.java
Normal file
243
src/com/silverwrist/venice/htmlcheck/impl/TagRepository.java
Normal file
|
@ -0,0 +1,243 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.htmlcheck.HTMLTagSets;
|
||||||
|
|
||||||
|
class TagRepository implements HTMLTagSets
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Hashtable tagname_to_index = new Hashtable(50,0.9F);
|
||||||
|
private static Vector index_to_object = new Vector();
|
||||||
|
private static Vector index_to_setid = new Vector();
|
||||||
|
private static int maxlength = 0;
|
||||||
|
private static boolean initialized = false;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal functions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static void enshrineTag(SimpleTag tag, int set)
|
||||||
|
{
|
||||||
|
int ndx = index_to_object.size();
|
||||||
|
index_to_object.add(tag);
|
||||||
|
index_to_setid.add(new Integer(set));
|
||||||
|
tag.setIndex(ndx);
|
||||||
|
tagname_to_index.put(new String(tag.getTagName()),new Integer(ndx));
|
||||||
|
int newlen = tag.getTagName().length();
|
||||||
|
if (newlen>maxlength)
|
||||||
|
maxlength = newlen;
|
||||||
|
|
||||||
|
} // end enshrineTag
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static void init()
|
||||||
|
{
|
||||||
|
if (!initialized)
|
||||||
|
{ // set the flag so we don't do this again
|
||||||
|
initialized = true;
|
||||||
|
|
||||||
|
// begin enshrining the tags!
|
||||||
|
enshrineTag(new SimpleTag("!DOCTYPE",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("%",false),SERVER_PAGE);
|
||||||
|
enshrineTag(new SimpleTag("%=",false),SERVER_PAGE);
|
||||||
|
enshrineTag(new SimpleTag("%@",false),SERVER_PAGE);
|
||||||
|
enshrineTag(new TagA(),ANCHOR);
|
||||||
|
enshrineTag(new BalancedTag("ABBR",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("ACRONYM",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("ADDRESS",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("APPLET",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new SimpleTag("AREA",false),IMAGE_MAPS);
|
||||||
|
enshrineTag(new BalancedTag("B",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("BASE",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("BASEFONT",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("BDO",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("BEAN",false),JAVA_SERVER);
|
||||||
|
enshrineTag(new SimpleTag("BGSOUND",false),MSFT_DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("BIG",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("BLINK",false),NSCP_INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("BLOCKQUOTE",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new OpenCloseTag("BODY",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("BR",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new OpenCloseTag("BUTTON",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("CAPTION",true),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("CENTER",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("CITE",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("CODE",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("COL",true),TABLES);
|
||||||
|
enshrineTag(new OpenCloseTag("COLGROUP",true),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("COMMENT",false),MSFT_INLINE_FORMAT);
|
||||||
|
enshrineTag(new ListElementTag("DD"),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("DEL",false),CHANGE_MARKUP);
|
||||||
|
enshrineTag(new BalancedTag("DFN",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("DIR",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("DIV",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("DL",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new ListElementTag("DT"),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("EM",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("EMBED",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("FIELDSET",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("FONT",false),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("FORM",false),FORMS);
|
||||||
|
enshrineTag(new SimpleTag("FRAME",true),FRAMES);
|
||||||
|
enshrineTag(new BalancedTag("FRAMESET",false),FRAMES);
|
||||||
|
enshrineTag(new BalancedTag("H1",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("H2",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("H3",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("H4",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("H5",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("H6",true),FONT_FORMAT);
|
||||||
|
enshrineTag(new OpenCloseTag("HEAD",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("HR",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new OpenCloseTag("HTML",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("I",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("IFRAME",true),FRAMES);
|
||||||
|
enshrineTag(new BalancedTag("ILAYER",true),NSCP_LAYERS);
|
||||||
|
enshrineTag(new SimpleTag("IMG",false),IMAGES);
|
||||||
|
enshrineTag(new SimpleTag("INPUT",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("INS",false),CHANGE_MARKUP);
|
||||||
|
enshrineTag(new SimpleTag("ISINDEX",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("KBD",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("KEYGEN",false),NSCP_FORMS);
|
||||||
|
enshrineTag(new BalancedTag("LABEL",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("LAYER",true),NSCP_LAYERS);
|
||||||
|
enshrineTag(new BalancedTag("LEGEND",false),FORMS);
|
||||||
|
enshrineTag(new ListElementTag("LI"),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("LINK",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("LISTING",false),MSFT_INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("MAP",false),IMAGE_MAPS);
|
||||||
|
enshrineTag(new BalancedTag("MARQUEE",true),MSFT_BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("MENU",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("META",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("MULTICOL",true),NSCP_BLOCK_FORMAT);
|
||||||
|
enshrineTag(new TagNOBR(),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("NOEMBED",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("NOFRAMES",false),FRAMES);
|
||||||
|
enshrineTag(new BalancedTag("NOLAYER",false),NSCP_LAYERS);
|
||||||
|
enshrineTag(new BalancedTag("NOSCRIPT",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("OBJECT",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("OL",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("OPTGROUP",false),FORMS);
|
||||||
|
enshrineTag(new ListElementTag("OPTION"),FORMS);
|
||||||
|
enshrineTag(new OpenCloseTag("P",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("PARAM",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new SimpleTag("PLAINTEXT",false),PREFORMAT);
|
||||||
|
enshrineTag(new BalancedTag("PRE",false),PREFORMAT);
|
||||||
|
enshrineTag(new BalancedTag("Q",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("RT",false),MSFT_ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("RUBY",false),MSFT_ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("S",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("SAMP",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("SCRIPT",false),ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("SELECT",false),FORMS);
|
||||||
|
enshrineTag(new BalancedTag("SERVER",false),NSCP_SERVER);
|
||||||
|
enshrineTag(new BalancedTag("SERVLET",false),JAVA_SERVER);
|
||||||
|
enshrineTag(new BalancedTag("SMALL",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new SimpleTag("SPACER",false),NSCP_INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("SPAN",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("STRIKE",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("STRONG",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("STYLE",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("SUB",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("SUP",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("TABLE",true),TABLES);
|
||||||
|
enshrineTag(new OpenCloseTag("TBODY",false),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("TD",true),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("TEXTAREA",true),FORMS);
|
||||||
|
enshrineTag(new OpenCloseTag("TFOOT",false),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("TH",true),TABLES);
|
||||||
|
enshrineTag(new OpenCloseTag("THEAD",false),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("TITLE",false),DOC_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("TR",true),TABLES);
|
||||||
|
enshrineTag(new BalancedTag("TT",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("U",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("UL",true),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("VAR",false),INLINE_FORMAT);
|
||||||
|
enshrineTag(new TagWBR(),BLOCK_FORMAT);
|
||||||
|
enshrineTag(new BalancedTag("XML",false),MSFT_ACTIVE_CONTENT);
|
||||||
|
enshrineTag(new BalancedTag("XMP",false),NSCP_INLINE_FORMAT);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end init
|
||||||
|
|
||||||
|
public static int getMaxTagLength()
|
||||||
|
{
|
||||||
|
return maxlength;
|
||||||
|
|
||||||
|
} // end getMaxTagLength
|
||||||
|
|
||||||
|
public static int tagNameToIndex(String tag)
|
||||||
|
{ // look up tag name and get index
|
||||||
|
Object obj = tagname_to_index.get(tag.toUpperCase());
|
||||||
|
if (obj==null)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return ((Integer)obj).intValue();
|
||||||
|
|
||||||
|
} // end tagNameToIndex
|
||||||
|
|
||||||
|
public static SimpleTag tagIndexToObject(int ndx)
|
||||||
|
{
|
||||||
|
Object obj = index_to_object.get(ndx);
|
||||||
|
if (obj==null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return (SimpleTag)obj;
|
||||||
|
|
||||||
|
} // end tagIndexToObject
|
||||||
|
|
||||||
|
public static int tagIndexToSet(int ndx)
|
||||||
|
{
|
||||||
|
Object obj = index_to_setid.get(ndx);
|
||||||
|
if (obj==null)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return ((Integer)obj).intValue();
|
||||||
|
|
||||||
|
} // end tagIndexToSet
|
||||||
|
|
||||||
|
public static void configureNormalSet(BitSet bs)
|
||||||
|
{
|
||||||
|
bs.xor(bs); // clears all bits presently set in the bitset
|
||||||
|
bs.set(INLINE_FORMAT);
|
||||||
|
bs.set(ANCHOR);
|
||||||
|
bs.set(BLOCK_FORMAT);
|
||||||
|
bs.set(FONT_FORMAT);
|
||||||
|
bs.set(IMAGES);
|
||||||
|
|
||||||
|
} // end configureNormalSet
|
||||||
|
|
||||||
|
public static void configureRestrictedSet(BitSet bs)
|
||||||
|
{
|
||||||
|
bs.xor(bs); // clears all bits presently set in the bitset
|
||||||
|
bs.set(INLINE_FORMAT);
|
||||||
|
|
||||||
|
} // end configureRestrictedSet
|
||||||
|
|
||||||
|
} // end class TagRepository
|
45
src/com/silverwrist/venice/htmlcheck/impl/TagWBR.java
Normal file
45
src/com/silverwrist/venice/htmlcheck/impl/TagWBR.java
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* 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 Community 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) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.htmlcheck.impl;
|
||||||
|
|
||||||
|
class TagWBR extends SimpleTag
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
TagWBR()
|
||||||
|
{
|
||||||
|
super("WBR",false);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String rewriteTagContents(String contents, boolean is_closing, HTMLCheckerBackend context)
|
||||||
|
{
|
||||||
|
context.sendTagMessage("WBR");
|
||||||
|
return contents; // just let everything pass for now
|
||||||
|
|
||||||
|
} // end rewriteTagContents
|
||||||
|
|
||||||
|
} // end class TagWBR
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user