*** 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user