First round of bugfixes after the opening of the public beta!
- New words in the dictionary - Bugs fixed in HTML Checker tag stack which rejected <IMG> and <LI> and had a potential infinite loop - Multipart handling now handles Windows-uploaded filenames correctly - Bug fixed in PostOperations that was causing nuke to fail and scribble and hide to succeed but throw an internal servlet error - Enhanced conference listing now gives a better activity report in conferences - Top Content font enlarged - Null posts now work (they used to in WebbMe) - Slippage display corrected - Probably a couple of other things I can't think of just now.
This commit is contained in:
parent
257537e869
commit
f19aab70fe
|
@ -1,3 +1,5 @@
|
|||
|
||||
acmecity
|
||||
advogato
|
||||
ain't
|
||||
anime
|
||||
|
@ -8,10 +10,12 @@ boitano
|
|||
boromax
|
||||
can't
|
||||
cartman
|
||||
cdt
|
||||
checkouts
|
||||
couldn't
|
||||
crewmember
|
||||
crewmembers
|
||||
cst
|
||||
deflector
|
||||
deflectors
|
||||
delenn
|
||||
|
@ -20,10 +24,13 @@ dilithium
|
|||
docking
|
||||
doesn't
|
||||
don't
|
||||
edt
|
||||
eminds
|
||||
entil'zha
|
||||
eps
|
||||
erbo
|
||||
est
|
||||
faux
|
||||
fett
|
||||
followup
|
||||
franklin
|
||||
|
@ -47,19 +54,27 @@ lafou
|
|||
ma'am
|
||||
maddog
|
||||
marillion
|
||||
mdt
|
||||
minbar
|
||||
minbari
|
||||
mp
|
||||
mr
|
||||
mst
|
||||
mustn't
|
||||
nacelle
|
||||
nacelles
|
||||
navigational
|
||||
ops
|
||||
padd
|
||||
paperclip
|
||||
pdt
|
||||
peachy
|
||||
pic
|
||||
planitia
|
||||
planum
|
||||
privs
|
||||
psi
|
||||
pst
|
||||
refit
|
||||
refitting
|
||||
replicator
|
||||
|
@ -70,9 +85,12 @@ runabout
|
|||
salchow
|
||||
salchows
|
||||
sarcastically
|
||||
shouldn't
|
||||
silverwrist
|
||||
snarf
|
||||
snarfage
|
||||
snarfer
|
||||
snarfing
|
||||
snazzy
|
||||
sourceforge
|
||||
spaceport
|
||||
|
@ -92,6 +110,7 @@ turbolift
|
|||
tuzanor
|
||||
umbilical
|
||||
umbilicals
|
||||
unread
|
||||
url
|
||||
utne
|
||||
valen
|
||||
|
|
|
@ -9,7 +9,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
|
||||
|
@ -34,4 +34,16 @@
|
|||
<appender-ref ref="STDLOG"/>
|
||||
</root>
|
||||
|
||||
<!-- Turn down the standard detail in some areas -->
|
||||
<category name="com.silverwrist.util.ServletMultipartHandler">
|
||||
<priority value="fatal"/>
|
||||
</category>
|
||||
<category name="com.silverwrist.venice.htmlcheck">
|
||||
<priority value="fatal"/>
|
||||
</category>
|
||||
|
||||
</configuration>
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -172,12 +172,49 @@ public class ServletMultipartHandler
|
|||
|
||||
// Parse the Content-Disposition header.
|
||||
String[] cdstr = part.getHeader("Content-Disposition");
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Content-Disposition is " + cdstr[0]);
|
||||
ContentDisposition cdisp = new ContentDisposition(cdstr[0]);
|
||||
name = cdisp.getParameter("name");
|
||||
filename = cdisp.getParameter("filename");
|
||||
|
||||
if (filename!=null)
|
||||
{ // Strip off everything but the base filename, if the browser happened to pass that.
|
||||
{ // EJB 4/4/2001 - Windows boxes pass the filename complete with the backslashed pathname on the
|
||||
// front, and, for some reason, ContentDisposition strips out the backslashes while leaving the
|
||||
// pathname components in place (including the drive letter!). So we have to go to manual here
|
||||
// to extract the filename ourselves.
|
||||
int pos = cdstr[0].indexOf("filename");
|
||||
pos += 8;
|
||||
while ((cdstr[0].charAt(pos)==' ') || (cdstr[0].charAt(pos)=='\t'))
|
||||
pos++;
|
||||
if (cdstr[0].charAt(pos)!='=')
|
||||
throw new RuntimeException("must have = sign after filename");
|
||||
pos++;
|
||||
while ((cdstr[0].charAt(pos)==' ') || (cdstr[0].charAt(pos)=='\t'))
|
||||
pos++;
|
||||
if ((cdstr[0].charAt(pos)=='\'') || (cdstr[0].charAt(pos)=='"'))
|
||||
{ // filename enclosed in quotes...
|
||||
char match = cdstr[0].charAt(pos++);
|
||||
filename = cdstr[0].substring(pos);
|
||||
pos = filename.lastIndexOf(match);
|
||||
if (pos<0)
|
||||
throw new RuntimeException("must have closing quote");
|
||||
filename = filename.substring(0,pos);
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // no quotes, just take the rest of the line
|
||||
filename = cdstr[0].substring(pos);
|
||||
pos = filename.lastIndexOf(';');
|
||||
if (pos>=0)
|
||||
filename = filename.substring(0,pos);
|
||||
|
||||
} // end else
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Raw filename: " + filename);
|
||||
|
||||
// Strip off everything but the base filename, if the browser happened to pass that.
|
||||
int sep = filename.lastIndexOf('\\');
|
||||
if (sep>=0)
|
||||
filename = filename.substring(sep+1);
|
||||
|
|
|
@ -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
|
||||
|
@ -54,7 +54,6 @@ public class HTMLCheckerConfigImpl implements HTMLCheckerConfig
|
|||
|
||||
HTMLCheckerConfigImpl()
|
||||
{
|
||||
TagRepository.init();
|
||||
TagRepository.configureNormalSet(allowed_tagsets);
|
||||
|
||||
} // end constructor
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
package com.silverwrist.venice.htmlcheck.impl;
|
||||
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.htmlcheck.*;
|
||||
|
||||
class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServices
|
||||
|
@ -86,6 +87,13 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
|
||||
private static final int MARGIN_SLOP = 5;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Category logger = Category.getInstance(HTMLCheckerImpl.class);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -103,13 +111,13 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
private boolean trigger_WBR = false; // word break trigger
|
||||
private StringBuffer output_buffer = null; // output buffer for characters
|
||||
private StringBuffer temp_buffer = null; // temporary buffer used within one state
|
||||
private Vector tag_stack = null; // stack of tags that have been opened
|
||||
private Hashtable counters = new Hashtable(); // the CountingRewriter instances
|
||||
private Vector string_rewriters = new Vector(); // string rewriter instances
|
||||
private Vector word_rewriters = new Vector(); // word rewriter instances
|
||||
private Vector tag_rewriters = new Vector(); // tag rewriter instances
|
||||
private Vector paren_rewriters = new Vector(); // paren rewriter instances
|
||||
private Hashtable context_data = new Hashtable(); // context variables
|
||||
private ArrayList tag_stack = null; // stack of tags that have been opened
|
||||
private HashMap counters = new HashMap(); // the CountingRewriter instances
|
||||
private ArrayList string_rewriters = new ArrayList(); // string rewriter instances
|
||||
private ArrayList word_rewriters = new ArrayList(); // word rewriter instances
|
||||
private ArrayList tag_rewriters = new ArrayList(); // tag rewriter instances
|
||||
private ArrayList paren_rewriters = new ArrayList(); // paren rewriter instances
|
||||
private HashMap context_data = new HashMap(); // context variables
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -118,7 +126,6 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
|
||||
HTMLCheckerImpl(HTMLCheckerConfigImpl config)
|
||||
{
|
||||
TagRepository.init();
|
||||
this.config = config;
|
||||
copyRewriters(string_rewriters,config.getStringRewriters());
|
||||
copyRewriters(word_rewriters,config.getWordRewriters());
|
||||
|
@ -160,7 +167,7 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
|
||||
} // end getRunLength
|
||||
|
||||
private void copyRewriters(Vector dest, List source)
|
||||
private void copyRewriters(ArrayList dest, List source)
|
||||
{
|
||||
Iterator it = source.iterator();
|
||||
while (it.hasNext())
|
||||
|
@ -202,7 +209,7 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
{
|
||||
output_buffer = new StringBuffer(1024);
|
||||
temp_buffer = new StringBuffer(64);
|
||||
tag_stack = new Vector();
|
||||
tag_stack = new ArrayList();
|
||||
|
||||
} // end initState
|
||||
|
||||
|
@ -210,7 +217,7 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
{
|
||||
temp_buffer = null;
|
||||
if (tag_stack!=null)
|
||||
tag_stack.removeAllElements();
|
||||
tag_stack.clear();
|
||||
tag_stack = null;
|
||||
|
||||
} // end killState
|
||||
|
@ -520,6 +527,8 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
|
||||
private boolean handleAsHTML()
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("handleAsHTML(): candidate buffer = [" + temp_buffer.toString() + "]");
|
||||
trigger_WBR = false; // initialize
|
||||
|
||||
// Figure out the place in the buffer where the command word starts.
|
||||
|
@ -527,6 +536,8 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
boolean closing_tag = false;
|
||||
if ((start_cmd<temp_buffer.length()) && (temp_buffer.charAt(start_cmd)=='/'))
|
||||
{ // this is a closing tag - move the command start pointer...
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("closing tag detected");
|
||||
start_cmd++;
|
||||
closing_tag = true;
|
||||
|
||||
|
@ -538,34 +549,58 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
end_cmd++;
|
||||
|
||||
if ((end_cmd==start_cmd) || ((end_cmd-start_cmd)>TagRepository.getMaxTagLength()))
|
||||
return false; // the command word is empty or is just too long to be an HTML tag
|
||||
{ // the command word is empty or is just too long to be an HTML tag
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("HTML tag rejected due to length (" + String.valueOf(end_cmd-start_cmd) + ")");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
// Look up the tag name to get a tag index from the repository.
|
||||
int tag_index = TagRepository.tagNameToIndex(temp_buffer.substring(start_cmd,end_cmd));
|
||||
String poss_tag_name = temp_buffer.substring(start_cmd,end_cmd);
|
||||
int tag_index = TagRepository.tagNameToIndex(poss_tag_name);
|
||||
if (tag_index<0)
|
||||
return false; // not a known HTML tag
|
||||
{ // not a known HTML tag
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("<" + poss_tag_name + "> is not valid HTML");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
// Look up the tag object that corresponds to the tag index.
|
||||
SimpleTag tagobj = TagRepository.tagIndexToObject(tag_index);
|
||||
if (closing_tag && !(tagobj.allowClose()))
|
||||
return false; // this is a closing tag, and this tag doesn't permit the "close" form
|
||||
{ // this is a closing tag, and this tag doesn't permit the "close" form
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("</" + poss_tag_name + "> is not a permitted tag form (no close)");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
// Get the HTML tag set index for this tag, and see if we allow that set.
|
||||
int tag_set_id = TagRepository.tagIndexToSet(tag_index);
|
||||
if (!(config.isTagSetAllowed(tag_set_id)) && !(config.getDiscardHTMLTags()))
|
||||
return false; // we're not allowing it, we're not discarding it, so punt!
|
||||
{ // we're not allowing it, we're not discarding it, so punt!
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("<" + poss_tag_name + "> is not allowed in this context");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
boolean valid = false;
|
||||
if (!(config.getDiscardHTMLTags()) && tagobj.balanceTags())
|
||||
{ // this tag needs to be balanced - here is where we manipulate the stack
|
||||
boolean valid = false;
|
||||
|
||||
if (closing_tag)
|
||||
{ // hunt through the list to find the most recently-opened tag of this type
|
||||
int i = tag_stack.size() - 1;
|
||||
while (i>=0)
|
||||
int i = tag_stack.size();
|
||||
while ((--i)>=0)
|
||||
{ // look through the stack...
|
||||
Integer foo = (Integer)(tag_stack.get(i));
|
||||
if (foo.intValue()==tag_index)
|
||||
{ // found it - remove it from the tag stack
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("balanced closure of <" + poss_tag_name + ">");
|
||||
tag_stack.remove(i);
|
||||
valid = true;
|
||||
break;
|
||||
|
@ -577,21 +612,36 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
} // end if
|
||||
else
|
||||
{ // push a new opening tag!
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("open form of <" + poss_tag_name + ">");
|
||||
tag_stack.add(new Integer(tag_index));
|
||||
valid = true;
|
||||
|
||||
} // end else
|
||||
|
||||
if (!valid)
|
||||
{ // not validated by the stack code
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("stack checking code rejects <" + poss_tag_name + ">");
|
||||
return false;
|
||||
|
||||
} // end if
|
||||
|
||||
} // end if
|
||||
// else tag doesn't need to be auto-balanced, or is being discarded
|
||||
|
||||
if (!valid && !(config.getDiscardHTMLTags()))
|
||||
return false; // not validated by the stack code, and not being discarded
|
||||
|
||||
// Give the tag object one last chance to dictate what we do with the tag.
|
||||
String real_tag_data = tagobj.rewriteTagContents(temp_buffer.toString(),closing_tag,this);
|
||||
if ((real_tag_data==null) || config.getDiscardHTMLTags())
|
||||
return true; // tag is being erased by rewriter, or is being discarded anyway
|
||||
{ // tag is being erased by rewriter, or is being discarded anyway
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("rewriter erasure or discard of <" + poss_tag_name + ">");
|
||||
return true;
|
||||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("real tag data = [" + real_tag_data + "]");
|
||||
|
||||
// Emit the tag to the output.
|
||||
emitChar('<',config.getRawOutputFilters(),false);
|
||||
|
@ -601,12 +651,22 @@ class HTMLCheckerImpl implements HTMLChecker, HTMLCheckerBackend, RewriterServic
|
|||
// Determine whether this tag causes a "logical line break."
|
||||
boolean logical_line_break = false;
|
||||
if (trigger_WBR && !closing_tag && (nobreak_count>0))
|
||||
{ // a word break is a logical line break (but only if within <NOBR>...</NOBR>)
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("<" + poss_tag_name + "> WORD BREAKS");
|
||||
logical_line_break = true;
|
||||
|
||||
} // end if
|
||||
else
|
||||
logical_line_break = tagobj.causeLineBreak(closing_tag);
|
||||
if (logical_line_break)
|
||||
{ // logical line break is triggered
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("<" + poss_tag_name + "> triggers logical line break");
|
||||
columns = 0;
|
||||
|
||||
} // end if
|
||||
|
||||
return true; // handled!
|
||||
|
||||
} // end handleAsHTML()
|
||||
|
|
|
@ -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
|
||||
|
@ -100,4 +100,25 @@ class SimpleTag
|
|||
|
||||
} // end rewriteTagContents
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class Object
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (!(obj instanceof SimpleTag))
|
||||
return false;
|
||||
SimpleTag other = (SimpleTag)obj;
|
||||
return tagname.equals(other.tagname);
|
||||
|
||||
} // end equals
|
||||
|
||||
public int hashCode()
|
||||
{
|
||||
return tagname.hashCode();
|
||||
|
||||
} // end hashCode
|
||||
|
||||
} // end class SimpleTag
|
||||
|
||||
|
|
|
@ -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,15 +23,23 @@ import com.silverwrist.venice.htmlcheck.HTMLTagSets;
|
|||
class TagRepository implements HTMLTagSets
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Hashtable tagname_to_index = new Hashtable(50,0.9F);
|
||||
private static Vector index_to_object = new Vector();
|
||||
private static Vector index_to_setid = new Vector();
|
||||
private static HashMap tagname_to_index = new HashMap(50,0.9F);
|
||||
private static ArrayList index_to_object = new ArrayList();
|
||||
private static ArrayList index_to_setid = new ArrayList();
|
||||
private static int maxlength = 0;
|
||||
private static boolean initialized = false;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private TagRepository()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
|
@ -44,7 +52,7 @@ class TagRepository implements HTMLTagSets
|
|||
index_to_object.add(tag);
|
||||
index_to_setid.add(new Integer(set));
|
||||
tag.setIndex(ndx);
|
||||
tagname_to_index.put(new String(tag.getTagName()),new Integer(ndx));
|
||||
tagname_to_index.put(tag.getTagName(),new Integer(ndx));
|
||||
int newlen = tag.getTagName().length();
|
||||
if (newlen>maxlength)
|
||||
maxlength = newlen;
|
||||
|
@ -56,12 +64,67 @@ class TagRepository implements HTMLTagSets
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public static void init()
|
||||
public static int getMaxTagLength()
|
||||
{
|
||||
if (!initialized)
|
||||
{ // set the flag so we don't do this again
|
||||
initialized = true;
|
||||
return maxlength;
|
||||
|
||||
} // end getMaxTagLength
|
||||
|
||||
public static int tagNameToIndex(String tag)
|
||||
{ // look up tag name and get index
|
||||
Object obj = tagname_to_index.get(tag.toUpperCase());
|
||||
if (obj==null)
|
||||
return -1;
|
||||
else
|
||||
return ((Integer)obj).intValue();
|
||||
|
||||
} // end tagNameToIndex
|
||||
|
||||
public static SimpleTag tagIndexToObject(int ndx)
|
||||
{
|
||||
Object obj = index_to_object.get(ndx);
|
||||
if (obj==null)
|
||||
return null;
|
||||
else
|
||||
return (SimpleTag)obj;
|
||||
|
||||
} // end tagIndexToObject
|
||||
|
||||
public static int tagIndexToSet(int ndx)
|
||||
{
|
||||
Object obj = index_to_setid.get(ndx);
|
||||
if (obj==null)
|
||||
return -1;
|
||||
else
|
||||
return ((Integer)obj).intValue();
|
||||
|
||||
} // end tagIndexToSet
|
||||
|
||||
public static void configureNormalSet(BitSet bs)
|
||||
{
|
||||
bs.xor(bs); // clears all bits presently set in the bitset
|
||||
bs.set(INLINE_FORMAT);
|
||||
bs.set(ANCHOR);
|
||||
bs.set(BLOCK_FORMAT);
|
||||
bs.set(FONT_FORMAT);
|
||||
bs.set(IMAGES);
|
||||
|
||||
} // end configureNormalSet
|
||||
|
||||
public static void configureRestrictedSet(BitSet bs)
|
||||
{
|
||||
bs.xor(bs); // clears all bits presently set in the bitset
|
||||
bs.set(INLINE_FORMAT);
|
||||
|
||||
} // end configureRestrictedSet
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static initializer
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static
|
||||
{
|
||||
// begin enshrining the tags!
|
||||
enshrineTag(new SimpleTag("!DOCTYPE",false),DOC_FORMAT);
|
||||
enshrineTag(new SimpleTag("%",false),SERVER_PAGE);
|
||||
|
@ -182,62 +245,6 @@ class TagRepository implements HTMLTagSets
|
|||
enshrineTag(new BalancedTag("XML",false),MSFT_ACTIVE_CONTENT);
|
||||
enshrineTag(new BalancedTag("XMP",false),NSCP_INLINE_FORMAT);
|
||||
|
||||
} // end if
|
||||
|
||||
} // end init
|
||||
|
||||
public static int getMaxTagLength()
|
||||
{
|
||||
return maxlength;
|
||||
|
||||
} // end getMaxTagLength
|
||||
|
||||
public static int tagNameToIndex(String tag)
|
||||
{ // look up tag name and get index
|
||||
Object obj = tagname_to_index.get(tag.toUpperCase());
|
||||
if (obj==null)
|
||||
return -1;
|
||||
else
|
||||
return ((Integer)obj).intValue();
|
||||
|
||||
} // end tagNameToIndex
|
||||
|
||||
public static SimpleTag tagIndexToObject(int ndx)
|
||||
{
|
||||
Object obj = index_to_object.get(ndx);
|
||||
if (obj==null)
|
||||
return null;
|
||||
else
|
||||
return (SimpleTag)obj;
|
||||
|
||||
} // end tagIndexToObject
|
||||
|
||||
public static int tagIndexToSet(int ndx)
|
||||
{
|
||||
Object obj = index_to_setid.get(ndx);
|
||||
if (obj==null)
|
||||
return -1;
|
||||
else
|
||||
return ((Integer)obj).intValue();
|
||||
|
||||
} // end tagIndexToSet
|
||||
|
||||
public static void configureNormalSet(BitSet bs)
|
||||
{
|
||||
bs.xor(bs); // clears all bits presently set in the bitset
|
||||
bs.set(INLINE_FORMAT);
|
||||
bs.set(ANCHOR);
|
||||
bs.set(BLOCK_FORMAT);
|
||||
bs.set(FONT_FORMAT);
|
||||
bs.set(IMAGES);
|
||||
|
||||
} // end configureNormalSet
|
||||
|
||||
public static void configureRestrictedSet(BitSet bs)
|
||||
{
|
||||
bs.xor(bs); // clears all bits presently set in the bitset
|
||||
bs.set(INLINE_FORMAT);
|
||||
|
||||
} // end configureRestrictedSet
|
||||
} // end static initializer
|
||||
|
||||
} // end class TagRepository
|
||||
|
|
|
@ -77,6 +77,8 @@ public class Attachment extends VeniceServlet
|
|||
type = msg.getAttachmentType();
|
||||
filename = msg.getAttachmentFilename();
|
||||
length = msg.getAttachmentLength();
|
||||
if (logger.isInfoEnabled())
|
||||
logger.info("Uploaded file: " + filename + "(type " + type + ", " + length + " bytes)");
|
||||
data = msg.getAttachmentData();
|
||||
|
||||
} // end try
|
||||
|
|
|
@ -94,16 +94,21 @@ public class PostMessage extends VeniceServlet
|
|||
String on_error = "confdisp?sig=" + sig.getSIGID() + "&conf=" + conf.getConfID() + "&top="
|
||||
+ topic.getTopicNumber();
|
||||
|
||||
// make sure we've got some post data
|
||||
String raw_postdata = request.getParameter("pb");
|
||||
if (StringUtil.isStringEmpty(raw_postdata))
|
||||
return null; // don't allow zero-size posts
|
||||
|
||||
final String yes = "Y";
|
||||
|
||||
if (isImageButtonClicked(request,"cancel"))
|
||||
throw new RedirectResult(on_error); // canceled posting - take us back
|
||||
|
||||
// make sure we've got some post data
|
||||
String raw_postdata = request.getParameter("pb");
|
||||
/* EJB 4/4/2001 - take this code out, FUTURE: maybe make it a global setting?
|
||||
if (StringUtil.isStringEmpty(raw_postdata))
|
||||
return null; // don't allow zero-size posts
|
||||
-- end removed code */
|
||||
|
||||
if (raw_postdata==null)
|
||||
raw_postdata = "";
|
||||
|
||||
final String yes = "Y";
|
||||
|
||||
if (isImageButtonClicked(request,"preview")) // generate a preview
|
||||
return new PostPreview(engine,sig,conf,topic,request.getParameter("pseud"),raw_postdata,
|
||||
request.getParameter("next"),getPostNumber(request,on_error),
|
||||
|
|
|
@ -74,7 +74,7 @@ public class PostOperations extends VeniceServlet
|
|||
|
||||
// get the topic
|
||||
TopicContext topic = getTopicParameter(request,conf,true,location);
|
||||
locator += "&top=" + topic.getTopicID();
|
||||
locator += "&top=" + topic.getTopicNumber();
|
||||
location = "confdisp?" + locator;
|
||||
|
||||
// get the message
|
||||
|
|
|
@ -141,6 +141,12 @@ public class ConferenceListing implements JSPRender
|
|||
|
||||
} // end getLastUpdateDate
|
||||
|
||||
public boolean anyUnread(int ndx)
|
||||
{
|
||||
return ((ConferenceContext)(conferences.get(ndx))).anyUnread();
|
||||
|
||||
} // end anyUnread
|
||||
|
||||
public int getNumHosts(int ndx)
|
||||
{
|
||||
return hosts[ndx].size();
|
||||
|
|
|
@ -52,6 +52,8 @@ public class RenderData
|
|||
private boolean can_gzip = false;
|
||||
private Locale my_locale;
|
||||
private TimeZone my_timezone;
|
||||
private DateFormat activity_time = null;
|
||||
private DateFormat display_date = null;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -250,9 +252,14 @@ public class RenderData
|
|||
|
||||
public String formatDateForDisplay(Date date)
|
||||
{
|
||||
DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,my_locale);
|
||||
fmt.setTimeZone(my_timezone);
|
||||
return fmt.format(date);
|
||||
if (display_date==null)
|
||||
{ // create the display date formatter
|
||||
display_date = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,my_locale);
|
||||
display_date.setTimeZone(my_timezone);
|
||||
|
||||
} // end if
|
||||
|
||||
return display_date.format(date);
|
||||
|
||||
} // end formatDateForDisplay
|
||||
|
||||
|
@ -338,10 +345,22 @@ public class RenderData
|
|||
switch (delta_days)
|
||||
{ // now return a string based on the difference in days
|
||||
case 0:
|
||||
return "Today";
|
||||
if (activity_time==null)
|
||||
{ // get the "activity" time formatter
|
||||
activity_time = DateFormat.getTimeInstance(DateFormat.MEDIUM,my_locale);
|
||||
activity_time.setTimeZone(my_timezone);
|
||||
|
||||
} // end if
|
||||
return "Today, " + activity_time.format(date);
|
||||
|
||||
case 1:
|
||||
return "Yesterday";
|
||||
if (activity_time==null)
|
||||
{ // get the "activity" time formatter
|
||||
activity_time = DateFormat.getTimeInstance(DateFormat.MEDIUM,my_locale);
|
||||
activity_time.setTimeZone(my_timezone);
|
||||
|
||||
} // end if
|
||||
return "Yesterday, " + activity_time.format(date);
|
||||
|
||||
default:
|
||||
return String.valueOf(delta_days) + " days ago";
|
||||
|
|
|
@ -37,7 +37,11 @@
|
|||
<TD ALIGN=LEFT><%= rdat.getStdFontTag(null,2) %>
|
||||
<% String path = "confdisp?sig=" + data.getSIGID() + "&conf=" + data.getConferenceID(i); %>
|
||||
<A HREF="<%= rdat.getEncodedServletPath(path) %>"><%= StringUtil.encodeHTML(data.getConferenceName(i)) %></A> -
|
||||
Latest activity: <%= rdat.getActivityString(data.getLastUpdateDate(i)) %><BR>
|
||||
Latest activity: <%= rdat.getActivityString(data.getLastUpdateDate(i)) %>
|
||||
<% if (data.anyUnread(i)) { %>
|
||||
<IMG SRC="<%= rdat.getFullImagePath("tag_new.gif") %>" ALT=\"New!\" BORDER=0 WIDTH=40 HEIGHT=20>
|
||||
<% } // end if %>
|
||||
<BR>
|
||||
<% int count = data.getNumHosts(i); %>
|
||||
<% if (count>0) { %>
|
||||
<% if (count>1) { %>Hosts<% } else { %>Host<% } %>:
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<%= rdat.getStdFontTag(null,2) %>
|
||||
The following posts slipped in while you were typing. You may choose to edit your message and
|
||||
re-post, just post it as is, or cancel your posting altogether.
|
||||
</FONT>
|
||||
</FONT><P>
|
||||
|
||||
<% if (rdat.useHTMLComments()) { %><!-- Begin Slipped Messages --><% } %>
|
||||
<% Iterator it = data.getMessageIterator(); %>
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
<% if (rdat.useHTMLComments()) { %><!-- Top content panel --><% } %>
|
||||
<% if (data.displayWelcome()) { %>
|
||||
<% rdat.writeContentHeader(out,rdat.getStockMessage("welcome-top"),null); %>
|
||||
<%= rdat.getStdFontTag(null,1) %><%= rdat.getStockMessage("welcome") %></FONT><P>
|
||||
<%= rdat.getStdFontTag(null,2) %><%= rdat.getStockMessage("welcome") %></FONT><P>
|
||||
<% } // end if %>
|
||||
<% rdat.writeContentHeader(out,rdat.getStockMessage("currents-top"),null); %>
|
||||
<% int ntp = data.getNumTopPosts(); %>
|
||||
|
@ -39,7 +39,7 @@
|
|||
TopicMessageContext msg = data.getTopPost(i);
|
||||
String poster = data.getPosterName(msg);
|
||||
%>
|
||||
<%= rdat.getStdFontTag(null,1) %>
|
||||
<%= rdat.getStdFontTag(null,2) %>
|
||||
<B><%= msg.getPseud() %></B>
|
||||
(<EM>
|
||||
<A HREF="<%= rdat.getEncodedServletPath("user/" + poster) %>" TARGET="_blank"><%= poster %></A>,
|
||||
|
@ -50,5 +50,5 @@
|
|||
</FONT>
|
||||
<% } // end for %>
|
||||
<% } else { %>
|
||||
<%= rdat.getStdFontTag(null,1) %><EM>No front page postings found.</EM></FONT>
|
||||
<%= rdat.getStdFontTag(null,2) %><EM>No front page postings found.</EM></FONT>
|
||||
<% } // end if %>
|
Loading…
Reference in New Issue
Block a user