some serious new feature implementation:
- cookie-based persistent logins - expanded activity reporting - "top" and "fixed" left menus are now dynamically generated from XML config, not hard coded - error reporting enhanced and protection increased - "About Venice" page first draft - new means of "framing" static content within the Venice "frame" - base page now includes the "footer" itself, "content" pages don't anymore - general cleanup of some heavyweight old containers, replaced with faster Collections framework containers - probably more, there's a LOT of stuff in here
This commit is contained in:
parent
3d32fe95c5
commit
63fedc9db6
|
@ -8,7 +8,7 @@
|
|||
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 Original Code is the Venice Web Communities System.
|
||||
|
||||
The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
|
@ -86,4 +86,38 @@ Text of this agreement is TBD.
|
|||
|
||||
</messages>
|
||||
|
||||
<!-- Menu definitions for the base page -->
|
||||
<menu-definitions>
|
||||
|
||||
<!-- Definition for the "top" menu (when not in a SIG) -->
|
||||
<menudef id="top">
|
||||
<header>Front Page</header>
|
||||
<menuitem>
|
||||
<text>Calendar</text>
|
||||
<absolute>TODO</absolute>
|
||||
<disabled/>
|
||||
</menuitem>
|
||||
<menuitem>
|
||||
<text>Chat</text>
|
||||
<absolute>TODO</absolute>
|
||||
<disabled/>
|
||||
</menuitem>
|
||||
</menudef>
|
||||
|
||||
<!-- Definition for the "fixed" menu (always displayed under the "top" or "SIG" menus) -->
|
||||
<menudef id="fixed">
|
||||
<header>About This Site</header>
|
||||
<menuitem>
|
||||
<text>Documentation</text>
|
||||
<absolute>TODO</absolute>
|
||||
<disabled/>
|
||||
</menuitem>
|
||||
<menuitem>
|
||||
<text>About Venice</text>
|
||||
<frame>about-venice.html</frame>
|
||||
</menuitem>
|
||||
</menudef>
|
||||
|
||||
</menu-definitions>
|
||||
|
||||
</render-config>
|
||||
|
|
13
etc/web.xml
13
etc/web.xml
|
@ -69,6 +69,14 @@
|
|||
<load-on-startup>3</load-on-startup>
|
||||
</servlet>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>framestatic</servlet-name>
|
||||
<description>
|
||||
Displays static content inside the Venice frame.
|
||||
</description>
|
||||
<servlet-class>com.silverwrist.venice.servlets.FrameStatic</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>account</servlet-name>
|
||||
<description>
|
||||
|
@ -216,6 +224,11 @@
|
|||
<url-pattern>/top</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>framestatic</servlet-name>
|
||||
<url-pattern>/frame/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>account</servlet-name>
|
||||
<url-pattern>/account</url-pattern>
|
||||
|
|
|
@ -71,6 +71,7 @@ CREATE TABLE users (
|
|||
uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(64) NOT NULL,
|
||||
passhash VARCHAR(64) NOT NULL,
|
||||
tokenauth VARCHAR(64),
|
||||
contactid INT DEFAULT -1,
|
||||
is_anon TINYINT DEFAULT 0,
|
||||
verify_email TINYINT DEFAULT 0,
|
||||
|
@ -345,6 +346,8 @@ CREATE TABLE topicsettings (
|
|||
uid INT NOT NULL,
|
||||
hidden TINYINT DEFAULT 0,
|
||||
last_message INT DEFAULT -1,
|
||||
last_read DATETIME,
|
||||
last_post DATETIME,
|
||||
PRIMARY KEY (topicid, uid)
|
||||
);
|
||||
|
||||
|
|
400
src/com/silverwrist/util/cachemap/CacheMap.java
Normal file
400
src/com/silverwrist/util/cachemap/CacheMap.java
Normal file
|
@ -0,0 +1,400 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.util.cachemap;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class CacheMap implements Map
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class used to do comparisons for cache shrinkage
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static class CacheOrdering implements Comparator
|
||||
{
|
||||
private CacheMapStrategy strategy; // CacheMap's strategy object
|
||||
private long tick; // when the sort operation started
|
||||
|
||||
CacheOrdering(CacheMapStrategy strategy)
|
||||
{
|
||||
this.strategy = strategy;
|
||||
this.tick = System.currentTimeMillis();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public int compare(Object o1, Object o2)
|
||||
{
|
||||
long figm1 = strategy.getEntryValue((CacheMapEntry)o1,tick);
|
||||
long figm2 = strategy.getEntryValue((CacheMapEntry)o2,tick);
|
||||
return (int)(figm1 - figm2); // we want the largest figures of merit to go first
|
||||
|
||||
} // end compare
|
||||
|
||||
public boolean equals(Object o)
|
||||
{
|
||||
return (o instanceof CacheOrdering);
|
||||
|
||||
} // end equals
|
||||
|
||||
} // end class CacheOrdering
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class implementing a default cache ordering strategy
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static class DefaultStrategy implements CacheMapStrategy
|
||||
{
|
||||
private static final long SCALING_FACTOR = 5000;
|
||||
|
||||
DefaultStrategy()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
public long getEntryValue(CacheMapEntry entry, long tick)
|
||||
{
|
||||
return (entry.getHits() * SCALING_FACTOR) - entry.getAge(tick);
|
||||
|
||||
} // end getEntryValue
|
||||
|
||||
} // end class DefaultStrategy
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static final DefaultStrategy default_strategy_singleton = new DefaultStrategy();
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private int capacity; // capacity of the CacheMap
|
||||
private int shrink_percentage; // what percentage we shrink by when full
|
||||
private CacheMapStrategy strategy; // strategy routine to use to purge entries
|
||||
private HashMap base_map; // maps keys to CacheMapEntry values
|
||||
private ArrayList element_list; // the actual elements
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public CacheMap(int capacity, int shrink_percentage, CacheMapStrategy strategy)
|
||||
{
|
||||
if (capacity<=0)
|
||||
throw new IllegalArgumentException("capacity must be greater than 0");
|
||||
if ((shrink_percentage<=0) || (shrink_percentage>100))
|
||||
throw new IllegalArgumentException("shrink_percentage must be in [1, 100]");
|
||||
if (strategy==null)
|
||||
throw new NullPointerException("no strategy passed to CacheMap");
|
||||
|
||||
this.capacity = capacity;
|
||||
this.shrink_percentage = shrink_percentage;
|
||||
this.strategy = strategy;
|
||||
this.base_map = new HashMap(10);
|
||||
this.element_list = new ArrayList(10);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public CacheMap(int capacity, int shrink_percentage)
|
||||
{
|
||||
this(capacity,shrink_percentage,default_strategy_singleton);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public CacheMap(int capacity)
|
||||
{
|
||||
this(capacity,10,default_strategy_singleton);
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface Map
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int size()
|
||||
{
|
||||
return base_map.size();
|
||||
|
||||
} // end size
|
||||
|
||||
public boolean isEmpty()
|
||||
{
|
||||
return base_map.isEmpty();
|
||||
|
||||
} // end isEmpty
|
||||
|
||||
public boolean containsKey(Object key)
|
||||
{
|
||||
return base_map.containsKey(key);
|
||||
|
||||
} // end containsKey
|
||||
|
||||
public boolean containsValue(Object value)
|
||||
{
|
||||
Iterator it = element_list.iterator();
|
||||
while (it.hasNext())
|
||||
{ // look at all the CacheMapEntry values we have
|
||||
CacheMapEntry cme = (CacheMapEntry)(it.next());
|
||||
Object my_val = cme.getValue();
|
||||
if (my_val==null)
|
||||
{ // test for also null
|
||||
if (value==null)
|
||||
return true;
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // make sure the other value is non-null before we test equality
|
||||
if ((value!=null) && my_val.equals(value))
|
||||
return true;
|
||||
|
||||
} // end else
|
||||
|
||||
} // end while
|
||||
|
||||
return false; // nope, sorry
|
||||
|
||||
} // end containsValue
|
||||
|
||||
public Object get(Object key)
|
||||
{
|
||||
CacheMapEntry cme = (CacheMapEntry)(base_map.get(key));
|
||||
if (cme==null)
|
||||
return null;
|
||||
cme.touch();
|
||||
return cme.getValue();
|
||||
|
||||
} // end get
|
||||
|
||||
public Object put(Object key, Object value)
|
||||
{
|
||||
Object rc = null;
|
||||
CacheMapEntry cme = (CacheMapEntry)(base_map.get(key));
|
||||
if (cme==null)
|
||||
{ // create a new CacheMapEntry for this key
|
||||
cme = new CacheMapEntry(key,value);
|
||||
|
||||
synchronized (this)
|
||||
{ // insert it into the basic object
|
||||
if (base_map.size()==capacity)
|
||||
shrink();
|
||||
element_list.add(cme);
|
||||
base_map.put(cme.getKey(),cme);
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // we have an old value - replace it and touch the entry
|
||||
cme.touch();
|
||||
rc = cme.setValue(value);
|
||||
|
||||
} // end else
|
||||
|
||||
return rc;
|
||||
|
||||
} // end put
|
||||
|
||||
public Object remove(Object key)
|
||||
{
|
||||
Object rc = null;
|
||||
CacheMapEntry cme = (CacheMapEntry)(base_map.get(key));
|
||||
if (cme!=null)
|
||||
{ // save the mapped value before we remove it
|
||||
rc = cme.getValue();
|
||||
|
||||
synchronized (this)
|
||||
{ // remove the values
|
||||
base_map.remove(key);
|
||||
element_list.remove(cme);
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
} // end if
|
||||
|
||||
return rc;
|
||||
|
||||
} // end remove
|
||||
|
||||
public void putAll(Map map)
|
||||
{
|
||||
synchronized (this)
|
||||
{ // make sure we have enough space in the CacheMap for all the new elements!
|
||||
while ((map.size() + base_map.size()) > capacity)
|
||||
shrink();
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
Iterator it = map.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{ // add each element in turn
|
||||
Map.Entry me = (Map.Entry)(it.next());
|
||||
put(me.getKey(),me.getValue());
|
||||
|
||||
} // end while
|
||||
|
||||
} // end putAll
|
||||
|
||||
public synchronized void clear()
|
||||
{
|
||||
base_map.clear();
|
||||
element_list.clear();
|
||||
|
||||
} // end clear
|
||||
|
||||
public Set keySet()
|
||||
{
|
||||
return base_map.keySet();
|
||||
|
||||
} // end keySet
|
||||
|
||||
public Collection values()
|
||||
{
|
||||
return null; // not implemented
|
||||
|
||||
} // end values
|
||||
|
||||
public Set entrySet()
|
||||
{
|
||||
return null; // not implemented
|
||||
|
||||
} // end entrySet
|
||||
|
||||
public boolean equals(Object o)
|
||||
{
|
||||
if ((o==null) || !(o instanceof Map))
|
||||
return false; // not a map
|
||||
Map other = (Map)o;
|
||||
if (other.size()!=base_map.size())
|
||||
return false; // size does matter!
|
||||
Iterator it = base_map.values().iterator();
|
||||
while (it.hasNext())
|
||||
{ // get each of the entries out and use that to do a key-value comparison
|
||||
CacheMapEntry cme = (CacheMapEntry)(it.next());
|
||||
Object o1 = cme.getValue();
|
||||
Object o2 = other.get(cme.getKey());
|
||||
if (o1==null)
|
||||
{ // must have a matching null
|
||||
if (o2!=null)
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // make sure we have a matching object (not null)
|
||||
if ((o2==null) || !(o2.equals(o1)))
|
||||
return false;
|
||||
|
||||
} // end else
|
||||
|
||||
} // end while
|
||||
|
||||
return true; // all OK!
|
||||
|
||||
} // end equals
|
||||
|
||||
public int hashCode()
|
||||
{
|
||||
int rc = 0;
|
||||
Iterator it = base_map.values().iterator();
|
||||
while (it.hasNext())
|
||||
{ // add up the hash codes and return them
|
||||
CacheMapEntry cme = (CacheMapEntry)(it.next());
|
||||
rc += cme.hashCode();
|
||||
|
||||
} // end while
|
||||
|
||||
return rc;
|
||||
|
||||
} // end hashCode
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External getters/setters
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int getCapacity()
|
||||
{
|
||||
return capacity;
|
||||
|
||||
} // end getCapacity
|
||||
|
||||
public void setCapacity(int c)
|
||||
{
|
||||
if (c<=0)
|
||||
throw new IllegalArgumentException("capacity must be greater than 0");
|
||||
capacity = c;
|
||||
|
||||
} // end setCapacity
|
||||
|
||||
public int getShrinkPercentage()
|
||||
{
|
||||
return shrink_percentage;
|
||||
|
||||
} // end getShrinkPercentage
|
||||
|
||||
public void setShrinkPercentage(int p)
|
||||
{
|
||||
if ((p<=0) || (p>100))
|
||||
throw new IllegalArgumentException("shrink_percentage must be in [1, 100]");
|
||||
shrink_percentage = p;
|
||||
|
||||
} // end setShrinkPercentage
|
||||
|
||||
public CacheMapStrategy getStrategy()
|
||||
{
|
||||
return strategy;
|
||||
|
||||
} // end getStrategy
|
||||
|
||||
public void setStrategy(CacheMapStrategy s)
|
||||
{
|
||||
if (s==null)
|
||||
throw new NullPointerException("no strategy passed to CacheMap");
|
||||
strategy = s;
|
||||
|
||||
} // end setStrategy
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public synchronized void shrink()
|
||||
{
|
||||
// Figure out how many elements to remove.
|
||||
int num_remove = (element_list.size() * shrink_percentage) / 100;
|
||||
|
||||
// Sort the element list to figure out which elements to remove.
|
||||
Collections.sort(element_list,new CacheOrdering(strategy));
|
||||
|
||||
// The elements we want to remove are at the end of the array, so start from there.
|
||||
for (int i=0; i<num_remove; i++)
|
||||
{ // remove the "removed" entries from the hash map
|
||||
CacheMapEntry cme = (CacheMapEntry)(element_list.remove(element_list.size() - 1));
|
||||
base_map.remove(cme.getKey());
|
||||
|
||||
} // end for
|
||||
|
||||
} // end shrink
|
||||
|
||||
} // end class CacheMap
|
154
src/com/silverwrist/util/cachemap/CacheMapEntry.java
Normal file
154
src/com/silverwrist/util/cachemap/CacheMapEntry.java
Normal file
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.util.cachemap;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
class CacheMapEntry implements Map.Entry
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Object key;
|
||||
private Object value;
|
||||
private int hits = 0;
|
||||
private long timestamp;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
CacheMapEntry(Object key, Object value)
|
||||
{
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
this.timestamp = System.currentTimeMillis();
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* finalize() function
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected void finalize()
|
||||
{
|
||||
key = null;
|
||||
value = null;
|
||||
|
||||
} // end finalize
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface MapEntry
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final Object getKey()
|
||||
{
|
||||
return key;
|
||||
|
||||
} // end getKey
|
||||
|
||||
public final Object getValue()
|
||||
{
|
||||
return value;
|
||||
|
||||
} // end getValue
|
||||
|
||||
public final Object setValue(Object o)
|
||||
{
|
||||
Object rc = value;
|
||||
value = o;
|
||||
return rc;
|
||||
|
||||
} // end setValue
|
||||
|
||||
public final boolean equals(Object o)
|
||||
{
|
||||
// make sure the other element is a Map.Entry
|
||||
if ((o==null) || !(o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry other = (Map.Entry)o;
|
||||
|
||||
// compare the keys
|
||||
if (key==null)
|
||||
{ // the other key must be null
|
||||
if (other.getKey()!=null)
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // the other key must be equal to us
|
||||
if ((other.getKey()==null) || (!(key.equals(other.getKey()))))
|
||||
return false;
|
||||
|
||||
} // end else
|
||||
|
||||
// compare the values
|
||||
if (value==null)
|
||||
return (other.getValue()==null);
|
||||
else
|
||||
return ((other.getValue()!=null) && value.equals(other.getValue()));
|
||||
|
||||
} // end equals
|
||||
|
||||
public final int hashCode()
|
||||
{
|
||||
int rc = 0;
|
||||
if (key!=null)
|
||||
rc ^= key.hashCode();
|
||||
if (value!=null)
|
||||
rc ^= value.hashCode();
|
||||
return rc;
|
||||
|
||||
} // end hashCode
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
final int getHits()
|
||||
{
|
||||
return hits;
|
||||
|
||||
} // end getHits
|
||||
|
||||
final long getTimestamp()
|
||||
{
|
||||
return timestamp;
|
||||
|
||||
} // end getTimestamp
|
||||
|
||||
final long getAge(long tick)
|
||||
{
|
||||
return (tick - timestamp);
|
||||
|
||||
} // end getAge
|
||||
|
||||
final void touch()
|
||||
{
|
||||
hits++;
|
||||
timestamp = System.currentTimeMillis();
|
||||
|
||||
} // end touch
|
||||
|
||||
} // end class CacheMapEntry
|
|
@ -15,23 +15,10 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format;
|
||||
package com.silverwrist.util.cachemap;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.io.IOException;
|
||||
|
||||
public class MenuTop implements ComponentRender
|
||||
public interface CacheMapStrategy
|
||||
{
|
||||
public MenuTop()
|
||||
{ // constructor does nothing
|
||||
} // end constructor
|
||||
public abstract long getEntryValue(CacheMapEntry entry, long tick);
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
out.write("<B>Front Page</B><BR>\n");
|
||||
out.write("<A HREF=\"\">Calendar</A><BR>\n"); // TODO: fill this link in
|
||||
out.write("<A HREF=\"\">Chat</A>\n"); // TODO: fill this link in
|
||||
|
||||
} // end renderHere
|
||||
|
||||
} // end class MenuTop
|
||||
} // end interface CacheMapStrategy
|
|
@ -18,7 +18,6 @@
|
|||
package com.silverwrist.util.rcache;
|
||||
|
||||
import java.util.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
|
||||
public class ReferenceCache
|
||||
{
|
||||
|
@ -124,7 +123,7 @@ public class ReferenceCache
|
|||
|
||||
public List sweepReturn()
|
||||
{
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
int count = 0;
|
||||
|
||||
synchronized (this)
|
||||
|
@ -155,7 +154,7 @@ public class ReferenceCache
|
|||
|
||||
} // end synchronized block
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end sweepReturn
|
||||
|
||||
|
|
|
@ -78,5 +78,17 @@ public interface TopicContext
|
|||
|
||||
public abstract void delete() throws DataException, AccessError;
|
||||
|
||||
public abstract List getActivePosters(int skip, int limit) throws DataException, AccessError;
|
||||
|
||||
public abstract List getActivePosters(int limit) throws DataException, AccessError;
|
||||
|
||||
public abstract List getActivePosters() throws DataException, AccessError;
|
||||
|
||||
public abstract List getActiveReaders(int skip, int limit) throws DataException, AccessError;
|
||||
|
||||
public abstract List getActiveReaders(int limit) throws DataException, AccessError;
|
||||
|
||||
public abstract List getActiveReaders() throws DataException, AccessError;
|
||||
|
||||
} // end interface TopicContext
|
||||
|
||||
|
|
|
@ -103,4 +103,8 @@ public interface UserContext extends SearchMode
|
|||
|
||||
public abstract void setTimeZone(TimeZone timezone) throws DataException;
|
||||
|
||||
public abstract String getAuthenticationToken() throws AccessError, DataException;
|
||||
|
||||
public abstract boolean authenticateWithToken(String token) throws DataException;
|
||||
|
||||
} // end interface UserContext
|
||||
|
|
|
@ -20,7 +20,6 @@ package com.silverwrist.venice.core.impl;
|
|||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
|
||||
|
@ -70,7 +69,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
*/
|
||||
|
||||
private DataPool datapool; // used for doing database lookups
|
||||
private Vector cats; // the actual category segments
|
||||
private LinkedList 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?
|
||||
|
||||
|
@ -82,7 +81,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
CategoryDescriptorImpl(DataPool datapool, int catid, boolean do_hide) throws DataException
|
||||
{
|
||||
this.datapool = datapool;
|
||||
cats = new Vector();
|
||||
cats = new LinkedList();
|
||||
this.do_hide = do_hide;
|
||||
|
||||
if (catid<0)
|
||||
|
@ -114,7 +113,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
throws SQLException, DataException
|
||||
{
|
||||
this.datapool = datapool;
|
||||
cats = new Vector();
|
||||
cats = new LinkedList();
|
||||
this.do_hide = do_hide;
|
||||
|
||||
if (catid<0)
|
||||
|
@ -127,19 +126,18 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
protected CategoryDescriptorImpl(DataPool datapool, int id, int symlink, String name, boolean do_hide)
|
||||
{
|
||||
this.datapool = datapool;
|
||||
this.cats = new Vector();
|
||||
this.cats = new LinkedList();
|
||||
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.cats = new LinkedList();
|
||||
this.symlink = ((copy_levels==other.cats.size()) ? other.symlink : -1);
|
||||
this.do_hide = other.do_hide;
|
||||
|
||||
|
@ -147,7 +145,6 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
{ // 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
|
||||
|
||||
|
@ -156,7 +153,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
protected CategoryDescriptorImpl(CategoryDescriptorImpl other, int id, int symlink, String name)
|
||||
{
|
||||
this.datapool = other.datapool;
|
||||
this.cats = new Vector();
|
||||
this.cats = new LinkedList();
|
||||
this.symlink = symlink;
|
||||
this.do_hide = other.do_hide;
|
||||
|
||||
|
@ -164,7 +161,6 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
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
|
||||
|
||||
|
@ -209,13 +205,11 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
|
||||
} // end if
|
||||
|
||||
cats.add(0,new CatSegment(curr_catid,rs.getString("name")));
|
||||
cats.addFirst(new CatSegment(curr_catid,rs.getString("name")));
|
||||
curr_catid = rs.getInt("parent");
|
||||
|
||||
} // end while
|
||||
|
||||
cats.trimToSize(); // shrink vector down to size
|
||||
|
||||
} // end doFillFromTop
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -226,7 +220,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
public int getCategoryID()
|
||||
{
|
||||
if (cats.size()>0)
|
||||
return ((CatSegment)(cats.lastElement())).getID();
|
||||
return ((CatSegment)(cats.getLast())).getID();
|
||||
else
|
||||
return -1;
|
||||
|
||||
|
@ -260,7 +254,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
} // end if
|
||||
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
try
|
||||
{ // get a connection and create a statement
|
||||
conn = datapool.getConnection();
|
||||
|
@ -294,8 +288,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
|
||||
} // end finally
|
||||
|
||||
// wrap the vector in a ReadOnlyVector object
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getSubCategories
|
||||
|
||||
|
@ -393,7 +386,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
static List getTopLevelCategoryList(DataPool datapool, boolean do_hide) throws DataException
|
||||
{
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
try
|
||||
{ // get a connection and create a statement
|
||||
conn = datapool.getConnection();
|
||||
|
@ -426,8 +419,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
|
||||
} // end finally
|
||||
|
||||
// wrap the vector in a ReadOnlyVector object
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getTopLevelCategoryList
|
||||
|
||||
|
@ -438,7 +430,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
logger.debug("Category search: mode = " + String.valueOf(mode) + ", term '" + term + "', offset = "
|
||||
+ String.valueOf(offset) + ", count = " + String.valueOf(count));
|
||||
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -505,7 +497,7 @@ class CategoryDescriptorImpl implements CategoryDescriptor, Cloneable
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end searchForCategories
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ package com.silverwrist.venice.core.impl;
|
|||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.security.DefaultLevels;
|
||||
|
@ -233,7 +232,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
throw new DataException("This conference has been deleted.");
|
||||
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // get a database connection from this object
|
||||
|
@ -263,7 +262,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getAlias
|
||||
|
||||
|
@ -273,7 +272,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
throw new DataException("This conference has been deleted.");
|
||||
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // get a database connection from this object
|
||||
|
@ -312,7 +311,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getHosts
|
||||
|
||||
|
@ -1059,7 +1058,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
if (logger.isDebugEnabled())
|
||||
logger.debug("Member list: conference = " + confid);
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1104,7 +1103,7 @@ class ConferenceCoreData implements ConferenceData
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getMemberList
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ package com.silverwrist.venice.core.impl;
|
|||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.util.rcache.ReferencedData;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.htmlcheck.*;
|
||||
|
@ -95,19 +94,21 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
|
||||
} // end constructor
|
||||
|
||||
public void doFix(Statement stmt, int uid) throws SQLException
|
||||
public void doFix(Statement stmt, int uid, java.util.Date date) throws SQLException
|
||||
{
|
||||
StringBuffer sql = new StringBuffer();
|
||||
if (do_insert)
|
||||
{ // construct an SQL INSERT statement
|
||||
sql.append("INSERT INTO topicsettings (topicid, uid, last_message) VALUES (").append(topicid);
|
||||
sql.append(", ").append(uid).append(", ").append(top_message).append(");");
|
||||
sql.append("INSERT INTO topicsettings (topicid, uid, last_message, last_read) VALUES (");
|
||||
sql.append(topicid).append(", ").append(uid).append(", ").append(top_message).append(", '");
|
||||
sql.append(SQLUtil.encodeDate(date)).append("');");
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // construct an SQL UPDATE statement
|
||||
sql.append("UPDATE topicsettings SET last_message = ").append(top_message).append(" WHERE topicid = ");
|
||||
sql.append(topicid).append(" AND uid = ").append(uid).append(';');
|
||||
sql.append("UPDATE topicsettings SET last_message = ").append(top_message).append(", last_read = '");
|
||||
sql.append(SQLUtil.encodeDate(date)).append("' WHERE topicid = ").append(topicid);
|
||||
sql.append(" AND uid = ").append(uid).append(';');
|
||||
|
||||
} // end else
|
||||
|
||||
|
@ -941,8 +942,17 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
// now we need to reset our last post date
|
||||
Connection conn = null;
|
||||
try
|
||||
{ // get a connection and feed it to the touchPost function
|
||||
{ // get a connection
|
||||
conn = datapool.getConnection();
|
||||
|
||||
// create a new record in topicsettings (we WERE the first to post in the topic after all!)
|
||||
Statement stmt = conn.createStatement();
|
||||
StringBuffer sql = new StringBuffer("INSERT INTO topicsettings (topicid, uid, last_post) VALUES (");
|
||||
sql.append(new_topic_inf.getTopicID()).append(", ").append(sig.realUID()).append(", '");
|
||||
sql.append(SQLUtil.encodeDate(new_topic_inf.getCreateDate())).append("');");
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
||||
// update the conference last-post information
|
||||
touchPost(conn,new_topic_inf.getCreateDate());
|
||||
|
||||
} // end try
|
||||
|
@ -1024,16 +1034,17 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||
|
||||
// use the results to build up a list of FixSeenHelpers
|
||||
Vector tmp = new Vector();
|
||||
ArrayList tmp = new ArrayList();
|
||||
while (rs.next())
|
||||
tmp.add(new FixSeenHelper(rs.getInt(1),rs.getInt(2),rs.getBoolean(3)));
|
||||
|
||||
// now iterate over the list and call doFix on each one
|
||||
Iterator it = tmp.iterator();
|
||||
java.util.Date now = new java.util.Date();
|
||||
while (it.hasNext())
|
||||
{ // just hit each one in turn
|
||||
FixSeenHelper fsh = (FixSeenHelper)(it.next());
|
||||
fsh.doFix(stmt,sig.realUID());
|
||||
fsh.doFix(stmt,sig.realUID(),now);
|
||||
|
||||
} // end while
|
||||
|
||||
|
@ -1074,7 +1085,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
} // end if
|
||||
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // retrieve a connection from the datapool
|
||||
|
@ -1115,7 +1126,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getActivePosters
|
||||
|
||||
|
@ -1141,7 +1152,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
} // end if
|
||||
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // retrieve a connection from the datapool
|
||||
|
@ -1182,7 +1193,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getActiveReaders
|
||||
|
||||
|
@ -1700,7 +1711,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("getSIGConferences for SIG # " + sig.realSIGID() + ", user #" + sig.realUID());
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1751,7 +1762,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getSIGConferences
|
||||
|
||||
|
@ -1863,7 +1874,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
logger.debug("getUserHotlist for user #" + user.realUID());
|
||||
|
||||
Connection conn = null; // pooled database connection
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
|
||||
try
|
||||
{ // get a database connection
|
||||
|
@ -1926,7 +1937,7 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getUserHotlist
|
||||
|
||||
|
|
|
@ -93,4 +93,8 @@ public interface EngineBackend
|
|||
|
||||
public abstract void unpublish(long postid);
|
||||
|
||||
public abstract String generateRandomAuthString();
|
||||
|
||||
public abstract boolean isValidRandomAuthString(String s);
|
||||
|
||||
} // end interface EngineBackend
|
||||
|
|
|
@ -21,7 +21,6 @@ import java.sql.*;
|
|||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.util.rcache.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
|
@ -1493,7 +1492,7 @@ class SIGCoreData implements SIGData, SIGDataBackend
|
|||
logger.debug("Member search: SIG = " + sigid + ", field = " + field + ", mode = " + mode + ", term '"
|
||||
+ term + "', offset = " + offset + ", count = " + count);
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1584,7 +1583,7 @@ class SIGCoreData implements SIGData, SIGDataBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end searchForMembers
|
||||
|
||||
|
@ -1689,7 +1688,7 @@ class SIGCoreData implements SIGData, SIGDataBackend
|
|||
if (logger.isDebugEnabled())
|
||||
logger.debug("Member list: SIG = " + sigid);
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1737,7 +1736,7 @@ class SIGCoreData implements SIGData, SIGDataBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getMemberList
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ import java.sql.*;
|
|||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.util.rcache.ReferencedData;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
|
@ -163,7 +162,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("setMemberValues(" + String.valueOf(granted_level) + ", " + String.valueOf(member)
|
||||
+ ", " + String.valueOf(locked));
|
||||
+ ", " + String.valueOf(locked) + ")");
|
||||
|
||||
if (user.realBaseLevel()>granted_level)
|
||||
this.level = user.realBaseLevel();
|
||||
|
@ -1484,7 +1483,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("getMemberSIGEntries for user #" + String.valueOf(user.realUID()));
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1521,7 +1520,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getMemberSIGEntries
|
||||
|
||||
|
@ -1611,7 +1610,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
+ ", term '" + term + "', offset = " + String.valueOf(offset) + ", count = "
|
||||
+ String.valueOf(count));
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1688,7 +1687,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end searchForSIGs
|
||||
|
||||
|
@ -1780,7 +1779,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
logger.debug("reading SIGs in category " + String.valueOf(catid) + ", offset = "
|
||||
+ String.valueOf(offset) + ", count = " + String.valueOf(count));
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1823,7 +1822,7 @@ class SIGUserContextImpl implements SIGContext, SIGBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getSIGsInCategory
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ import java.util.*;
|
|||
import java.util.zip.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.security.Capability;
|
||||
|
@ -1092,7 +1091,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
|||
logger.debug("loadMessageRange for conf # " + conf.realConfID() + ", topic #" + topicid + ", range ["
|
||||
+ post_low + ", " + post_high + "]");
|
||||
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1138,7 +1137,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc); // wrap the return vector
|
||||
return Collections.unmodifiableList(rc); // wrap the return vector
|
||||
|
||||
} // end loadMessageRange
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ package com.silverwrist.venice.core.impl;
|
|||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.htmlcheck.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
|
@ -511,7 +510,9 @@ class TopicUserContextImpl implements TopicContext
|
|||
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(last_msg).append(", last_read = '");
|
||||
java.util.Date now = new java.util.Date();
|
||||
sql.append(SQLUtil.encodeDate(now)).append("' WHERE topicid = ").append(topicid).append(" AND uid = ");
|
||||
sql.append(conf.realUID()).append(';');
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("SQL: " + sql.toString());
|
||||
|
@ -540,8 +541,9 @@ class TopicUserContextImpl implements TopicContext
|
|||
|
||||
// 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(");");
|
||||
sql.append("INSERT INTO topicsettings (topicid, uid, last_message, last_read) VALUES (");
|
||||
sql.append(topicid).append(", ").append(conf.realUID()).append(", ").append(last_msg).append(", '");
|
||||
sql.append(SQLUtil.encodeDate(now)).append("');");
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("SQL: " + sql.toString());
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
@ -691,7 +693,7 @@ class TopicUserContextImpl implements TopicContext
|
|||
|
||||
// slap a lock on all the tables we need to touch
|
||||
stmt.executeUpdate("LOCK TABLES confs WRITE, topics WRITE, posts WRITE, postdata WRITE, "
|
||||
+ "confsettings WRITE, topicsettings READ;");
|
||||
+ "confsettings WRITE, topicsettings WRITE;");
|
||||
|
||||
try
|
||||
{ // refresh our current status and recheck allowed status
|
||||
|
@ -755,6 +757,25 @@ class TopicUserContextImpl implements TopicContext
|
|||
sql.append(real_text).append("');");
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
||||
// mark that we posted to the topic
|
||||
sql.setLength(0);
|
||||
sql.append("UPDATE topicsettings SET last_post = '").append(SQLUtil.encodeDate(posted_date));
|
||||
sql.append("' WHERE topicid = ").append(topicid).append(" AND uid = ").append(conf.realUID());
|
||||
sql.append(';');
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("SQL: " + sql.toString());
|
||||
if (stmt.executeUpdate(sql.toString())<1)
|
||||
{ // we had no topicsettings record, add one
|
||||
sql.setLength(0);
|
||||
sql.append("INSERT INTO topicsettings (topicid, uid, last_post) VALUES (").append(topicid);
|
||||
sql.append(", ").append(conf.realUID()).append(", '").append(SQLUtil.encodeDate(posted_date));
|
||||
sql.append("');");
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("SQL: " + sql.toString());
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
||||
} // end if
|
||||
|
||||
// mark that we posted to the conference
|
||||
conf.touchUpdate(conn,posted_date);
|
||||
conf.touchPost(conn,posted_date);
|
||||
|
@ -925,6 +946,126 @@ class TopicUserContextImpl implements TopicContext
|
|||
|
||||
} // end delete
|
||||
|
||||
public List getActivePosters(int skip, int limit) throws DataException
|
||||
{
|
||||
Connection conn = null;
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // retrieve a connection from the datapool
|
||||
conn = datapool.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
|
||||
// create the SQL statement to retrieve all posters
|
||||
StringBuffer sql =
|
||||
new StringBuffer("SELECT s.uid, u.username, s.last_read, s.last_post FROM topicsettings s, "
|
||||
+ "users u WHERE u.uid = s.uid AND s.topicid = ");
|
||||
sql.append(topicid).append(" AND u.is_anon = 0 AND ISNULL(s.last_post) = 0 ORDER BY s.last_post DESC");
|
||||
if ((skip>=0) && (limit>0))
|
||||
sql.append(" LIMIT ").append(skip).append(", ").append(limit);
|
||||
sql.append(';');
|
||||
|
||||
// execute the statement
|
||||
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||
|
||||
while (rs.next())
|
||||
{ // return all the records as ActiveUser data elements
|
||||
ActiveUser usr = new ActiveUserImpl(rs.getInt(1),rs.getString(2),SQLUtil.getFullDateTime(rs,3),
|
||||
SQLUtil.getFullDateTime(rs,4));
|
||||
rc.add(usr);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // this becomes a DataException
|
||||
logger.error("DB error getting active poster list: " + e.getMessage(),e);
|
||||
throw new DataException("unable to get active poster listing: " + e.getMessage(),e);
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // make sure we release the connection before we go
|
||||
if (conn!=null)
|
||||
datapool.releaseConnection(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getActivePosters
|
||||
|
||||
public List getActivePosters(int limit) throws DataException, AccessError
|
||||
{
|
||||
return getActivePosters(0,limit);
|
||||
|
||||
} // end getActivePosters
|
||||
|
||||
public List getActivePosters() throws DataException, AccessError
|
||||
{
|
||||
return getActivePosters(-1,-1);
|
||||
|
||||
} // end getActivePosters
|
||||
|
||||
public List getActiveReaders(int skip, int limit) throws DataException, AccessError
|
||||
{
|
||||
Connection conn = null;
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // retrieve a connection from the datapool
|
||||
conn = datapool.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
|
||||
// create the SQL statement to retrieve all readers
|
||||
StringBuffer sql =
|
||||
new StringBuffer("SELECT s.uid, u.username, s.last_read, s.last_post FROM topicsettings s, "
|
||||
+ "users u WHERE u.uid = s.uid AND s.topicid = ");
|
||||
sql.append(topicid).append(" AND u.is_anon = 0 AND ISNULL(s.last_read) = 0 ORDER BY s.last_read DESC");
|
||||
if ((skip>=0) && (limit>0))
|
||||
sql.append(" LIMIT ").append(skip).append(", ").append(limit);
|
||||
sql.append(';');
|
||||
|
||||
// execute the statement
|
||||
ResultSet rs = stmt.executeQuery(sql.toString());
|
||||
|
||||
while (rs.next())
|
||||
{ // return all the records as ActiveUser data elements
|
||||
ActiveUser usr = new ActiveUserImpl(rs.getInt(1),rs.getString(2),SQLUtil.getFullDateTime(rs,3),
|
||||
SQLUtil.getFullDateTime(rs,4));
|
||||
rc.add(usr);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // this becomes a DataException
|
||||
logger.error("DB error getting active reader list: " + e.getMessage(),e);
|
||||
throw new DataException("unable to get active reader listing: " + e.getMessage(),e);
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // make sure we release the connection before we go
|
||||
if (conn!=null)
|
||||
datapool.releaseConnection(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getActiveReaders
|
||||
|
||||
public List getActiveReaders(int limit) throws DataException, AccessError
|
||||
{
|
||||
return getActiveReaders(0,limit);
|
||||
|
||||
} // end getActiveReaders
|
||||
|
||||
public List getActiveReaders() throws DataException, AccessError
|
||||
{
|
||||
return getActiveReaders(-1,-1);
|
||||
|
||||
} // end getActiveReaders
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations usable only from within the package
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -936,7 +1077,7 @@ class TopicUserContextImpl implements TopicContext
|
|||
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
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
|
@ -1088,7 +1229,7 @@ class TopicUserContextImpl implements TopicContext
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getTopicList
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@ import java.sql.*;
|
|||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.LocaleFactory;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.util.rcache.ReferencedData;
|
||||
import com.silverwrist.venice.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
|
@ -41,6 +40,9 @@ class UserContextImpl implements UserContext, UserBackend
|
|||
|
||||
private static Category logger = Category.getInstance(UserContextImpl.class.getName());
|
||||
|
||||
private static final String AUTH_TOKEN_PREFIX = "VQAT:";
|
||||
private static final char AUTH_TOKEN_SEP = '|';
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -902,7 +904,7 @@ class UserContextImpl implements UserContext, UserBackend
|
|||
public List getSideBoxList() throws DataException
|
||||
{
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // retrieve a connection from the data pool
|
||||
|
@ -934,7 +936,7 @@ class UserContextImpl implements UserContext, UserBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getSideBoxList
|
||||
|
||||
|
@ -1052,6 +1054,235 @@ class UserContextImpl implements UserContext, UserBackend
|
|||
|
||||
} // end setTimeZone
|
||||
|
||||
public String getAuthenticationToken() throws AccessError, DataException
|
||||
{
|
||||
if (!isLoggedIn())
|
||||
{ // can't generate an authentication token if we're not authenticated!
|
||||
logger.error("UserContext not authenticated, cannot generate auth token");
|
||||
throw new AccessError("You cannot generate an authentication token without logging in.");
|
||||
|
||||
} // end if
|
||||
|
||||
// Generate a random authentication string and poke it into the database for this user.
|
||||
String tokenauth = engine.generateRandomAuthString();
|
||||
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 tokenauth = '");
|
||||
sql.append(tokenauth).append("' WHERE uid = ").append(uid).append(';');
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // turn SQLException into data exception
|
||||
logger.error("DB error setting token authentication string: " + e.getMessage(),e);
|
||||
throw new DataException("Unable to set authentication token: " + e.getMessage(),e);
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // make sure the connection is released before we go
|
||||
if (conn!=null)
|
||||
datapool.releaseConnection(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
// Build the full authentication token string value.
|
||||
int checkvalue = uid ^ tokenauth.hashCode();
|
||||
StringBuffer buf = new StringBuffer(AUTH_TOKEN_PREFIX);
|
||||
buf.append(uid).append(AUTH_TOKEN_SEP).append(tokenauth).append(AUTH_TOKEN_SEP).append(checkvalue);
|
||||
buf.append(AUTH_TOKEN_SEP);
|
||||
return buf.toString();
|
||||
|
||||
} // end getAuthenticationToken
|
||||
|
||||
public boolean authenticateWithToken(String token) throws DataException
|
||||
{
|
||||
if (isLoggedIn())
|
||||
{ // already authenticated, can't authenticate again
|
||||
logger.error("UserContext already authenticated (with uid " + uid + ")");
|
||||
throw new InternalStateError("context already authenticated");
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("decoding authtoken: " + token);
|
||||
|
||||
// Pick apart the authentication token value.
|
||||
if (!(token.startsWith(AUTH_TOKEN_PREFIX)))
|
||||
{ // token parse error
|
||||
logger.error("Token parse error: prefix not valid");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
int xstart = AUTH_TOKEN_PREFIX.length();
|
||||
int xend = token.indexOf(AUTH_TOKEN_SEP,xstart);
|
||||
if (xend<0)
|
||||
{ // could not find the UID separator
|
||||
logger.error("Token parse error: UID sep not found");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
int pending_uid;
|
||||
try
|
||||
{ // get the user ID
|
||||
pending_uid = Integer.parseInt(token.substring(xstart,xend));
|
||||
|
||||
} // end try
|
||||
catch (NumberFormatException nfe)
|
||||
{ // we couldn't parse the UID
|
||||
logger.error("Token parse error: invalid UID value");
|
||||
return false;
|
||||
|
||||
} // end catch
|
||||
|
||||
xstart = xend + 1;
|
||||
xend = token.indexOf(AUTH_TOKEN_SEP,xstart);
|
||||
if (xend<0)
|
||||
{ // could not find the auth string separator
|
||||
logger.error("Token parse error: auth string sep not found");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
String pending_auth = token.substring(xstart,xend);
|
||||
if (!(engine.isValidRandomAuthString(pending_auth)))
|
||||
{ // the auth string is not valid by the rules under which it was generated
|
||||
logger.error("Token parse error: invalid auth string value");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
xstart = xend + 1;
|
||||
xend = token.indexOf(AUTH_TOKEN_SEP,xstart);
|
||||
if (xend<0)
|
||||
{ // could not find the checkvalue separator
|
||||
logger.error("Token parse error: checkvalue sep not found");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
int checkvalue;
|
||||
try
|
||||
{ // get the check value
|
||||
checkvalue = Integer.parseInt(token.substring(xstart,xend));
|
||||
|
||||
} // end try
|
||||
catch (NumberFormatException nfe)
|
||||
{ // we couldn't parse the checkvalue
|
||||
logger.error("Token parse error: invalid checkvalue");
|
||||
return false;
|
||||
|
||||
} // end catch
|
||||
|
||||
if (checkvalue!=(pending_uid ^ pending_auth.hashCode()))
|
||||
{ // the checkvalue does not match what it should - possible corrupted token
|
||||
logger.error("Token parse error: checkvalue does not match");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
// At this point, we now have a UID and authentication string extracted from the token.
|
||||
// Proceed to authenticate.
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Authenticating user ID#" + pending_uid);
|
||||
|
||||
Connection conn = null;
|
||||
AuditRecord ar = null;
|
||||
|
||||
try
|
||||
{ // look for a user record matching this user ID
|
||||
conn = datapool.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE uid = " + pending_uid + ";");
|
||||
|
||||
if (!(rs.next()))
|
||||
{ // user not found
|
||||
logger.error("...user not found");
|
||||
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,0,remote_addr,"Bad token UID: " + pending_uid);
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
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,pending_uid,remote_addr,"Anonymous user");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
if (rs.getBoolean("lockout"))
|
||||
{ // account locked out
|
||||
logger.error("...user is locked out by the Admin");
|
||||
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,pending_uid,remote_addr,"Account locked out");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
// compare the stored token auth value to what we have
|
||||
if (!(pending_auth.equals(rs.getString("tokenauth"))))
|
||||
{ // the auth string is bad - we can't log in
|
||||
logger.warn("...invalid authentication string");
|
||||
ar = new AuditRecord(AuditRecord.LOGIN_FAIL,pending_uid,remote_addr,"Bad auth-string");
|
||||
return false;
|
||||
|
||||
} // 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,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
|
||||
|
||||
return true; // token authentication worked!
|
||||
|
||||
} // end authenticateWithToken
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface UserBackend
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -23,7 +23,6 @@ import org.apache.log4j.*;
|
|||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.util.DOMElementHelper;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.util.rcache.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
|
@ -385,6 +384,10 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
private static Category logger = Category.getInstance(VeniceEngineImpl.class.getName());
|
||||
|
||||
private static final String AUTH_ALPHABET =
|
||||
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./";
|
||||
private static final int AUTH_STRING_LEN = 32;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -406,7 +409,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
private int[] gp_ints; // global integer parameters
|
||||
private MasterSideBox[] sideboxes; // master sidebox table
|
||||
private Hashtable sidebox_ids = new Hashtable(); // maps sidebox IDs to MasterSideBox objects
|
||||
private Vector cache_fp_posts = new Vector(); // all posts that have been published to front page
|
||||
private LinkedList cache_fp_posts = new LinkedList(); // all posts that have been published to front page
|
||||
private boolean cache_fp_posts_busy = false; // busy flag for above vector
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -482,7 +485,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
this.config = config;
|
||||
|
||||
Vector dictionary_tmp;
|
||||
ArrayList dictionary_tmp;
|
||||
try
|
||||
{ // first, verify that this is a valid configuration
|
||||
Element root = config.getDocumentElement();
|
||||
|
@ -542,7 +545,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
} // end if
|
||||
|
||||
// Retrieve the list of dictionary files to load into the spellchecker.
|
||||
dictionary_tmp = new Vector();
|
||||
dictionary_tmp = new ArrayList();
|
||||
NodeList dict_nodes = dict_sect.getChildNodes();
|
||||
for (i=0; i<dict_nodes.getLength(); i++)
|
||||
{ // scan the <dictionary> element looking for <file> elements
|
||||
|
@ -625,15 +628,13 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
logger.debug(max_value + " features loaded from database");
|
||||
|
||||
// load the master sidebox table
|
||||
Vector sidebox_tmp = new Vector();
|
||||
ArrayList sidebox_tmp = new ArrayList();
|
||||
rs = stmt.executeQuery("SELECT * FROM refsidebox ORDER BY boxid;");
|
||||
while (rs.next())
|
||||
sidebox_tmp.add(new MasterSideBox(rs));
|
||||
|
||||
// store the real master sidebox table as an array
|
||||
sideboxes = new MasterSideBox[sidebox_tmp.size()];
|
||||
for (i=0; i<sidebox_tmp.size(); i++)
|
||||
sideboxes[i] = (MasterSideBox)(sidebox_tmp.get(i));
|
||||
sideboxes = (MasterSideBox[])(sidebox_tmp.toArray(new MasterSideBox[0]));
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug(sideboxes.length + " sidebox definitions loaded from database");
|
||||
|
||||
|
@ -671,10 +672,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
UserNameRewriter username_rewriter = new UserNameRewriter(datapool);
|
||||
|
||||
// Create the LazyLexicon that holds our dictionary files, and add it to the SpellingRewriter.
|
||||
String[] dictfiles = new String[dictionary_tmp.size()];
|
||||
for (i=0; i<dictionary_tmp.size(); i++)
|
||||
dictfiles[i] = (String)(dictionary_tmp.get(i));
|
||||
LazyTreeLexicon lex = new LazyTreeLexicon(dictfiles);
|
||||
LazyTreeLexicon lex = new LazyTreeLexicon((String[])(dictionary_tmp.toArray(new String[0])));
|
||||
spell_rewriter.addDictionary(lex);
|
||||
|
||||
html_configs = new HTMLCheckerConfig[4]; // create the array
|
||||
|
@ -771,7 +769,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
{
|
||||
checkInitialized();
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // do a SELECT on the refcountry table to load the master country list
|
||||
|
@ -803,7 +801,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getCountryList
|
||||
|
||||
|
@ -811,7 +809,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
{
|
||||
checkInitialized();
|
||||
Connection conn = null;
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
try
|
||||
{ // do a SELECT on the refcountry table to load the master country list
|
||||
|
@ -843,7 +841,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getLanguageList
|
||||
|
||||
|
@ -1225,8 +1223,8 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
logger.debug("User search: field = " + field + ", mode = " + mode + ", term '" + term + "', offset = "
|
||||
+ offset + ", count = " + count);
|
||||
|
||||
Vector rc = new Vector(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
ArrayList rc = new ArrayList(); // return from this function
|
||||
Connection conn = null; // pooled database connection
|
||||
|
||||
try
|
||||
{ // get a database connection
|
||||
|
@ -1309,7 +1307,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end searchForUsers
|
||||
|
||||
|
@ -1506,7 +1504,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
public List getPublishedMessages(boolean all) throws DataException
|
||||
{
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
|
||||
synchronized (this)
|
||||
{ // Make sure the cache is in condition.
|
||||
|
@ -1542,7 +1540,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
if (all) // add the extra postings to the list
|
||||
PublishedMessageImpl.backfillReturn(rc,datapool);
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getPublishedMessages
|
||||
|
||||
|
@ -1713,7 +1711,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
public List getSIGFeatureSet(BitSet enabled_features, int level, boolean read_privs)
|
||||
{
|
||||
checkInitialized();
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
for (int i=0; i<features.length; i++)
|
||||
if (enabled_features.get(i) && features[i].featureAllowed(level,read_privs))
|
||||
{ // this feature must be included in the eventual output set
|
||||
|
@ -1728,14 +1726,14 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
} // end if and for
|
||||
|
||||
if (insert_me) // insert at end by default
|
||||
rc.addElement(elt);
|
||||
rc.add(elt);
|
||||
|
||||
} // end if and for
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("getSIGFeatureSet() loaded " + rc.size() + " elements");
|
||||
|
||||
return new ReadOnlyVector(rc); // wrap the vector for return
|
||||
return Collections.unmodifiableList(rc); // wrap the vector for return
|
||||
|
||||
} // end getSIGFeatureSet
|
||||
|
||||
|
@ -1934,9 +1932,9 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
{
|
||||
if (pubmsg!=null)
|
||||
{ // add the new message
|
||||
cache_fp_posts.add(0,pubmsg);
|
||||
cache_fp_posts.addFirst(pubmsg);
|
||||
while (cache_fp_posts.size()>gp_ints[IP_NUMFRONTPAGEPOSTS])
|
||||
cache_fp_posts.remove(cache_fp_posts.size()-1);
|
||||
cache_fp_posts.removeLast();
|
||||
|
||||
} // end pubmsg
|
||||
|
||||
|
@ -1962,4 +1960,28 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end unpublish
|
||||
|
||||
public String generateRandomAuthString()
|
||||
{
|
||||
StringBuffer buf = new StringBuffer(AUTH_STRING_LEN);
|
||||
for (int i=0; i<AUTH_STRING_LEN; i++)
|
||||
buf.append(AUTH_ALPHABET.charAt(rng.nextInt(AUTH_ALPHABET.length())));
|
||||
return buf.toString();
|
||||
|
||||
} // end generateRandomAuthString
|
||||
|
||||
public boolean isValidRandomAuthString(String s)
|
||||
{
|
||||
if (s.length()!=AUTH_STRING_LEN)
|
||||
return false;
|
||||
for (int i=0; i<AUTH_STRING_LEN; i++)
|
||||
{ // verify each authentication character in turn
|
||||
if (AUTH_ALPHABET.indexOf(s.charAt(i))<0)
|
||||
return false;
|
||||
|
||||
} // end for
|
||||
|
||||
return true; // all tests passed - ship it!
|
||||
|
||||
} // end isValidRandomAuthString
|
||||
|
||||
} // end class VeniceEngineImpl
|
||||
|
|
|
@ -19,7 +19,6 @@ package com.silverwrist.venice.security;
|
|||
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
import com.silverwrist.venice.db.SQLUtil;
|
||||
import com.silverwrist.venice.core.AuditData;
|
||||
import com.silverwrist.venice.core.DataException;
|
||||
|
@ -34,9 +33,9 @@ public class AuditRecord implements AuditData
|
|||
|
||||
static class DescrStringCache
|
||||
{
|
||||
private Hashtable descr_cache = new Hashtable();
|
||||
private Hashtable uname_cache = new Hashtable();
|
||||
private Hashtable signame_cache = new Hashtable();
|
||||
private HashMap descr_cache = new HashMap();
|
||||
private HashMap uname_cache = new HashMap();
|
||||
private HashMap signame_cache = new HashMap();
|
||||
private Statement stmt;
|
||||
|
||||
DescrStringCache(Connection conn) throws SQLException
|
||||
|
@ -363,7 +362,7 @@ public class AuditRecord implements AuditData
|
|||
public static List getAuditRecords(Connection conn, int sigid, int offset, int count)
|
||||
throws SQLException, DataException
|
||||
{
|
||||
Vector rc = new Vector();
|
||||
ArrayList rc = new ArrayList();
|
||||
DescrStringCache cache = new DescrStringCache(conn);
|
||||
|
||||
Statement stmt = conn.createStatement();
|
||||
|
@ -380,7 +379,7 @@ public class AuditRecord implements AuditData
|
|||
|
||||
} // end while
|
||||
|
||||
return new ReadOnlyVector(rc);
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getAuditRecords
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
package com.silverwrist.venice.security;
|
||||
|
||||
import java.util.*;
|
||||
import com.silverwrist.util.collections.*;
|
||||
|
||||
public class Role implements Comparable, SecLevels
|
||||
{
|
||||
|
@ -31,12 +30,24 @@ public class Role implements Comparable, SecLevels
|
|||
private static Role no_access = null;
|
||||
private static Role unrestricted_user = null;
|
||||
private static Role sig_host = null;
|
||||
private static Vector global_low = null;
|
||||
private static Vector global_high = null;
|
||||
private static Vector sig_low = null;
|
||||
private static Vector sig_high = null;
|
||||
private static Vector conf_low = null;
|
||||
private static Vector conf_high = null;
|
||||
private static ArrayList global_low = null;
|
||||
private static ArrayList global_high = null;
|
||||
private static ArrayList sig_low = null;
|
||||
private static ArrayList sig_high = null;
|
||||
private static ArrayList conf_low = null;
|
||||
private static ArrayList conf_high = null;
|
||||
|
||||
private static List sigreadlist_rc = null;
|
||||
private static List sigwritelist_rc = null;
|
||||
private static List sigcreatelist_rc = null;
|
||||
private static List sigdeletelist_rc = null;
|
||||
private static List sigjoinlist_rc = null;
|
||||
private static List sig_member_levels = null;
|
||||
private static List confreadlist_rc = null;
|
||||
private static List confpostlist_rc = null;
|
||||
private static List confhidelist_rc = null;
|
||||
private static List confdeletelist_rc = null;
|
||||
private static List conf_member_levels = null;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
|
@ -58,80 +69,6 @@ public class Role implements Comparable, SecLevels
|
|||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static void initAllSets()
|
||||
{
|
||||
if (not_in_list==null)
|
||||
not_in_list = new Role(0,"(not in list)");
|
||||
|
||||
if (no_access==null)
|
||||
no_access = new Role(NO_ACCESS,"No Access");
|
||||
|
||||
if (unrestricted_user==null)
|
||||
unrestricted_user = new Role(UNRESTRICTED_USER,"'Unrestricted' User");
|
||||
|
||||
if (global_low==null)
|
||||
{ // initialize the "global lowband" vector
|
||||
global_low = new Vector(3);
|
||||
global_low.addElement(new Role(GLOBAL_ANONYMOUS,"Anonymous User"));
|
||||
global_low.addElement(new Role(GLOBAL_UNVERIFIED,"Unauthenticated User"));
|
||||
global_low.addElement(new Role(GLOBAL_NORMAL,"Normal User"));
|
||||
global_low.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
if (global_high==null)
|
||||
{ // initialize the "global highband" vector
|
||||
global_high = new Vector(3);
|
||||
global_high.addElement(new Role(GLOBAL_ANYADMIN,"Any System Administrator"));
|
||||
global_high.addElement(new Role(GLOBAL_PFY,"System Assistant Administrator"));
|
||||
global_high.addElement(new Role(GLOBAL_BOFH,"Global System Administrator"));
|
||||
global_high.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
if (sig_low==null)
|
||||
{ // initialize the "SIG lowband" vector
|
||||
sig_low = new Vector(1);
|
||||
sig_low.addElement(new Role(SIG_MEMBER,"SIG Member"));
|
||||
sig_low.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
if (sig_high==null)
|
||||
{ // initialize the "SIG highband" vector
|
||||
sig_high = new Vector(3);
|
||||
sig_high.addElement(new Role(SIG_ANYADMIN,"Any SIG Administrator"));
|
||||
sig_high.addElement(new Role(SIG_COHOST,"SIG Co-Host"));
|
||||
sig_host = new Role(SIG_HOST,"SIG Host");
|
||||
sig_high.addElement(sig_host);
|
||||
sig_high.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
if (conf_low==null)
|
||||
{ // initialize the "conference lowband" vector
|
||||
conf_low = new Vector(1);
|
||||
conf_low.addElement(new Role(CONFERENCE_MEMBER,"Conference Member"));
|
||||
conf_low.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
if (conf_high==null)
|
||||
{ // initialize the "conference highband" vector
|
||||
conf_high = new Vector(2);
|
||||
conf_high.addElement(new Role(CONFERENCE_ANYADMIN,"Any Conference Administrator"));
|
||||
conf_high.addElement(new Role(CONFERENCE_HOST,"Conference Host"));
|
||||
conf_high.trimToSize();
|
||||
|
||||
} // end if
|
||||
|
||||
} // end initAllSets
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -196,69 +133,95 @@ public class Role implements Comparable, SecLevels
|
|||
|
||||
public static List getSIGReadList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.firstElement());
|
||||
return new ReadOnlyVector(rc);
|
||||
if (sigreadlist_rc==null)
|
||||
{ // create the returned list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.get(0));
|
||||
sigreadlist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return sigreadlist_rc;
|
||||
|
||||
} // end getSIGReadList
|
||||
|
||||
public static List getSIGWriteList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (sigwritelist_rc==null)
|
||||
{ // build the return value
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
sigwritelist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return sigwritelist_rc;
|
||||
|
||||
} // end getSIGWriteList
|
||||
|
||||
public static List getSIGCreateList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.add(global_low.lastElement());
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.firstElement());
|
||||
return new ReadOnlyVector(rc);
|
||||
if (sigcreatelist_rc==null)
|
||||
{ // create the return list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.add(global_low.get(global_low.size()-1));
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.get(0));
|
||||
sigcreatelist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return sigcreatelist_rc;
|
||||
|
||||
} // end getSIGCreateList
|
||||
|
||||
public static List getSIGDeleteList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
rc.add(no_access);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (sigdeletelist_rc==null)
|
||||
{ // create the return list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
rc.add(no_access);
|
||||
sigdeletelist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return sigdeletelist_rc;
|
||||
|
||||
} // end getSIGDeleteList
|
||||
|
||||
public static List getSIGJoinList()
|
||||
{
|
||||
initAllSets();
|
||||
return new ReadOnlyVector(global_low);
|
||||
if (sigjoinlist_rc==null)
|
||||
sigjoinlist_rc = Collections.unmodifiableList(global_low);
|
||||
return sigjoinlist_rc;
|
||||
|
||||
} // end getSIGJoinList
|
||||
|
||||
public static List getSIGMemberLevelChoices()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.add(not_in_list);
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.remove(rc.size()-1);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (sig_member_levels==null)
|
||||
{ // figure out the member levels list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.add(not_in_list);
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(sig_high);
|
||||
rc.remove(rc.size()-1);
|
||||
sig_member_levels = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return sig_member_levels;
|
||||
|
||||
} // end getSIGMemberLevelChoices
|
||||
|
||||
|
@ -270,26 +233,36 @@ public class Role implements Comparable, SecLevels
|
|||
|
||||
public static List getConferenceReadList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (confreadlist_rc==null)
|
||||
{ // precalculate the conference read list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
confreadlist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return confreadlist_rc;
|
||||
|
||||
} // end getConferenceReadList
|
||||
|
||||
public static List getConferencePostList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(conf_high);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (confpostlist_rc==null)
|
||||
{ // precalculate the post list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.addAll(conf_high);
|
||||
confpostlist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return confpostlist_rc;
|
||||
|
||||
} // return getConferencePostList
|
||||
|
||||
|
@ -301,12 +274,17 @@ public class Role implements Comparable, SecLevels
|
|||
|
||||
public static List getConferenceHideList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(conf_high);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.firstElement());
|
||||
return new ReadOnlyVector(rc);
|
||||
if (confhidelist_rc==null)
|
||||
{ // precalculate the hide list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(conf_high);
|
||||
rc.addAll(sig_high);
|
||||
rc.add(global_high.get(0));
|
||||
confhidelist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return confhidelist_rc;
|
||||
|
||||
} // end getConferenceHideList
|
||||
|
||||
|
@ -324,27 +302,88 @@ public class Role implements Comparable, SecLevels
|
|||
|
||||
public static List getConferenceDeleteList()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
rc.add(no_access);
|
||||
return new ReadOnlyVector(rc);
|
||||
if (confdeletelist_rc==null)
|
||||
{ // precalculate the delete list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.addAll(sig_high);
|
||||
rc.addAll(global_high);
|
||||
rc.add(no_access);
|
||||
confdeletelist_rc = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return confdeletelist_rc;
|
||||
|
||||
} // end getConferenceDeleteList
|
||||
|
||||
public static List getConferenceMemberLevelChoices()
|
||||
{
|
||||
initAllSets();
|
||||
Vector rc = new Vector();
|
||||
rc.add(not_in_list);
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.add(conf_high.lastElement());
|
||||
return new ReadOnlyVector(rc);
|
||||
if (conf_member_levels==null)
|
||||
{ // precalculate the list
|
||||
ArrayList rc = new ArrayList();
|
||||
rc.add(not_in_list);
|
||||
rc.addAll(global_low);
|
||||
rc.addAll(sig_low);
|
||||
rc.addAll(conf_low);
|
||||
rc.add(unrestricted_user);
|
||||
rc.add(conf_high.get(conf_high.size()-1));
|
||||
conf_member_levels = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return conf_member_levels;
|
||||
|
||||
} // end getConferenceMemberLevelChoices
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static initializer
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static
|
||||
{
|
||||
not_in_list = new Role(0,"(not in list)");
|
||||
no_access = new Role(NO_ACCESS,"No Access");
|
||||
unrestricted_user = new Role(UNRESTRICTED_USER,"'Unrestricted' User");
|
||||
|
||||
// initialize the "global lowband" vector
|
||||
global_low = new ArrayList(3);
|
||||
global_low.add(new Role(GLOBAL_ANONYMOUS,"Anonymous User"));
|
||||
global_low.add(new Role(GLOBAL_UNVERIFIED,"Unauthenticated User"));
|
||||
global_low.add(new Role(GLOBAL_NORMAL,"Normal User"));
|
||||
global_low.trimToSize();
|
||||
|
||||
// initialize the "global highband" vector
|
||||
global_high = new ArrayList(3);
|
||||
global_high.add(new Role(GLOBAL_ANYADMIN,"Any System Administrator"));
|
||||
global_high.add(new Role(GLOBAL_PFY,"System Assistant Administrator"));
|
||||
global_high.add(new Role(GLOBAL_BOFH,"Global System Administrator"));
|
||||
global_high.trimToSize();
|
||||
|
||||
// initialize the "SIG lowband" vector
|
||||
sig_low = new ArrayList(1);
|
||||
sig_low.add(new Role(SIG_MEMBER,"SIG Member"));
|
||||
sig_low.trimToSize();
|
||||
|
||||
// initialize the "SIG highband" vector
|
||||
sig_high = new ArrayList(3);
|
||||
sig_high.add(new Role(SIG_ANYADMIN,"Any SIG Administrator"));
|
||||
sig_high.add(new Role(SIG_COHOST,"SIG Co-Host"));
|
||||
sig_host = new Role(SIG_HOST,"SIG Host");
|
||||
sig_high.add(sig_host);
|
||||
sig_high.trimToSize();
|
||||
|
||||
// initialize the "conference lowband" vector
|
||||
conf_low = new ArrayList(1);
|
||||
conf_low.add(new Role(CONFERENCE_MEMBER,"Conference Member"));
|
||||
conf_low.trimToSize();
|
||||
|
||||
// initialize the "conference highband" vector
|
||||
conf_high = new ArrayList(2);
|
||||
conf_high.add(new Role(CONFERENCE_ANYADMIN,"Any Conference Administrator"));
|
||||
conf_high.add(new Role(CONFERENCE_HOST,"Conference Host"));
|
||||
conf_high.trimToSize();
|
||||
|
||||
} // end static initializer
|
||||
|
||||
} // end class Role
|
||||
|
|
|
@ -36,6 +36,8 @@ public class Account extends VeniceServlet
|
|||
|
||||
private static final String DISPLAY_LOGIN_ATTR = "com.silverwrist.venice.servlets.internal.DisplayLogin";
|
||||
|
||||
private static final int COOKIE_LIFETIME = 60*60*24*365; // one year
|
||||
|
||||
private static Category logger = Category.getInstance(Account.class.getName());
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -159,6 +161,11 @@ public class Account extends VeniceServlet
|
|||
if (user.isLoggedIn())
|
||||
{ // this is a Logout command
|
||||
clearUserContext(request);
|
||||
|
||||
// delete the "login" cookie
|
||||
Cookie del_login_info = rdat.createCookie(Variables.LOGIN_COOKIE,"",0);
|
||||
Variables.saveCookie(request,del_login_info);
|
||||
|
||||
throw new RedirectResult("top"); // take 'em back to the "top" page
|
||||
|
||||
} // end if
|
||||
|
@ -299,7 +306,15 @@ public class Account extends VeniceServlet
|
|||
{ // use the user context to authenticate
|
||||
user.authenticate(dlg.getFieldValue("user"),dlg.getFieldValue("pass"));
|
||||
|
||||
// TODO: here is where the persistent cookie gets sent, if it does...
|
||||
// If they want a cookie, give it to them!
|
||||
final String yes = "Y";
|
||||
if (yes.equals(dlg.getFieldValue("saveme")))
|
||||
{ // create the authentication cookie and save it
|
||||
Cookie auth_cookie = rdat.createCookie(Variables.LOGIN_COOKIE,user.getAuthenticationToken(),
|
||||
COOKIE_LIFETIME);
|
||||
Variables.saveCookie(request,auth_cookie);
|
||||
|
||||
} // end if
|
||||
|
||||
// assuming it worked OK, redirect them back where they came from
|
||||
// (or to the verification page if they need to go there)
|
||||
|
|
|
@ -486,15 +486,43 @@ public class ConfOperations extends VeniceServlet
|
|||
|
||||
} // end if ("A" command)
|
||||
|
||||
if (cmd.equals("RP") || cmd.equals("RR"))
|
||||
{ // "RP" = "Report Posters," "RR" = "Report Readers" (requires conference parameter)
|
||||
if (cmd.equals("QR"))
|
||||
{ // "QR" = "Reports Menu" (requires conference parameter)
|
||||
ConferenceContext conf = getConferenceParameter(request,sig,true,on_error);
|
||||
on_error = "confops?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID() + "&cmd=Q";
|
||||
|
||||
try
|
||||
{ // display the "Conference Reports" display
|
||||
setMyLocation(request,"confops?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID() + "&cmd=QR");
|
||||
return new ReportConferenceMenu(sig,conf);
|
||||
|
||||
} // end try
|
||||
catch (DataException de)
|
||||
{ // unable to get the data for the list
|
||||
return new ErrorBox("Database Error","Database error getting topic list: " + de.getMessage(),on_error);
|
||||
|
||||
} // end catch
|
||||
catch (AccessError ae)
|
||||
{ // some sort of access error - display an error dialog
|
||||
return new ErrorBox("Access Error",ae.getMessage(),on_error);
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end if ("QR" command)
|
||||
|
||||
if (cmd.equals("RP") || cmd.equals("RR"))
|
||||
{ // "RP" = "Report Posters," "RR" = "Report Readers" (requires conference parameter, optional topic)
|
||||
ConferenceContext conf = getConferenceParameter(request,sig,true,on_error);
|
||||
TopicContext topic = getTopicParameter(request,conf,false,on_error);
|
||||
on_error = "confops?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID() + "&cmd=QR";
|
||||
|
||||
try
|
||||
{ // generate the listing on this page
|
||||
setMyLocation(request,"confops?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID() + "&cmd=" + cmd);
|
||||
return new ConferenceActivity(sig,conf,cmd.equals("RP"));
|
||||
String my_loc = "confops?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
if (topic!=null)
|
||||
my_loc += ("&top=" + topic.getTopicNumber());
|
||||
setMyLocation(request,my_loc + "&cmd=" + cmd);
|
||||
return new ConferenceActivity(sig,conf,topic,cmd.equals("RP"));
|
||||
|
||||
} // end try
|
||||
catch (DataException de)
|
||||
|
|
63
src/com/silverwrist/venice/servlets/FrameStatic.java
Normal file
63
src/com/silverwrist/venice/servlets/FrameStatic.java
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets;
|
||||
|
||||
import java.io.*;
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.servlets.format.*;
|
||||
|
||||
public class FrameStatic extends VeniceServlet
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Category logger = Category.getInstance(FrameStatic.class);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class HttpServlet
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public String getServletInfo()
|
||||
{
|
||||
String rc = "FrameStatic servlet - Displays a static page inside the Venice \"frame\"\n"
|
||||
+ "Part of the Venice Web Communities System\n";
|
||||
return rc;
|
||||
|
||||
} // end getServletInfo
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class VeniceServlet
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected VeniceContent doVeniceGet(HttpServletRequest request, VeniceEngine engine,
|
||||
UserContext user, RenderData rdat)
|
||||
throws ServletException, IOException, VeniceServletResult
|
||||
{
|
||||
setMyLocation(request,"frame" + request.getPathInfo());
|
||||
return StaticRender.getStaticRender(request.getPathInfo().substring(1));
|
||||
|
||||
} // end doVeniceGet
|
||||
|
||||
} // end class FrameStatic
|
|
@ -31,7 +31,7 @@ public class UserDisplay extends VeniceServlet
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Category logger = Category.getInstance(UserDisplay.class.getName());
|
||||
private static Category logger = Category.getInstance(UserDisplay.class);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class HttpServlet
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* 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 Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
|
@ -23,6 +23,7 @@ import javax.servlet.http.*;
|
|||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.servlets.format.*;
|
||||
import com.silverwrist.venice.servlets.format.menus.LeftMenu;
|
||||
|
||||
public class Variables
|
||||
{
|
||||
|
@ -35,19 +36,21 @@ public class Variables
|
|||
protected static final String ENGINE_ATTRIBUTE = "com.silverwrist.venice.core.Engine";
|
||||
protected static final String COUNTRYLIST_ATTRIBUTE = "com.silverwrist.venice.db.CountryList";
|
||||
protected static final String LANGUAGELIST_ATTRIBUTE = "com.silverwrist.venice.db.LanguageList";
|
||||
protected static final String TOPMENU_ATTRIBUTE = "com.silverwrist.venice.servlets.MenuTop";
|
||||
|
||||
// HttpSession ("session") attributes
|
||||
protected static final String USERCTXT_ATTRIBUTE = "user.context";
|
||||
protected static final String MENU_ATTRIBUTE = "current.menu";
|
||||
|
||||
// ServletRequest ("request" attributes)
|
||||
protected static final String COOKIEJAR_ATTRIBUTE = "com.silverwrist.venice.servlets.CookieJar";
|
||||
|
||||
// Servlet initialization parameters
|
||||
protected static final String ENGINE_INIT_PARAM = "venice.config";
|
||||
|
||||
// Cookie name
|
||||
public static final String LOGIN_COOKIE = "VeniceLogin";
|
||||
public static final String LOGIN_COOKIE = "VeniceAuth";
|
||||
|
||||
private static Category logger = Category.getInstance(Variables.class.getName());
|
||||
private static Category logger = Category.getInstance(Variables.class);
|
||||
private static Integer engine_gate = new Integer(0);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -90,7 +93,8 @@ public class Variables
|
|||
|
||||
} // end getVeniceEngine
|
||||
|
||||
public static UserContext getUserContext(ServletContext ctxt, ServletRequest request, HttpSession session)
|
||||
public static UserContext getUserContext(ServletContext ctxt, HttpServletRequest request,
|
||||
HttpSession session)
|
||||
throws ServletException
|
||||
{
|
||||
Object uctmp = session.getAttribute(USERCTXT_ATTRIBUTE);
|
||||
|
@ -101,6 +105,33 @@ public class Variables
|
|||
{ // use the Venice engine to create a new user context and save it off
|
||||
VeniceEngine engine = getVeniceEngine(ctxt);
|
||||
UserContext user = engine.createUserContext(request.getRemoteAddr());
|
||||
|
||||
// Did the user send a Venice authentication cookie? If so, try to use it.
|
||||
Cookie[] cookies = request.getCookies();
|
||||
Cookie venice_cookie = null;
|
||||
for (int i=0; (venice_cookie==null) && (i<cookies.length); i++)
|
||||
{ // look for a Venice authentication cookie
|
||||
if (LOGIN_COOKIE.equals(cookies[i].getName()))
|
||||
venice_cookie = cookies[i];
|
||||
|
||||
} // end for
|
||||
|
||||
if (venice_cookie!=null)
|
||||
{ // we've found the cookie - now attempt to authenticate with it
|
||||
if (!(user.authenticateWithToken(venice_cookie.getValue())))
|
||||
{ // the authentication failed - this cookie MUST be bogus, delete it!
|
||||
Cookie zapper = new Cookie(LOGIN_COOKIE,"");
|
||||
zapper.setMaxAge(0);
|
||||
zapper.setPath(request.getContextPath());
|
||||
saveCookie(request,zapper);
|
||||
|
||||
} // end if
|
||||
// else we're authenticated - let the cookie stay!
|
||||
|
||||
} // end if
|
||||
// else don't bother trying to authenticate
|
||||
|
||||
// save the user context off as usual and return it
|
||||
session.setAttribute(USERCTXT_ATTRIBUTE,user);
|
||||
return user;
|
||||
|
||||
|
@ -185,18 +216,31 @@ public class Variables
|
|||
public static void setMenuTop(ServletContext ctxt, HttpSession session)
|
||||
{
|
||||
Object obj = session.getAttribute(MENU_ATTRIBUTE);
|
||||
if ((obj==null) || !(obj instanceof MenuTop))
|
||||
{ // look for the common MenuTop object and set it to the session context
|
||||
obj = ctxt.getAttribute(TOPMENU_ATTRIBUTE);
|
||||
if (obj==null)
|
||||
{ // we don't have a common MenuTop yet...make one
|
||||
MenuTop mt = new MenuTop();
|
||||
ctxt.setAttribute(TOPMENU_ATTRIBUTE,mt);
|
||||
obj = mt;
|
||||
boolean do_change;
|
||||
if ((obj==null) || !(obj instanceof LeftMenu))
|
||||
do_change = true;
|
||||
else
|
||||
{ // look to see if this is the "top" menu
|
||||
LeftMenu mnu = (LeftMenu)obj;
|
||||
do_change = !(mnu.getIdentifier().equals("top"));
|
||||
|
||||
} // end if
|
||||
} // end else
|
||||
|
||||
session.setAttribute(MENU_ATTRIBUTE,obj);
|
||||
if (do_change)
|
||||
{ // get the new menu from the RenderConfig object and save it
|
||||
try
|
||||
{ // but note that getting the rendering configuration can throw a ServletException
|
||||
RenderConfig cfg = RenderConfig.getRenderConfig(ctxt);
|
||||
LeftMenu new_mnu = cfg.getLeftMenu("top");
|
||||
session.setAttribute(MENU_ATTRIBUTE,new_mnu);
|
||||
|
||||
} // end try
|
||||
catch (ServletException e)
|
||||
{ // if we fail, just clear it out
|
||||
logger.warn("caught ServletException in setMenuTop",e);
|
||||
session.removeAttribute(MENU_ATTRIBUTE);
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end if
|
||||
|
||||
|
@ -237,4 +281,41 @@ public class Variables
|
|||
|
||||
} // end failIfNull
|
||||
|
||||
public static void saveCookie(ServletRequest request, Cookie cookie)
|
||||
{
|
||||
ArrayList cookiejar = null;
|
||||
Object o = request.getAttribute(COOKIEJAR_ATTRIBUTE);
|
||||
if ((o==null) || !(o instanceof ArrayList))
|
||||
{ // create a new cookie jar and save it
|
||||
cookiejar = new ArrayList();
|
||||
request.setAttribute(COOKIEJAR_ATTRIBUTE,cookiejar);
|
||||
|
||||
} // end if
|
||||
else // found our cookie jar
|
||||
cookiejar = (ArrayList)o;
|
||||
|
||||
// save the cookie in the cookie jar (to be flushed later)
|
||||
cookiejar.add(cookie);
|
||||
|
||||
} // end saveCookie
|
||||
|
||||
public static void flushCookies(ServletRequest request, HttpServletResponse response)
|
||||
{
|
||||
Object o = request.getAttribute(COOKIEJAR_ATTRIBUTE);
|
||||
request.removeAttribute(COOKIEJAR_ATTRIBUTE);
|
||||
if (o instanceof ArrayList)
|
||||
{ // found the cookie jar - now take the cookies out and add them to the response
|
||||
ArrayList cookiejar = (ArrayList)o;
|
||||
Iterator it = cookiejar.iterator();
|
||||
while (it.hasNext())
|
||||
{ // add each cookie in turn
|
||||
Cookie cookie = (Cookie)(it.next());
|
||||
response.addCookie(cookie);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end if
|
||||
|
||||
} // end flushCookies
|
||||
|
||||
} // end class Variables
|
||||
|
|
|
@ -67,8 +67,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
} // end if
|
||||
else
|
||||
{ // a null SIGContext is permitted
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("no SIG specified");
|
||||
logger.debug("no SIG specified");
|
||||
return null;
|
||||
|
||||
} // end else
|
||||
|
@ -78,7 +77,15 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
SIGContext rc = null;
|
||||
try
|
||||
{ // turn the string into a SIGID, and thence to a SIGContext
|
||||
rc = user.getSIGContext(Integer.parseInt(str));
|
||||
int tmp_id = Integer.parseInt(str);
|
||||
rc = user.getSIGContext(tmp_id);
|
||||
if (rc==null)
|
||||
{ // trap any null results (may not be possible with SIGs, but you never know)
|
||||
logger.error("SIG #" + tmp_id + " was not found!");
|
||||
throw new ErrorBox(null,"The specified SIG (#" + tmp_id + ") was not found in the database.",on_error);
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("found SIG #" + rc.getSIGID());
|
||||
|
||||
|
@ -112,8 +119,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
} // end if
|
||||
else
|
||||
{ // a null TopicContext is permitted
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("no topic specified");
|
||||
logger.debug("no topic specified");
|
||||
return null;
|
||||
|
||||
} // end else
|
||||
|
@ -122,8 +128,17 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
|
||||
TopicContext rc = null;
|
||||
try
|
||||
{ // turn the string into a TopicID, and thence to a TopicContext
|
||||
rc = conf.getTopic(Short.parseShort(str));
|
||||
{ // turn the string into a topic number, and thence to a TopicContext
|
||||
short tmp_id = Short.parseShort(str);
|
||||
rc = conf.getTopic(tmp_id);
|
||||
if (rc==null)
|
||||
{ // the topic was not found!
|
||||
logger.error("ConfID #" + conf.getConfID() + " did not have topic #" + tmp_id);
|
||||
throw new ErrorBox(null,"Topic #" + tmp_id + " was not found in the '" + conf.getName()
|
||||
+ "' conference.",on_error);
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("found topic #" + rc.getTopicID());
|
||||
|
||||
|
@ -162,8 +177,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
} // end if
|
||||
else
|
||||
{ // a null TopicMessageContext is permitted
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("no message specified");
|
||||
logger.debug("no message specified");
|
||||
return null;
|
||||
|
||||
} // end else
|
||||
|
@ -173,7 +187,16 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
TopicMessageContext rc = null;
|
||||
try
|
||||
{ // turn the string into a postid, and thence to a TopicMessageContext
|
||||
rc = conf.getMessageByPostID(Long.parseLong(str));
|
||||
long tmp_id = Long.parseLong(str);
|
||||
rc = conf.getMessageByPostID(tmp_id);
|
||||
if (rc==null)
|
||||
{ // the message was not found
|
||||
logger.error("ConfID #" + conf.getConfID() + " does not contain postid " + tmp_id);
|
||||
throw new ErrorBox(null,"The post with ID number " + tmp_id + " was not found in the '"
|
||||
+ conf.getName() + "' conference.",on_error);
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("found post #" + rc.getPostID());
|
||||
|
||||
|
@ -212,8 +235,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
} // end if
|
||||
else
|
||||
{ // a null TopicMessageContext is permitted
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("no message specified");
|
||||
logger.debug("no message specified");
|
||||
return null;
|
||||
|
||||
} // end else
|
||||
|
@ -223,7 +245,16 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
TopicMessageContext rc = null;
|
||||
try
|
||||
{ // turn the string into a post number, and thence to a TopicMessageContext
|
||||
rc = topic.getMessage(Integer.parseInt(str));
|
||||
int tmp_id = Integer.parseInt(str);
|
||||
rc = topic.getMessage(tmp_id);
|
||||
if (rc==null)
|
||||
{ // could not find the message
|
||||
logger.error("TopicID " + topic.getTopicID() + " does not contain message #" + tmp_id);
|
||||
throw new ErrorBox(null,"There is no message #" + tmp_id + " in the '" + topic.getName() + "' topic.",
|
||||
on_error);
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("found post #" + rc.getPostID());
|
||||
|
||||
|
@ -360,8 +391,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
} // end if
|
||||
else
|
||||
{ // a null ConferenceContext is permitted
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("no conference specified");
|
||||
logger.debug("no conference specified");
|
||||
return null;
|
||||
|
||||
} // end else
|
||||
|
@ -371,7 +401,16 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
ConferenceContext rc = null;
|
||||
try
|
||||
{ // turn the string into a ConfID, and thence to a ConferenceContext
|
||||
rc = sig.getConferenceContext(Integer.parseInt(str));
|
||||
int tmp_id = Integer.parseInt(str);
|
||||
rc = sig.getConferenceContext(tmp_id);
|
||||
if (rc==null)
|
||||
{ // couldn't find the conference
|
||||
logger.error("SIG #" + sig.getSIGID() + " does not contain conference #" + tmp_id);
|
||||
throw new ErrorBox(null,"The conference #" + tmp_id + " could not be found in the '" + sig.getName()
|
||||
+ "' SIG.",on_error);
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("found conf #" + rc.getConfID());
|
||||
|
||||
|
@ -517,45 +556,79 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
{
|
||||
ServletContext ctxt = getServletContext();
|
||||
VeniceEngine engine = Variables.getVeniceEngine(ctxt);
|
||||
UserContext user = Variables.getUserContext(ctxt,request,request.getSession(true));
|
||||
RenderData rdat = RenderConfig.createRenderData(ctxt,request,response);
|
||||
VeniceContent content = null;
|
||||
|
||||
// Make all log messages for the request carry the remote address.
|
||||
NDC.push(request.getRemoteAddr());
|
||||
try
|
||||
{ // run the actual "get" in the servlet
|
||||
content = doVeniceGet(request,engine,user,rdat);
|
||||
{ // get the user context
|
||||
UserContext user = Variables.getUserContext(ctxt,request,request.getSession(true));
|
||||
boolean record_uname = user.isLoggedIn();
|
||||
if (record_uname)
|
||||
NDC.push(user.getUserName());
|
||||
|
||||
try
|
||||
{ // and now we proceed!
|
||||
RenderData rdat = RenderConfig.createRenderData(ctxt,user,request,response);
|
||||
|
||||
try
|
||||
{ // run the actual "get" in the servlet
|
||||
content = doVeniceGet(request,engine,user,rdat);
|
||||
|
||||
} // end try
|
||||
catch (VeniceServletResult res)
|
||||
{ // special VeniceServletResult catch here - figure out what result it is
|
||||
if (res instanceof VeniceContent)
|
||||
content = (VeniceContent)res; // this is content
|
||||
else if (res instanceof ContentResult)
|
||||
{ // this contains content
|
||||
ContentResult cres = (ContentResult)res;
|
||||
content = cres.getContent();
|
||||
|
||||
} // end else if
|
||||
else if (res instanceof ExecuteResult)
|
||||
{ // direct-execution result
|
||||
ExecuteResult xres = (ExecuteResult)res;
|
||||
Variables.flushCookies(request,response);
|
||||
xres.execute(rdat);
|
||||
return;
|
||||
|
||||
} // end else if
|
||||
else // unrecognized VeniceServletResult
|
||||
content = null;
|
||||
|
||||
} // end catch
|
||||
catch (RuntimeException re)
|
||||
{ // record that we caught a runtime exception in here!
|
||||
logger.error("VeniceServlet.doGet caught " + re.getClass().getName() + " in doVeniceGet",re);
|
||||
throw re;
|
||||
|
||||
} // end catch
|
||||
|
||||
Variables.flushCookies(request,response);
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
else // there is no content - display the null response
|
||||
rdat.nullResponse();
|
||||
|
||||
} // end try
|
||||
finally
|
||||
{ // pop the username from the NDC if we used it
|
||||
if (record_uname)
|
||||
NDC.pop();
|
||||
|
||||
} // end finally
|
||||
|
||||
} // end try
|
||||
catch (VeniceServletResult res)
|
||||
{ // special VeniceServletResult catch here - figure out what result it is
|
||||
if (res instanceof VeniceContent)
|
||||
content = (VeniceContent)res; // this is content
|
||||
else if (res instanceof ContentResult)
|
||||
{ // this contains content
|
||||
ContentResult cres = (ContentResult)res;
|
||||
content = cres.getContent();
|
||||
finally
|
||||
{ // pop the nested diagnostic context
|
||||
NDC.pop();
|
||||
|
||||
} // end else if
|
||||
else if (res instanceof ExecuteResult)
|
||||
{ // direct-execution result
|
||||
ExecuteResult xres = (ExecuteResult)res;
|
||||
xres.execute(rdat);
|
||||
return;
|
||||
|
||||
} // end else if
|
||||
else // unrecognized VeniceServletResult
|
||||
content = null;
|
||||
|
||||
} // end catch
|
||||
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
else // there is no content - display the null response
|
||||
rdat.nullResponse();
|
||||
} // end finally
|
||||
|
||||
} // end doGet
|
||||
|
||||
|
@ -564,67 +637,102 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
{
|
||||
ServletContext ctxt = getServletContext();
|
||||
VeniceEngine engine = Variables.getVeniceEngine(ctxt);
|
||||
UserContext user = Variables.getUserContext(ctxt,request,request.getSession(true));
|
||||
RenderData rdat = RenderConfig.createRenderData(ctxt,user,request,response);
|
||||
ServletMultipartHandler mphandler = null;
|
||||
VeniceContent content = null;
|
||||
|
||||
if (ServletMultipartHandler.canHandle(request))
|
||||
{ // if this is a multipart/form-data request, invoke our special handler code
|
||||
// Make all log messages for the request carry the remote address.
|
||||
NDC.push(request.getRemoteAddr());
|
||||
try
|
||||
{ // get the user context
|
||||
UserContext user = Variables.getUserContext(ctxt,request,request.getSession(true));
|
||||
boolean record_uname = user.isLoggedIn();
|
||||
if (record_uname)
|
||||
NDC.push(user.getUserName());
|
||||
|
||||
try
|
||||
{ // create the multipart handler
|
||||
mphandler = new ServletMultipartHandler(request);
|
||||
{ // and now we proceed!
|
||||
RenderData rdat = RenderConfig.createRenderData(ctxt,user,request,response);
|
||||
|
||||
if (ServletMultipartHandler.canHandle(request))
|
||||
{ // if this is a multipart/form-data request, invoke our special handler code
|
||||
try
|
||||
{ // create the multipart handler
|
||||
mphandler = new ServletMultipartHandler(request);
|
||||
|
||||
} // end try
|
||||
catch (ServletMultipartException e)
|
||||
{ // this is an error message we need to generate and just bail out on
|
||||
logger.error("ServletMultipartException caught in doVenicePost!",e);
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),
|
||||
new ErrorBox(null,"Internal Error: " + e.getMessage(),null));
|
||||
base.transfer(ctxt,rdat);
|
||||
return;
|
||||
|
||||
} // end if
|
||||
|
||||
} // end if
|
||||
|
||||
try
|
||||
{ // call the appropriate doVenicePost method
|
||||
if (mphandler!=null)
|
||||
content = doVenicePost(request,mphandler,engine,user,rdat);
|
||||
else
|
||||
content = doVenicePost(request,engine,user,rdat);
|
||||
|
||||
} // end try
|
||||
catch (VeniceServletResult res)
|
||||
{ // special VeniceServletResult catch here - figure out what result it is
|
||||
if (res instanceof VeniceContent)
|
||||
content = (VeniceContent)res; // this is content
|
||||
else if (res instanceof ContentResult)
|
||||
{ // this contains content
|
||||
ContentResult cres = (ContentResult)res;
|
||||
content = cres.getContent();
|
||||
|
||||
} // end else if
|
||||
else if (res instanceof ExecuteResult)
|
||||
{ // direct-execution result
|
||||
ExecuteResult xres = (ExecuteResult)res;
|
||||
Variables.flushCookies(request,response);
|
||||
xres.execute(rdat);
|
||||
return;
|
||||
|
||||
} // end else if
|
||||
else // unrecognized VeniceServletResult
|
||||
content = null;
|
||||
|
||||
} // end catch
|
||||
catch (RuntimeException re)
|
||||
{ // record that we caught a runtime exception in here!
|
||||
logger.error("VeniceServlet.doPost caught " + re.getClass().getName() + " in doVenicePost",re);
|
||||
throw re;
|
||||
|
||||
} // end catch
|
||||
|
||||
Variables.flushCookies(request,response);
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
else // there is no content - display the null response
|
||||
rdat.nullResponse();
|
||||
|
||||
} // end try
|
||||
catch (ServletMultipartException e)
|
||||
{ // this is an error message we need to generate and just bail out on
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),
|
||||
new ErrorBox(null,"Internal Error: " + e.getMessage(),null));
|
||||
base.transfer(ctxt,rdat);
|
||||
return;
|
||||
finally
|
||||
{ // pop the username from the NDC if we used it
|
||||
if (record_uname)
|
||||
NDC.pop();
|
||||
|
||||
} // end if
|
||||
|
||||
} // end if
|
||||
|
||||
try
|
||||
{ // call the appropriate doVenicePost method
|
||||
if (mphandler!=null)
|
||||
content = doVenicePost(request,mphandler,engine,user,rdat);
|
||||
else
|
||||
content = doVenicePost(request,engine,user,rdat);
|
||||
} // end finally
|
||||
|
||||
} // end try
|
||||
catch (VeniceServletResult res)
|
||||
{ // special VeniceServletResult catch here - figure out what result it is
|
||||
if (res instanceof VeniceContent)
|
||||
content = (VeniceContent)res; // this is content
|
||||
else if (res instanceof ContentResult)
|
||||
{ // this contains content
|
||||
ContentResult cres = (ContentResult)res;
|
||||
content = cres.getContent();
|
||||
finally
|
||||
{ // pop the nested diagnostic context
|
||||
NDC.pop();
|
||||
|
||||
} // end else if
|
||||
else if (res instanceof ExecuteResult)
|
||||
{ // direct-execution result
|
||||
ExecuteResult xres = (ExecuteResult)res;
|
||||
xres.execute(rdat);
|
||||
return;
|
||||
|
||||
} // end else if
|
||||
else // unrecognized VeniceServletResult
|
||||
content = null;
|
||||
|
||||
} // end catch
|
||||
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
else // there is no content - display the null response
|
||||
rdat.nullResponse();
|
||||
} // end finally
|
||||
|
||||
} // end doPost
|
||||
|
||||
|
|
|
@ -145,7 +145,6 @@ public class AuditDataViewer implements ContentRender
|
|||
} // end while
|
||||
|
||||
out.write("</TABLE>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -22,6 +22,8 @@ import java.io.IOException;
|
|||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.servlets.Variables;
|
||||
import com.silverwrist.venice.servlets.format.menus.LeftMenu;
|
||||
|
||||
public class BaseJSPData
|
||||
{
|
||||
|
@ -114,6 +116,22 @@ public class BaseJSPData
|
|||
|
||||
} // end transfer
|
||||
|
||||
public void renderMenu(HttpSession session, Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
ComponentRender menu = Variables.getMenu(session);
|
||||
if (menu==null)
|
||||
menu = (ComponentRender)(rdat.getLeftMenu("top"));
|
||||
menu.renderHere(out,rdat);
|
||||
|
||||
} // end renderMenu
|
||||
|
||||
public void renderFixedMenu(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
ComponentRender menu = (ComponentRender)(rdat.getLeftMenu("fixed"));
|
||||
menu.renderHere(out,rdat);
|
||||
|
||||
} // end renderFixedMenu
|
||||
|
||||
public void renderContent(ServletContext ctxt, Writer out, RenderData rdat)
|
||||
throws IOException, ServletException
|
||||
{
|
||||
|
@ -142,7 +160,7 @@ public class BaseJSPData
|
|||
rdat.flushOutput(); // now make sure the included page is properly flushed
|
||||
return;
|
||||
|
||||
} // end if
|
||||
} // end else if
|
||||
else // this is the fallback if we don't recognize the content
|
||||
new ErrorBox(null,"Internal Error: Content of invalid type",null).renderHere(out,rdat);
|
||||
|
||||
|
|
|
@ -39,24 +39,39 @@ public class ConferenceActivity implements JSPRender
|
|||
|
||||
private SIGContext sig; // the SIG we're in
|
||||
private ConferenceContext conf; // the conference being listed
|
||||
private TopicContext topic; // the topic being listed
|
||||
private boolean posters; // is this a list of posters?
|
||||
private List records; // the actual data records
|
||||
private String locator = null; // our locator
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public ConferenceActivity(SIGContext sig, ConferenceContext conf, boolean posters)
|
||||
public ConferenceActivity(SIGContext sig, ConferenceContext conf, TopicContext topic, boolean posters)
|
||||
throws DataException, AccessError
|
||||
{
|
||||
this.sig = sig;
|
||||
this.conf = conf;
|
||||
this.topic = topic;
|
||||
this.posters = posters;
|
||||
if (posters)
|
||||
this.records = conf.getActivePosters();
|
||||
if (topic!=null)
|
||||
{ // do the report on the topic
|
||||
if (posters)
|
||||
this.records = topic.getActivePosters();
|
||||
else
|
||||
this.records = topic.getActiveReaders();
|
||||
|
||||
} // end if
|
||||
else
|
||||
this.records = conf.getActiveReaders();
|
||||
{ // do the report on the conference
|
||||
if (posters)
|
||||
this.records = conf.getActivePosters();
|
||||
else
|
||||
this.records = conf.getActiveReaders();
|
||||
|
||||
} // end else
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -78,10 +93,22 @@ public class ConferenceActivity implements JSPRender
|
|||
|
||||
public String getPageTitle(RenderData rdat)
|
||||
{
|
||||
if (posters)
|
||||
return "Users Posting in Conference " + conf.getName();
|
||||
if (topic!=null)
|
||||
{ // it's a topic report
|
||||
if (posters)
|
||||
return "Users Posting in Topic " + topic.getName();
|
||||
else
|
||||
return "Users Reading Topic " + topic.getName();
|
||||
|
||||
} // end if
|
||||
else
|
||||
return "Users Reading Conference " + conf.getName();
|
||||
{ // it's a conference report
|
||||
if (posters)
|
||||
return "Users Posting in Conference " + conf.getName();
|
||||
else
|
||||
return "Users Reading Conference " + conf.getName();
|
||||
|
||||
} // end else
|
||||
|
||||
} // end getPageTitle
|
||||
|
||||
|
@ -113,12 +140,29 @@ public class ConferenceActivity implements JSPRender
|
|||
|
||||
} // end getConfName
|
||||
|
||||
public String getTopicName()
|
||||
{
|
||||
if (topic==null)
|
||||
return null;
|
||||
else
|
||||
return topic.getName();
|
||||
|
||||
} // end getTopicName
|
||||
|
||||
public String getLocator()
|
||||
{
|
||||
return "sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
if (locator==null)
|
||||
locator = "sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
return locator;
|
||||
|
||||
} // end getLocator
|
||||
|
||||
public boolean isTopicReport()
|
||||
{
|
||||
return (topic!=null);
|
||||
|
||||
} // end isTopicReport
|
||||
|
||||
public boolean isPosterReport()
|
||||
{
|
||||
return posters;
|
||||
|
|
|
@ -122,7 +122,6 @@ public class ConfirmBox implements ContentRender
|
|||
out.write("<IMG SRC=\"" + rdat.getFullImagePath("bn_no.gif")
|
||||
+ "\" ALT=\"No\" WIDTH=80 HEIGHT=24 BORDER=0></A>\n");
|
||||
out.write("</FONT></TD></TR></TABLE><P>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -216,7 +216,6 @@ public class ContentDialog implements Cloneable, ContentRender
|
|||
} // end if
|
||||
|
||||
out.write("</FONT></FORM>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -135,7 +135,6 @@ public class ContentMenuPanel implements Cloneable, ContentRender
|
|||
} // end while
|
||||
|
||||
out.write("</TABLE>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -78,7 +78,6 @@ public class ErrorBox extends VeniceServletResult implements ContentRender
|
|||
else
|
||||
out.write("<A HREF=\"" + rdat.getEncodedServletPath(back) + "\">Go back.</A>\n");
|
||||
out.write("<P></FONT></TD></TR></TABLE><P>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -37,8 +37,8 @@ public class LoginDialog extends ContentDialog
|
|||
addFormField(new CDPasswordFormFieldCommand("pass","Password",null,false,32,128,
|
||||
new CDImageButton("remind","bn_reminder.gif","Reminder",
|
||||
80,24)));
|
||||
//addFormField(new CDCheckBoxFormField("saveme","Save my user name and password for automatic logins",
|
||||
// null,"Y"));
|
||||
addFormField(new CDCheckBoxFormField("saveme","Remember me for next time so I can log in automatically",
|
||||
null,"Y"));
|
||||
addCommandButton(new CDImageButton("login","bn_log_in.gif","Log In",80,24));
|
||||
addCommandButton(new CDImageButton("cancel","bn_cancel.gif","Cancel",80,24));
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ public class ManageConference implements JSPRender
|
|||
|
||||
private SIGContext sig; // the SIG we're in
|
||||
private ConferenceContext conf; // the conference being listed
|
||||
private String locator = null; // the locator we use
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -116,7 +117,9 @@ public class ManageConference implements JSPRender
|
|||
|
||||
public String getLocator()
|
||||
{
|
||||
return "sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
if (locator==null)
|
||||
locator = "sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
return locator;
|
||||
|
||||
} // end getLocator
|
||||
|
||||
|
@ -128,8 +131,7 @@ public class ManageConference implements JSPRender
|
|||
|
||||
public boolean displayAdminSection()
|
||||
{
|
||||
return conf.canChangeConference();
|
||||
// TODO: needs to have "delete" permission OR'ed in
|
||||
return conf.canChangeConference() || conf.canDeleteConference();
|
||||
|
||||
} // end displayAdminSection
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import com.silverwrist.util.StringUtil;
|
|||
import com.silverwrist.venice.core.ConfigException;
|
||||
import com.silverwrist.venice.core.UserContext;
|
||||
import com.silverwrist.venice.servlets.Variables;
|
||||
import com.silverwrist.venice.servlets.format.menus.LeftMenu;
|
||||
|
||||
public class RenderConfig
|
||||
{
|
||||
|
@ -57,7 +58,8 @@ public class RenderConfig
|
|||
private String image_url;
|
||||
private String static_url;
|
||||
private String site_logo;
|
||||
private Hashtable stock_messages;
|
||||
private HashMap stock_messages;
|
||||
private HashMap menus;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -171,9 +173,10 @@ public class RenderConfig
|
|||
} // end if
|
||||
|
||||
// Initialize the stock messages list.
|
||||
stock_messages = new Hashtable();
|
||||
stock_messages = new HashMap();
|
||||
NodeList msg_nodes = msg_sect.getChildNodes();
|
||||
for (int i=0; i<msg_nodes.getLength(); i++)
|
||||
int i;
|
||||
for (i=0; i<msg_nodes.getLength(); i++)
|
||||
{ // examine all subnodes to add them to the message text
|
||||
Node msgn = msg_nodes.item(i);
|
||||
if (msgn.getNodeType()==Node.ELEMENT_NODE)
|
||||
|
@ -191,6 +194,56 @@ public class RenderConfig
|
|||
if (logger.isDebugEnabled())
|
||||
logger.debug(stock_messages.size() + " stock messages loaded from config");
|
||||
|
||||
Element menu_sect = root_h.getSubElement("menu-definitions");
|
||||
if (menu_sect==null)
|
||||
{ // no <menu-definitions/> section - bail out now!
|
||||
logger.fatal("config document has no <menu-definitions/> section");
|
||||
throw new ConfigException("no <menu-definitions/> section found in config file",root);
|
||||
|
||||
} // end if
|
||||
|
||||
// Initialize the menus list.
|
||||
menus = new HashMap();
|
||||
NodeList menu_nodes = menu_sect.getChildNodes();
|
||||
for (i=0; i<menu_nodes.getLength(); i++)
|
||||
{ // look for <menudef> subnodes and use them to initialize menus
|
||||
Node mn = menu_nodes.item(i);
|
||||
if (mn.getNodeType()==Node.ELEMENT_NODE)
|
||||
{ // found an element - now check it's name
|
||||
if (mn.getNodeName().equals("menudef"))
|
||||
{ // root of a menu definition - get its ID, build it, and save it
|
||||
Element mel = (Element)mn;
|
||||
String menuid = mel.getAttribute("id");
|
||||
if (menuid==null)
|
||||
{ // no menu ID attribute
|
||||
logger.fatal("<menudef/> seen with no \"id\" attribute");
|
||||
throw new ConfigException("<menudef/> seen with no \"id\" attribute",mel);
|
||||
|
||||
} // end if
|
||||
|
||||
// create the menu and add it to the mapping
|
||||
LeftMenu menu = new LeftMenu(mel,menuid);
|
||||
menus.put(menuid,menu);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("menu \"" + menuid + "\" defined");
|
||||
|
||||
} // end if (found the root of a menu definition)
|
||||
else
|
||||
{ // unknown element - bail out!
|
||||
logger.fatal("config document has unknown node <" + mn.getNodeName() +
|
||||
"/> inside <menu-definitions/>");
|
||||
throw new ConfigException("unknown node name <" + mn.getNodeName() + "/> in <menu-definitions/>",
|
||||
menu_sect);
|
||||
|
||||
} // end else
|
||||
|
||||
} // end if
|
||||
|
||||
} // end for
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug(menus.size() + " menu definitions loaded from config");
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -337,20 +390,6 @@ public class RenderConfig
|
|||
|
||||
} // end getRequiredBullet
|
||||
|
||||
void writeFooter(Writer out) throws IOException
|
||||
{
|
||||
out.write("<HR WIDTH=\"80%\">\n<TABLE ALIGN=CENTER BORDER=0 CELLPADDING=0 CELLSPACING=6><TR VALIGN=TOP>"
|
||||
+ "\n<TD ALIGN=RIGHT>\n");
|
||||
out.write(getStdFontTag(null,1));
|
||||
out.write(getStockMessage("footer-text"));
|
||||
out.write("</FONT>\n</TD>\n<TD ALIGN=LEFT>\n<A HREF=\"http://venice.sourceforge.net\" TARGET=\"_blank\">"
|
||||
+ "<IMG SRC=\"");
|
||||
out.write(getFullImagePath("powered-by-venice.gif"));
|
||||
out.write("\" ALT=\"Powered by Venice\" WIDTH=140 HEIGHT=80 BORDER=0 HSPACE=0 VSPACE=0></A>\n</TD>\n"
|
||||
+ "</TR></TABLE>\n");
|
||||
|
||||
} // end writeFooter
|
||||
|
||||
void writeContentHeader(Writer out, String primary, String secondary) throws IOException
|
||||
{
|
||||
out.write(getStdFontTag("#3333AA",5) + "<B>" + StringUtil.encodeHTML(primary) + "</B></FONT>");
|
||||
|
@ -374,6 +413,12 @@ public class RenderConfig
|
|||
|
||||
} // end writeStockMessage
|
||||
|
||||
public LeftMenu getLeftMenu(String identifier)
|
||||
{
|
||||
return (LeftMenu)(menus.get(identifier));
|
||||
|
||||
} // end getLeftMenu
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static operations for use by VeniceServlet
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -410,14 +455,14 @@ public class RenderConfig
|
|||
HttpServletResponse response) throws ServletException
|
||||
{
|
||||
UserContext uc = Variables.getUserContext(ctxt,request,request.getSession(true));
|
||||
return new RenderData(getRenderConfig(ctxt),uc,request,response);
|
||||
return new RenderData(getRenderConfig(ctxt),uc,ctxt,request,response);
|
||||
|
||||
} // end createRenderData
|
||||
|
||||
public static RenderData createRenderData(ServletContext ctxt, UserContext uc, HttpServletRequest request,
|
||||
HttpServletResponse response) throws ServletException
|
||||
{
|
||||
return new RenderData(getRenderConfig(ctxt),uc,request,response);
|
||||
return new RenderData(getRenderConfig(ctxt),uc,ctxt,request,response);
|
||||
|
||||
} // end createRenderData
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ import com.silverwrist.venice.core.IDUtils;
|
|||
import com.silverwrist.venice.core.UserContext;
|
||||
import com.silverwrist.venice.db.PostLinkRewriter;
|
||||
import com.silverwrist.venice.db.UserNameRewriter;
|
||||
import com.silverwrist.venice.servlets.format.menus.LeftMenu;
|
||||
|
||||
public class RenderData
|
||||
{
|
||||
|
@ -47,6 +48,7 @@ public class RenderData
|
|||
*/
|
||||
|
||||
private RenderConfig rconf;
|
||||
private ServletContext ctxt;
|
||||
private HttpServletRequest request;
|
||||
private HttpServletResponse response;
|
||||
private boolean can_gzip = false;
|
||||
|
@ -60,9 +62,11 @@ public class RenderData
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
RenderData(RenderConfig rconf, UserContext uc, HttpServletRequest request, HttpServletResponse response)
|
||||
RenderData(RenderConfig rconf, UserContext uc, ServletContext ctxt, HttpServletRequest request,
|
||||
HttpServletResponse response)
|
||||
{
|
||||
this.rconf = rconf;
|
||||
this.ctxt = ctxt;
|
||||
this.request = request;
|
||||
this.response = response;
|
||||
|
||||
|
@ -167,7 +171,13 @@ public class RenderData
|
|||
{
|
||||
return "/format/" + name;
|
||||
|
||||
} // end getFullFormatJSPPath
|
||||
} // end getFormatJSPPath
|
||||
|
||||
public String getStaticIncludePath(String name)
|
||||
{
|
||||
return "/static/" + name;
|
||||
|
||||
} // end getStaticIncludePath
|
||||
|
||||
public String getStdFontTag(String color, int size)
|
||||
{
|
||||
|
@ -193,12 +203,6 @@ public class RenderData
|
|||
|
||||
} // end getRequiredBullet
|
||||
|
||||
public void writeFooter(Writer out) throws IOException
|
||||
{
|
||||
rconf.writeFooter(out);
|
||||
|
||||
} // end writeFooter
|
||||
|
||||
public void writeContentHeader(Writer out, String primary, String secondary) throws IOException
|
||||
{
|
||||
rconf.writeContentHeader(out,primary,secondary);
|
||||
|
@ -250,6 +254,12 @@ public class RenderData
|
|||
|
||||
} // end writeStockMessage
|
||||
|
||||
public LeftMenu getLeftMenu(String identifier)
|
||||
{
|
||||
return rconf.getLeftMenu(identifier);
|
||||
|
||||
} // end getLeftMenu
|
||||
|
||||
public String formatDateForDisplay(Date date)
|
||||
{
|
||||
if (display_date==null)
|
||||
|
@ -491,4 +501,19 @@ public class RenderData
|
|||
|
||||
} // end rewritePostData
|
||||
|
||||
public String mapToPath(String path)
|
||||
{
|
||||
return ctxt.getRealPath(path);
|
||||
|
||||
} // end mapToPath
|
||||
|
||||
public Cookie createCookie(String name, String value, int age)
|
||||
{
|
||||
Cookie rc = new Cookie(name,value);
|
||||
rc.setMaxAge(age);
|
||||
rc.setPath(request.getContextPath());
|
||||
return rc;
|
||||
|
||||
} // end createCookie
|
||||
|
||||
} // end class RenderData
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format;
|
||||
|
||||
import java.util.*;
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
|
||||
public class ReportConferenceMenu implements JSPRender
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// Attribute name for request attribute
|
||||
protected static final String ATTR_NAME = "com.silverwrist.venice.content.ReportConferenceMenu";
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private SIGContext sig; // the SIG we're in
|
||||
private ConferenceContext conf; // the conference being listed
|
||||
private List topics; // the topics in this conference
|
||||
private String locator = null; // the locator
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public ReportConferenceMenu(SIGContext sig, ConferenceContext conf) throws DataException, AccessError
|
||||
{
|
||||
this.sig = sig;
|
||||
this.conf = conf;
|
||||
this.topics = conf.getTopicList(ConferenceContext.GET_ALL,ConferenceContext.SORT_NUMBER);
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External static functions
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public static ReportConferenceMenu retrieve(ServletRequest request)
|
||||
{
|
||||
return (ReportConferenceMenu)(request.getAttribute(ATTR_NAME));
|
||||
|
||||
} // end retrieve
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface VeniceContent
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public String getPageTitle(RenderData rdat)
|
||||
{
|
||||
return "Conference Reports: " + conf.getName();
|
||||
|
||||
} // end getPageTitle
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface JSPRender
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void store(ServletRequest request)
|
||||
{
|
||||
request.setAttribute(ATTR_NAME,this);
|
||||
|
||||
} // end store
|
||||
|
||||
public String getTargetJSPName()
|
||||
{
|
||||
return "report_conf.jsp";
|
||||
|
||||
} // end getTargetJSPName
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int getConfID()
|
||||
{
|
||||
return conf.getConfID();
|
||||
|
||||
} // end getConfID
|
||||
|
||||
public String getConfName()
|
||||
{
|
||||
return conf.getName();
|
||||
|
||||
} // end getConfName
|
||||
|
||||
public String getLocator()
|
||||
{
|
||||
if (locator==null)
|
||||
locator = "sig=" + sig.getSIGID() + "&conf=" + conf.getConfID();
|
||||
return locator;
|
||||
|
||||
} // end getLocator
|
||||
|
||||
public Iterator getTopics()
|
||||
{
|
||||
return topics.iterator();
|
||||
|
||||
} // end getTopics
|
||||
|
||||
} // end class ReportConferenceMenu
|
184
src/com/silverwrist/venice/servlets/format/StaticRender.java
Normal file
184
src/com/silverwrist/venice/servlets/format/StaticRender.java
Normal file
|
@ -0,0 +1,184 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format;
|
||||
|
||||
import java.io.*;
|
||||
import com.silverwrist.util.cachemap.CacheMap;
|
||||
|
||||
public class StaticRender implements ContentRender
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data values
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static CacheMap cache = new CacheMap(15,25);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private String name;
|
||||
private boolean processed = false;
|
||||
private String title = null;
|
||||
private String content = null;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data values
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected StaticRender(String name)
|
||||
{
|
||||
this.name = name;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static String searchBetweenTags(StringBuffer data, String search, String tagname)
|
||||
{
|
||||
tagname = tagname.toUpperCase();
|
||||
String start = "<" + tagname;
|
||||
String end = "</" + tagname + ">";
|
||||
|
||||
int startpos = search.indexOf(start);
|
||||
if (startpos<0)
|
||||
return null;
|
||||
startpos += start.length();
|
||||
|
||||
int bkt_pos = search.indexOf('>',startpos);
|
||||
if (bkt_pos<0)
|
||||
return null;
|
||||
|
||||
int end_pos = search.indexOf(end,++bkt_pos);
|
||||
if (end_pos<0)
|
||||
return data.substring(bkt_pos);
|
||||
else
|
||||
return data.substring(bkt_pos,end_pos);
|
||||
|
||||
} // end searchBetweenTags
|
||||
|
||||
private synchronized void process(RenderData rdat)
|
||||
{
|
||||
if (processed)
|
||||
return; // check and set flag
|
||||
|
||||
// Map the content path to a real filename.
|
||||
String real_path = rdat.mapToPath(rdat.getStaticIncludePath(name));
|
||||
if (real_path==null)
|
||||
{ // not found!
|
||||
title = name;
|
||||
content = "File not mappable: " + name;
|
||||
return;
|
||||
|
||||
} // end if
|
||||
|
||||
// Read in the whole thing.
|
||||
StringBuffer raw_file = new StringBuffer();
|
||||
try
|
||||
{ // read in from the file
|
||||
FileReader rdr = new FileReader(real_path);
|
||||
char[] buffer = new char[4096];
|
||||
int rd = rdr.read(buffer);
|
||||
while (rd>=0)
|
||||
{ // read in the raw characters
|
||||
if (rd>0)
|
||||
raw_file.append(buffer,0,rd);
|
||||
rd = rdr.read(buffer);
|
||||
|
||||
} // end while
|
||||
|
||||
rdr.close();
|
||||
|
||||
} // end try
|
||||
catch (IOException ioe)
|
||||
{ // I/O exception - just discard
|
||||
title = name;
|
||||
content = "I/O error reading " + name + ": " + ioe.getMessage();
|
||||
return;
|
||||
|
||||
} // end catch
|
||||
|
||||
// make the upper-case search page and use that to locate the page title and body
|
||||
String search_page = raw_file.toString().toUpperCase();
|
||||
title = searchBetweenTags(raw_file,search_page,"TITLE");
|
||||
content = searchBetweenTags(raw_file,search_page,"BODY");
|
||||
if (content==null)
|
||||
{ // no content?
|
||||
content = "No content seen on " + name;
|
||||
processed = false;
|
||||
|
||||
} // end if
|
||||
|
||||
processed = true; // set the flag to indicate we've got everything
|
||||
|
||||
} // end process
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface VeniceContent
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public String getPageTitle(RenderData rdat)
|
||||
{
|
||||
process(rdat);
|
||||
if (title==null)
|
||||
return name;
|
||||
else
|
||||
return title;
|
||||
|
||||
} // end getPageTitle
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface ContentRender
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
process(rdat);
|
||||
if (content!=null)
|
||||
out.write(content);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External static operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public static StaticRender getStaticRender(String name)
|
||||
{
|
||||
StaticRender rc = (StaticRender)(cache.get(name));
|
||||
if (rc==null)
|
||||
{ // create a new object and cache it
|
||||
rc = new StaticRender(name);
|
||||
cache.put(name,rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return rc;
|
||||
|
||||
} // end getStaticRender
|
||||
|
||||
} // end class StaticRender
|
|
@ -149,7 +149,6 @@ public class TextMessageDialog implements ContentRender
|
|||
} // end for
|
||||
|
||||
out.write("</DIV>\n");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -243,7 +243,6 @@ public class TopDisplay implements ContentRender
|
|||
|
||||
// Finish up.
|
||||
out.write("</TD>\n</TR></TABLE>");
|
||||
rdat.writeFooter(out);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
|
|
|
@ -15,58 +15,43 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.util.collections;
|
||||
package com.silverwrist.venice.servlets.format.menus;
|
||||
|
||||
import java.util.*;
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
public class ReadOnlyVector extends AbstractList
|
||||
class AbsoluteLeftMenuItem extends LeftMenuItem
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Vector my_vec; // local vector
|
||||
String url;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public ReadOnlyVector(Vector vec)
|
||||
AbsoluteLeftMenuItem(Element elt)
|
||||
{
|
||||
my_vec = vec;
|
||||
my_vec.trimToSize();
|
||||
super(elt);
|
||||
DOMElementHelper h = new DOMElementHelper(elt);
|
||||
url = h.getSubElementText("absolute");
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* finalize() method
|
||||
* Overrides from class LeftMenuItem
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected void finalize() throws Throwable
|
||||
protected void appendURL(StringBuffer sbuf, RenderData rdat)
|
||||
{
|
||||
my_vec = null;
|
||||
super.finalize();
|
||||
sbuf.append(url);
|
||||
|
||||
} // end finalize
|
||||
} // end appendURL
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* 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
|
||||
} // end class AbsoluteLeftMenuItem
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format.menus;
|
||||
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
class FrameLeftMenuItem extends LeftMenuItem
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
String url;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
FrameLeftMenuItem(Element elt)
|
||||
{
|
||||
super(elt);
|
||||
DOMElementHelper h = new DOMElementHelper(elt);
|
||||
url = h.getSubElementText("frame");
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class LeftMenuItem
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected void appendURL(StringBuffer sbuf, RenderData rdat)
|
||||
{
|
||||
sbuf.append(rdat.getEncodedServletPath("frame/" + url));
|
||||
|
||||
} // end appendURL
|
||||
|
||||
} // end class FrameLeftMenuItem
|
188
src/com/silverwrist/venice/servlets/format/menus/LeftMenu.java
Normal file
188
src/com/silverwrist/venice/servlets/format/menus/LeftMenu.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 Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format.menus;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.core.ConfigException;
|
||||
import com.silverwrist.venice.servlets.format.ComponentRender;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
public class LeftMenu implements ComponentRender
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class representing a header component
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static class Header implements ComponentRender
|
||||
{
|
||||
private String txt; // the actual stored text
|
||||
|
||||
Header(Element elt)
|
||||
{
|
||||
DOMElementHelper h = new DOMElementHelper(elt);
|
||||
StringBuffer buf = new StringBuffer("<B>");
|
||||
buf.append(StringUtil.encodeHTML(h.getElementText())).append("</B><BR>\n");
|
||||
txt = buf.toString();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
out.write(txt);
|
||||
|
||||
} // end renderHere
|
||||
|
||||
} // end class Header
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class representing a separator component
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static class Separator implements ComponentRender
|
||||
{
|
||||
Separator()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
out.write("<BR>\n");
|
||||
|
||||
} // end renderHere
|
||||
|
||||
} // end class Separator
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Category logger = Category.getInstance(LeftMenu.class);
|
||||
private static final Separator separator_singleton = new Separator();
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private String identifier;
|
||||
private ArrayList menu_items = new ArrayList();
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public LeftMenu(Element elt, String identifier) throws ConfigException
|
||||
{
|
||||
if (!(elt.getNodeName().equals("menudef")))
|
||||
{ // just some shorts-checking here to make sure the element is OK
|
||||
logger.fatal("huh?!? this should have been a <menudef/> if it got here!");
|
||||
throw new ConfigException("not a <menudef/> element");
|
||||
|
||||
} // end if
|
||||
|
||||
NodeList items = elt.getChildNodes();
|
||||
for (int i=0; i<items.getLength(); i++)
|
||||
{ // examine each of the child elements closely
|
||||
Node n = items.item(i);
|
||||
if (n.getNodeType()==Node.ELEMENT_NODE)
|
||||
{ // we've found a child element - what type is it?
|
||||
if (n.getNodeName().equals("menuitem"))
|
||||
{ // investigate the contents of the subelement
|
||||
DOMElementHelper h = new DOMElementHelper((Element)n);
|
||||
if (!(h.hasChildElement("text")))
|
||||
{ // no menu item text!
|
||||
logger.fatal("<menuitem/> element has no <text/> subelement");
|
||||
throw new ConfigException("<menuitem/> element has no <text/> subelement",h.getElement());
|
||||
|
||||
} // end if
|
||||
|
||||
LeftMenuItem mitem = null;
|
||||
if (h.hasChildElement("servlet"))
|
||||
mitem = new ServletLeftMenuItem(h.getElement());
|
||||
else if (h.hasChildElement("absolute"))
|
||||
mitem = new AbsoluteLeftMenuItem(h.getElement());
|
||||
else if (h.hasChildElement("frame"))
|
||||
mitem = new FrameLeftMenuItem(h.getElement());
|
||||
else
|
||||
{ // we don't know what type of menu this is!
|
||||
logger.fatal("unknown <menuitem/> type seen in menu");
|
||||
throw new ConfigException("unknown <menuitem/> type seen in menu",h.getElement());
|
||||
|
||||
} // end else
|
||||
|
||||
menu_items.add(mitem);
|
||||
|
||||
} // end if
|
||||
else if (n.getNodeName().equals("header"))
|
||||
menu_items.add(new Header((Element)n)); // add a new header
|
||||
else if (n.getNodeName().equals("separator"))
|
||||
menu_items.add(separator_singleton); // all separators are exactly the same
|
||||
else
|
||||
{ // menu definition has an unknown item
|
||||
logger.fatal("unknown element <" + n.getNodeName() + "/> inside <menudef/>");
|
||||
throw new ConfigException("unknown element <" + n.getNodeName() + "/> inside <menudef/>",n);
|
||||
|
||||
} // end else
|
||||
|
||||
} // end if (an element node)
|
||||
|
||||
} // end for (each child node)
|
||||
|
||||
this.identifier = identifier;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface ComponentRender
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
Iterator it = menu_items.iterator();
|
||||
while (it.hasNext())
|
||||
{ // render each menu item in turn
|
||||
ComponentRender cr = (ComponentRender)(it.next());
|
||||
cr.renderHere(out,rdat);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end renderHere
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public String getIdentifier()
|
||||
{
|
||||
return identifier;
|
||||
|
||||
} // end getIdentifier
|
||||
|
||||
} // end class LeftMenu
|
||||
|
|
@ -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 Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format.menus;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.io.IOException;
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.servlets.format.ComponentRender;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
abstract class LeftMenuItem implements ComponentRender
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private String text;
|
||||
private boolean disabled = false;
|
||||
private boolean new_window = false;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected LeftMenuItem(Element elt)
|
||||
{
|
||||
DOMElementHelper h = new DOMElementHelper(elt);
|
||||
text = StringUtil.encodeHTML(h.getSubElementText("text"));
|
||||
if (h.hasChildElement("disabled"))
|
||||
disabled = true;
|
||||
if (h.hasChildElement("new-window"))
|
||||
new_window = true;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Abstract functions which MUST be overridden
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected abstract void appendURL(StringBuffer sbuf, RenderData rdat);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface ComponentRender
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void renderHere(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
if (disabled)
|
||||
buf.append("<FONT COLOR=\"#CCCCCC\">");
|
||||
else
|
||||
{ // write the <A> tag
|
||||
buf.append("<A HREF=\"");
|
||||
appendURL(buf,rdat);
|
||||
buf.append('"');
|
||||
if (new_window)
|
||||
buf.append(" TARGET=\"_blank\"");
|
||||
buf.append('>');
|
||||
|
||||
} // end else (writing <A> tag)
|
||||
|
||||
buf.append(text);
|
||||
if (disabled)
|
||||
buf.append("</FONT>");
|
||||
else
|
||||
buf.append("</A>");
|
||||
buf.append("<BR>\n");
|
||||
out.write(buf.toString());
|
||||
|
||||
} // end renderHere
|
||||
|
||||
} // end class LeftMenuItem
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.servlets.format.menus;
|
||||
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
class ServletLeftMenuItem extends LeftMenuItem
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
String url;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
ServletLeftMenuItem(Element elt)
|
||||
{
|
||||
super(elt);
|
||||
DOMElementHelper h = new DOMElementHelper(elt);
|
||||
url = h.getSubElementText("servlet");
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class LeftMenuItem
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected void appendURL(StringBuffer sbuf, RenderData rdat)
|
||||
{
|
||||
sbuf.append(rdat.getEncodedServletPath(url));
|
||||
|
||||
} // end appendURL
|
||||
|
||||
} // end class ServletLeftMenuItem
|
|
@ -38,4 +38,3 @@
|
|||
WIDTH=80 HEIGHT=24 BORDER=0>
|
||||
</FORM><P>
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -20,19 +20,6 @@
|
|||
<%@ page import = "com.silverwrist.venice.core.*" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.Variables" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.format.*" %>
|
||||
<%!
|
||||
|
||||
private static void renderMenu(HttpSession session, java.io.Writer out, RenderData rdat)
|
||||
throws java.io.IOException
|
||||
{
|
||||
ComponentRender menu = Variables.getMenu(session);
|
||||
if (menu==null)
|
||||
menu = new MenuTop();
|
||||
menu.renderHere(out,rdat);
|
||||
|
||||
} // end renderMenu
|
||||
|
||||
%>
|
||||
<%
|
||||
BaseJSPData basedat = BaseJSPData.retrieve(request);
|
||||
Variables.failIfNull(basedat);
|
||||
|
@ -97,36 +84,51 @@ private static void renderMenu(HttpSession session, java.io.Writer out, RenderDa
|
|||
<% if (rdat.useHTMLComments()) { %><!-- END PAGE HEADER --><% } %>
|
||||
|
||||
<TR VALIGN=TOP><TD ALIGN=CENTER>
|
||||
<TABLE ALIGN=CENTER WIDTH="100%" BORDER=0 CELLPADDING=2 CELLSPACING=0><TR VALIGN=TOP>
|
||||
<TD ALIGN=LEFT WIDTH=120 BGCOLOR="#9999FF">
|
||||
<TABLE ALIGN=LEFT WIDTH=120 CELPADDING=0 CELLSPACING=0>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- BEGIN LEFT SIDEBAR --><% } %>
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT><%= rdat.getStdFontTag(null,2) %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- variable menu --><% } %>
|
||||
<% renderMenu(session,out,rdat); %>
|
||||
</FONT></TD></TR>
|
||||
<TABLE ALIGN=CENTER WIDTH="100%" BORDER=0 CELLPADDING=2 CELLSPACING=0>
|
||||
<TR VALIGN=TOP>
|
||||
<TD ALIGN=LEFT WIDTH=120 BGCOLOR="#9999FF">
|
||||
<TABLE ALIGN=LEFT WIDTH=120 CELPADDING=0 CELLSPACING=0>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- BEGIN LEFT SIDEBAR --><% } %>
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT><%= rdat.getStdFontTag(null,2) %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- variable menu --><% } %>
|
||||
<% basedat.renderMenu(session,out,rdat); %>
|
||||
</FONT></TD></TR>
|
||||
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT> </TD></TR>
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT><%= rdat.getStdFontTag(null,2) %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- fixed menu --><% } %>
|
||||
<B>About This Site</B><BR>
|
||||
<A HREF="/TODO">Documentation</A><BR>
|
||||
<A HREF="/TODO">About Venice</A>
|
||||
</FONT></TD></TR>
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT> </TD></TR>
|
||||
<TR VALIGN=TOP><TD VALIGN=LEFT><%= rdat.getStdFontTag(null,2) %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- fixed menu --><% } %>
|
||||
<% basedat.renderFixedMenu(out,rdat); %>
|
||||
</FONT></TD></TR>
|
||||
|
||||
<% if (rdat.useHTMLComments()) { %><!-- END LEFT SIDEBAR --><% } %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- END LEFT SIDEBAR --><% } %>
|
||||
|
||||
</TABLE>
|
||||
</TD>
|
||||
</TABLE>
|
||||
</TD>
|
||||
|
||||
<TD ALIGN=LEFT WIDTH="100%" BGCOLOR="white">
|
||||
<TABLE WIDTH="100%" BORDER=0 CELLPADDING=2 CELLSPACING=0><TR VALIGN=TOP><TD ALIGN=LEFT>
|
||||
<TD ALIGN=LEFT WIDTH="100%" BGCOLOR="white">
|
||||
<% if (rdat.useHTMLComments()) { %><!-- BEGIN PAGE CONTENT --><% } %>
|
||||
<% basedat.renderContent(application,out,rdat); %>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- END PAGE CONTENT --><% } %>
|
||||
</TD></TR></TABLE>
|
||||
</TD>
|
||||
</TR></TABLE>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- END PAGE CONTENT --><% } %>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR VALIGN=TOP>
|
||||
<TD ALIGN=LEFT WIDTH=120 BGCOLOR="#9999FF"> </TD>
|
||||
<TD ALIGN=LEFT WIDTH="100%" BGCOLOR="white">
|
||||
<% if (rdat.useHTMLComments()) { %><!-- PAGE FOOTER --><% } %>
|
||||
<HR WIDTH="80%">
|
||||
<TABLE ALIGN=CENTER BORDER=0 CELLPADDING=0 CELLSPACING=6><TR VALIGN=TOP>
|
||||
<TD ALIGN=RIGHT><%= rdat.getStdFontTag(null,1) %>
|
||||
<%= rdat.getStockMessage("footer-text") %>
|
||||
</FONT></TD>
|
||||
<TD ALIGN=LEFT>
|
||||
<A HREF="http://venice.sourceforge.net" TARGET="_blank"><IMG
|
||||
SRC="<%= rdat.getFullImagePath("powered-by-venice.gif") %>" ALT="Powered by Venice"
|
||||
WIDTH=140 HEIGHT=80 BORDER=0 HSPACE=0 VSPACE=0></A>
|
||||
</TD>
|
||||
</TR></TABLE>
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</TD></TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
|
|
|
@ -25,11 +25,18 @@
|
|||
Variables.failIfNull(data);
|
||||
RenderData rdat = RenderConfig.createRenderData(application,request,response);
|
||||
%>
|
||||
<% rdat.writeContentHeader(out,(data.isPosterReport() ? "Posters in Conference:"
|
||||
: "Readers in Conference:"),data.getConfName()); %>
|
||||
<%
|
||||
if (data.isTopicReport())
|
||||
rdat.writeContentHeader(out,(data.isPosterReport() ? "Posters in Topic:"
|
||||
: "Readers in Topic:"),
|
||||
data.getTopicName() + " in " + data.getConfName());
|
||||
else
|
||||
rdat.writeContentHeader(out,(data.isPosterReport() ? "Posters in Conference:"
|
||||
: "Readers in Conference:"),data.getConfName());
|
||||
%>
|
||||
<%= rdat.getStdFontTag(null,2) %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=Q") %>">Return to
|
||||
Manage Conference Menu</A>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=QR") %>">Return to
|
||||
Conference Reports Menu</A>
|
||||
</FONT><P>
|
||||
|
||||
<% if (data.anyElements()) { %>
|
||||
|
@ -79,11 +86,18 @@
|
|||
</TABLE>
|
||||
<% } else { %>
|
||||
<%= rdat.getStdFontTag(null,2) %><EM>
|
||||
<% if (data.isPosterReport()) { %>
|
||||
No posters to conference "<%= StringUtil.encodeHTML(data.getConfName()) %>" found.
|
||||
<% if (data.isTopicReport()) { %>
|
||||
<% if (data.isPosterReport()) { %>
|
||||
No posters to topic "<%= data.getTopicName() %>" found.
|
||||
<% } else { %>
|
||||
No readers of topic "<%= data.getTopicName() %>" found.
|
||||
<% } // end if %>
|
||||
<% } else { %>
|
||||
No readers of conference "<%= StringUtil.encodeHTML(data.getConfName()) %>" found.
|
||||
<% if (data.isPosterReport()) { %>
|
||||
No posters to conference "<%= StringUtil.encodeHTML(data.getConfName()) %>" found.
|
||||
<% } else { %>
|
||||
No readers of conference "<%= StringUtil.encodeHTML(data.getConfName()) %>" found.
|
||||
<% } // end if %>
|
||||
<% } // end if %>
|
||||
</EM></FONT>
|
||||
<% } // end if %>
|
||||
<P><% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -151,4 +151,3 @@
|
|||
WIDTH=80 HEIGHT=24 BORDER=0>
|
||||
</FORM><BR>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -137,4 +137,3 @@
|
|||
<% } else { %>
|
||||
<%= rdat.getStdFontTag(null,2) %><EM>There are no conferences in this SIG.</EM></FONT>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -72,4 +72,3 @@
|
|||
BORDER=0></A>
|
||||
<% } // end if %>
|
||||
</DIV>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -286,4 +286,3 @@ private static String getActivityString(SIGContext sig, RenderData rdat)
|
|||
|
||||
</TABLE><BR CLEAR=LEFT>
|
||||
<% } // end if (results found) %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -96,4 +96,3 @@
|
|||
by visiting the conferences and pressing the "Add to Hotlist" button.
|
||||
</EM></FONT>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -49,4 +49,3 @@
|
|||
</TD></TR>
|
||||
</TABLE>
|
||||
</FORM>
|
||||
<% rdat.writeFooter(out); %>
|
|
@ -68,4 +68,3 @@
|
|||
</FORM>
|
||||
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -61,13 +61,9 @@
|
|||
Conference Aliases</A><P>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=M") %>">Manage
|
||||
Conference Members</A><P>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=RP") %>">Conference
|
||||
Posters Report</A><P>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=RR") %>">Conference
|
||||
Readers/Lurkers Report</A><P>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=QR") %>">Conference
|
||||
Activity Reports</A><P>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=DEL") %>">Delete
|
||||
Conference</A><P>
|
||||
</B></FONT>
|
||||
<% } // end if (displaying admin section) %>
|
||||
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -40,5 +40,3 @@
|
|||
<A HREF="/TODO">Invite Users</A>
|
||||
</DIV>
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
<TABLE BORDER=0 CELLPADDING=0>
|
||||
<TR><TD ALIGN=LEFT COLSPAN=2>
|
||||
<%= rdat.getStdFontTag(null,2) %>New topic name:</FONT><BR>
|
||||
<INPUT TYPE="TEXT" NAME="title" SIZE=37 MAXLENGTH=255 VALUE="<%= data.getTopicName() %>">
|
||||
<INPUT TYPE="TEXT" NAME="title" SIZE=37 MAXLENGTH=128 VALUE="<%= data.getTopicName() %>">
|
||||
</TD></TR>
|
||||
<TR><TD ALIGN=LEFT COLSPAN=2>
|
||||
<%= rdat.getStdFontTag(null,2) %>Your name/header:</FONT><BR>
|
||||
|
@ -77,4 +77,3 @@
|
|||
</TD></TR>
|
||||
</TABLE>
|
||||
</FORM>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
</EM>)
|
||||
<% if (msg.hasAttachment()) { %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("attachment?" + data.getConfLocator() + "&msg="
|
||||
+ msg.getPostID()) %>"><IMG
|
||||
+ msg.getPostID()) %>" TARGET="_blank"><IMG
|
||||
SRC="<%= rdat.getFullImagePath("attachment.gif") %>"
|
||||
ALT="(Attachment <%= msg.getAttachmentFilename() %> - <%= msg.getAttachmentLength() %> bytes)"
|
||||
WIDTH=16 HEIGHT=16 BORDER=0></A>
|
||||
|
@ -341,4 +341,3 @@
|
|||
<% } else if (data.isTopicFrozen()) { %>
|
||||
<DIV ALIGN=CENTER><%= rdat.getStdFontTag(null,2) %><B>This is a <EM>Frozen</EM> Topic</B></DIV>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -84,4 +84,3 @@
|
|||
</TD></TR>
|
||||
</TABLE>
|
||||
</FORM>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
73
web/format/report_conf.jsp
Normal file
73
web/format/report_conf.jsp
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 Communities System.
|
||||
|
||||
The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
--%>
|
||||
<%@ page import = "java.util.*" %>
|
||||
<%@ page import = "com.silverwrist.util.StringUtil" %>
|
||||
<%@ page import = "com.silverwrist.venice.core.*" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.Variables" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.format.*" %>
|
||||
<%
|
||||
ReportConferenceMenu data = ReportConferenceMenu.retrieve(request);
|
||||
Variables.failIfNull(data);
|
||||
RenderData rdat = RenderConfig.createRenderData(application,request,response);
|
||||
String stdfont = rdat.getStdFontTag(null,2);
|
||||
String partial;
|
||||
%>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- Reports for conference #<%= data.getConfID() %> --><% } %>
|
||||
<% rdat.writeContentHeader(out,"Conference Reports:",data.getConfName()); %>
|
||||
|
||||
<%= stdfont %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("confops?" + data.getLocator() + "&cmd=Q") %>">Return to Manage
|
||||
Conference Menu</A>
|
||||
</FONT><P>
|
||||
|
||||
<TABLE ALIGN=CENTER BORDER=0 CELLPADDING=0 CELLSPACING=6>
|
||||
<TR VALIGN=MIDDLE>
|
||||
<TH ALIGN=LEFT><%= stdfont %><B><U>#</U></B></FONT></TH>
|
||||
<TH ALIGN=LEFT><%= stdfont %><B><U>Topic Name</U></B></FONT></TH>
|
||||
<TH ALIGN=LEFT COLSPAN=2><%= stdfont %><B><U>Reports</U></B></FONT></TH>
|
||||
</TR>
|
||||
<TR VALIGN=MIDDLE>
|
||||
<TD ALIGN=LEFT> </TD>
|
||||
<TD ALIGN=LEFT><%= stdfont %>(Entire conference)</FONT></TD>
|
||||
<% partial = "confops?" + data.getLocator() + "&cmd="; %>
|
||||
<TD ALIGN=LEFT><%= stdfont %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath(partial + "RP") %>">Posters</A>
|
||||
</FONT></TD>
|
||||
<TD ALIGN=LEFT><%= stdfont %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath(partial + "RR") %>">Readers/Lurkers</A>
|
||||
</FONT></TD>
|
||||
</TR>
|
||||
|
||||
<% Iterator it = data.getTopics(); %>
|
||||
<% while (it.hasNext()) { %>
|
||||
<%
|
||||
TopicContext topic = (TopicContext)(it.next());
|
||||
partial = "confops?" + data.getLocator() + "&top=" + topic.getTopicNumber() + "&cmd=";
|
||||
%>
|
||||
<TR VALIGN=MIDDLE>
|
||||
<TD ALIGN=LEFT><%= stdfont %><%= topic.getTopicNumber() %></FONT></TD>
|
||||
<TD ALIGN=LEFT><%= stdfont %><%= topic.getName() %></FONT></TD>
|
||||
<TD ALIGN=LEFT><%= stdfont %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath(partial + "RP") %>">Posters</A>
|
||||
</FONT></TD>
|
||||
<TD ALIGN=LEFT><%= stdfont %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath(partial + "RR") %>">Readers/Lurkers</A>
|
||||
</FONT></TD>
|
||||
</TR>
|
||||
<% } // end while %>
|
||||
</TABLE><P>
|
|
@ -148,4 +148,3 @@
|
|||
WIDTH=80 HEIGHT=24 BORDER=0>
|
||||
</FORM><BR>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -69,4 +69,3 @@
|
|||
<B>SIG Administration</B> menu.<P>
|
||||
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -62,4 +62,3 @@
|
|||
<% } else { %>
|
||||
<%= rdat.getStdFontTag(null,2) %><EM>You are not a member of any SIGs.</EM></FONT>
|
||||
<% } // end if %>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -100,4 +100,3 @@
|
|||
|
||||
</FONT></TD>
|
||||
</TR></TABLE>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -33,4 +33,3 @@
|
|||
has elected to provide. Enjoy your membership!<P>
|
||||
<DIV ALIGN=CENTER><A HREF="<%= data.getEntryURL(rdat) %>">Enter SIG</A></DIV>
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -106,6 +106,3 @@
|
|||
</TD></TR>
|
||||
</TABLE>
|
||||
</FORM>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
||||
|
||||
|
|
|
@ -190,4 +190,3 @@
|
|||
<B>]</B>
|
||||
</DIV>
|
||||
</FONT>
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
|
@ -109,5 +109,3 @@
|
|||
</TABLE>
|
||||
</FORM>
|
||||
<% } // end if %>
|
||||
|
||||
<% rdat.writeFooter(out); %>
|
||||
|
|
BIN
web/images/sw-main.gif
Normal file
BIN
web/images/sw-main.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
BIN
web/images/venicelogo.jpg
Normal file
BIN
web/images/venicelogo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
43
web/static/about-venice.html
Normal file
43
web/static/about-venice.html
Normal file
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>About Venice</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="white">
|
||||
<DIV ALIGN="CENTER"><IMG SRC="/venice/images/venicelogo.jpg" ALT="Venice Web Communities System"
|
||||
WIDTH=420 HEIGHT=80 BORDER=0></DIV><BR>
|
||||
<H3>Venice Web Communities System Release 0.01PR</H3>
|
||||
<FONT FACE="Arial, Helvetica" SIZE=2>
|
||||
Copyright © 2001 Silverwrist Design Studios, All Rights Reserved.<P>
|
||||
This software is subject to the
|
||||
<A HREF="http://www.mozilla.org/MPL/MPL-1.1.html" TARGET="_blank">Mozilla Public License Version 1.1</A>.
|
||||
It is distributed on an "AS IS" basis, <B>without warranty of any kind</B>, either express or implied.
|
||||
See the License for the specific language governing rights and limitations under the License.
|
||||
</FONT><P>
|
||||
<H3>The Venice Project Team</H3>
|
||||
<FONT FACE="Arial, Helvetica" SIZE=2><DL>
|
||||
<DT><B>Eric Bowersox</B> <erbo></DT>
|
||||
<DD>Code wrangler, system guru, and administrator in general</DD>
|
||||
<DT><B>Harry Pike</B> <maddog></DT>
|
||||
<DD>EMinds host and domain expert in virtual community hosting</DD>
|
||||
<DT><B>Finnegan</B> <finnegan></DT>
|
||||
<DD>Designer of the Venice web site</DD>
|
||||
<DT><B>Catherine Dodson</B> <cait></DT>
|
||||
<DD>Technical documentation</DD>
|
||||
<DT><B>Pamela Boulais</B> <silverwrist></DT>
|
||||
<DD>Administrative support, liaison, and den mother</DD>
|
||||
<DT><B>The Entire Electric Minds Community</B></DT>
|
||||
<DD>Beta testing, bug hunting, and encouragement</DD>
|
||||
</DL></FONT>
|
||||
|
||||
<DIV ALIGN="CENTER"><FONT FACE="Arial, Helvetica" SIZE=2><EM>
|
||||
Thanks to: Howard, who thought it up; Andre, who rescued it the first time; and the community, who
|
||||
kept it together no matter what.
|
||||
</EM></FONT></DIV><P>
|
||||
|
||||
<DIV ALIGN="CENTER"><A HREF="http://www.silverwrist.com"><IMG SRC="/venice/images/sw-main.gif"
|
||||
ALT="Silverwrist Design Studios" WIDTH=294 HEIGHT=208 BORDER=0</A></DIV>
|
||||
</body>
|
||||
</html>
|
||||
|
BIN
web/static/images/sw-main.gif
Normal file
BIN
web/static/images/sw-main.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
BIN
web/static/images/venicelogo.jpg
Normal file
BIN
web/static/images/venicelogo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
Loading…
Reference in New Issue
Block a user