first draft of message importing and exporting to/from conferences (new host

tools)
This commit is contained in:
Eric J. Bowersox 2004-06-09 04:10:52 +00:00
parent f6d3d9494d
commit e6e94f3427
25 changed files with 2422 additions and 29 deletions

View File

@ -35,6 +35,11 @@ collections.base=/usr/local/java/commons-collections-2.1
# collections.lib=${collections.base} # collections.lib=${collections.base}
# collections.jarfile=commons-collections.jar # collections.jarfile=commons-collections.jar
# [Location of Commons Codec Library 1.2]
codec.base=/usr/local/java/commons-codec-1.2
# codec.lib=${codec.base}
# codec.jarfile=commons-codec-1.2.jar
# [Location of Jakarta Regexp Library 1.3] # [Location of Jakarta Regexp Library 1.3]
regexp.base=/usr/local/java/jakarta-regexp-1.3 regexp.base=/usr/local/java/jakarta-regexp-1.3
# regexp.lib=${regexp.base} # regexp.lib=${regexp.base}

View File

@ -48,6 +48,11 @@
<property name="collections.lib" value="${collections.base}"/> <property name="collections.lib" value="${collections.base}"/>
<property name="collections.jarfile" value="commons-collections.jar"/> <property name="collections.jarfile" value="commons-collections.jar"/>
<!-- [Location of Commons Codec Library 1.2] -->
<property name="codec.base" value="../commons-codec"/>
<property name="codec.lib" value="${codec.base}"/>
<property name="codec.jarfile" value="commons-codec-1.2.jar"/>
<!-- [Location of Jakarta Regexp Library 1.3] --> <!-- [Location of Jakarta Regexp Library 1.3] -->
<property name="regexp.base" value="../jakarta-regexp"/> <property name="regexp.base" value="../jakarta-regexp"/>
<property name="regexp.lib" value="${regexp.base}"/> <property name="regexp.lib" value="${regexp.base}"/>
@ -81,6 +86,7 @@
<path id="base.build.path"> <path id="base.build.path">
<fileset dir="${servlet.lib}" includes="${servlet.jarfile}"/> <fileset dir="${servlet.lib}" includes="${servlet.jarfile}"/>
<fileset dir="${collections.lib}" includes="${collections.jarfile}"/> <fileset dir="${collections.lib}" includes="${collections.jarfile}"/>
<fileset dir="${codec.lib}" includes="${codec.jarfile}"/>
<fileset dir="${regexp.lib}" includes="${regexp.jarfile}"/> <fileset dir="${regexp.lib}" includes="${regexp.jarfile}"/>
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/> <fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
<fileset dir="${bsf.lib}" includes="${bsf.jarfile}"/> <fileset dir="${bsf.lib}" includes="${bsf.jarfile}"/>
@ -165,6 +171,7 @@
<mkdir dir="${deploy.home}/WEB-INF/lib"/> <mkdir dir="${deploy.home}/WEB-INF/lib"/>
<copy todir="${deploy.home}/WEB-INF/lib"> <copy todir="${deploy.home}/WEB-INF/lib">
<fileset dir="${collections.lib}" includes="${collections.jarfile}"/> <fileset dir="${collections.lib}" includes="${collections.jarfile}"/>
<fileset dir="${codec.lib}" includes="${codec.jarfile}"/>
<fileset dir="${regexp.lib}" includes="${regexp.jarfile}"/> <fileset dir="${regexp.lib}" includes="${regexp.jarfile}"/>
<fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/> <fileset dir="${log4j.lib}" includes="${log4j.jarfile}"/>
<fileset dir="${bsf.lib}" includes="${bsf.jarfile}"/> <fileset dir="${bsf.lib}" includes="${bsf.jarfile}"/>

View File

@ -175,12 +175,14 @@
<button id="create" caption="Create" fixup="true">classic/create.jpg</button> <button id="create" caption="Create" fixup="true">classic/create.jpg</button>
<button id="createnew" caption="Create New" fixup="true">classic/create_new.jpg</button> <button id="createnew" caption="Create New" fixup="true">classic/create_new.jpg</button>
<button id="delete_topic" caption="Delete Topic" fixup="true">classic/delete_topic.jpg</button> <button id="delete_topic" caption="Delete Topic" fixup="true">classic/delete_topic.jpg</button>
<button id="export" caption="Export" fixup="true">classic/export.jpg</button>
<button id="filter_user" caption="Filter User" fixup="true">classic/filter_user.jpg</button> <button id="filter_user" caption="Filter User" fixup="true">classic/filter_user.jpg</button>
<button id="find" caption="Find" fixup="true">classic/find.jpg</button> <button id="find" caption="Find" fixup="true">classic/find.jpg</button>
<button id="freeze_topic" caption="Freeze Topic" fixup="true">classic/freeze_topic.jpg</button> <button id="freeze_topic" caption="Freeze Topic" fixup="true">classic/freeze_topic.jpg</button>
<button id="go" caption="Go" fixup="true">classic/go.jpg</button> <button id="go" caption="Go" fixup="true">classic/go.jpg</button>
<button id="hide" caption="Hide" fixup="true">classic/hide.jpg</button> <button id="hide" caption="Hide" fixup="true">classic/hide.jpg</button>
<button id="hide_topic" caption="Hide Topic" fixup="true">classic/hide_topic.jpg</button> <button id="hide_topic" caption="Hide Topic" fixup="true">classic/hide_topic.jpg</button>
<button id="import" caption="Import" fixup="true">classic/import.jpg</button>
<button id="invite" caption="Invite" fixup="true">classic/invite.jpg</button> <button id="invite" caption="Invite" fixup="true">classic/invite.jpg</button>
<button id="join_now" caption="Join Now" fixup="true">classic/join_now.jpg</button> <button id="join_now" caption="Join Now" fixup="true">classic/join_now.jpg</button>
<button id="login" caption="Log In" fixup="true">classic/login.jpg</button> <button id="login" caption="Log In" fixup="true">classic/login.jpg</button>
@ -233,12 +235,14 @@
<button id="create" caption="Create" fixup="true">gelcap/create.jpg</button> <button id="create" caption="Create" fixup="true">gelcap/create.jpg</button>
<button id="createnew" caption="Create New" fixup="true">gelcap/create_new.jpg</button> <button id="createnew" caption="Create New" fixup="true">gelcap/create_new.jpg</button>
<button id="delete_topic" caption="Delete Topic" fixup="true">gelcap/delete_topic.jpg</button> <button id="delete_topic" caption="Delete Topic" fixup="true">gelcap/delete_topic.jpg</button>
<button id="export" caption="Export" fixup="true">gelcap/export.jpg</button>
<button id="filter_user" caption="Filter User" fixup="true">gelcap/filter_user.jpg</button> <button id="filter_user" caption="Filter User" fixup="true">gelcap/filter_user.jpg</button>
<button id="find" caption="Find" fixup="true">gelcap/find.jpg</button> <button id="find" caption="Find" fixup="true">gelcap/find.jpg</button>
<button id="freeze_topic" caption="Freeze Topic" fixup="true">gelcap/freeze_topic.jpg</button> <button id="freeze_topic" caption="Freeze Topic" fixup="true">gelcap/freeze_topic.jpg</button>
<button id="go" caption="Go" fixup="true">gelcap/go.jpg</button> <button id="go" caption="Go" fixup="true">gelcap/go.jpg</button>
<button id="hide" caption="Hide" fixup="true">gelcap/hide.jpg</button> <button id="hide" caption="Hide" fixup="true">gelcap/hide.jpg</button>
<button id="hide_topic" caption="Hide Topic" fixup="true">gelcap/hide_topic.jpg</button> <button id="hide_topic" caption="Hide Topic" fixup="true">gelcap/hide_topic.jpg</button>
<button id="import" caption="Import" fixup="true">gelcap/import.jpg</button>
<button id="invite" caption="Invite" fixup="true">gelcap/invite.jpg</button> <button id="invite" caption="Invite" fixup="true">gelcap/invite.jpg</button>
<button id="join_now" caption="Join Now" fixup="true">gelcap/join_now.jpg</button> <button id="join_now" caption="Join Now" fixup="true">gelcap/join_now.jpg</button>
<button id="login" caption="Log In" fixup="true">gelcap/login.jpg</button> <button id="login" caption="Log In" fixup="true">gelcap/login.jpg</button>
@ -437,6 +441,8 @@ Text of this agreement is TBD.
<link href="conf/conf_reports.js.vs?cc=${cid}&amp;conf=${confid}" <link href="conf/conf_reports.js.vs?cc=${cid}&amp;conf=${confid}"
type="servlet">Conference Activity Reports</link> type="servlet">Conference Activity Reports</link>
<link href="conf/email.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Conference E-Mail</link> <link href="conf/email.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Conference E-Mail</link>
<link href="conf/export.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Export Messages</link>
<link href="conf/import.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Import Messages</link>
<link href="conf/delete.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Delete Conference</link> <link href="conf/delete.js.vs?cc=${cid}&amp;conf=${confid}" type="servlet">Delete Conference</link>
</menudef> </menudef>

103
scripts/conf/export.js Normal file
View File

@ -0,0 +1,103 @@
// The contents of this file are subject to the Mozilla Public License Version 1.1
// (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
//
// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
// WARRANTY OF ANY KIND, either express or implied. See the License for the specific
// language governing rights and limitations under the License.
//
// The Original Code is the Venice Web Communities System.
//
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
// Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
//
// Contributor(s):
importPackage(java.lang);
importPackage(java.util);
importPackage(Packages.com.silverwrist.venice.core);
importPackage(Packages.com.silverwrist.venice.except);
importPackage(Packages.com.silverwrist.venice.ui);
importPackage(Packages.com.silverwrist.venice.ui.conf);
importPackage(Packages.com.silverwrist.venice.ui.helpers);
importPackage(Packages.com.silverwrist.venice.ui.view);
// get the request object and the community
rinput = bsf.lookupBean("request");
comm = rinput.getCommunity(true,"top.js.vs");
// get the current conference
currc = new CurrentConference(rinput);
conf = currc.getConference(true,"conf/conferences.js.vs?cc=" + comm.communityID);
on_error = "conf/manage_conf.js.vs?cc=" + comm.communityID + "&conf=" + conf.confID;
if (!(conf.canChangeConference()))
{ // you can't fiddle with this conference
vlib.output(new ErrorBox("Access Error","You do not have permission to export posts from this conference.",
on_error));
vlib.done();
} // end if
rc = null; // return from this script
try
{ // figure out what to do here
if ("GET"==rinput.verb)
{ // load and display the JSP page for the form
l = conf.getTopicList(ConferenceContext.GET_ALL,ConferenceContext.SORT_NUMBER);
rinput.setRequestAttribute("topic.list",l);
rc = new JSPView("Export Messages: " + conf.name,"conf/export.jsp");
rc.menuSelector = Content.MENU_SELECTOR_COMMUNITY;
} // end if
else // POST
{ // get the parameters and generate the export file
if (rinput.isImageButtonClicked("cancel"))
rc = new Redirect(on_error,LinkTypes.SERVLET); // cancel - go back to menu
else if (rinput.isImageButtonClicked("export"))
{ // get the list of topics to be exported
tarray = rinput.getParameterValues("tselect");
if (tarray==null)
rc = new ErrorBox("Input Error","No topics selected.",on_error);
else if (tarray.length==0)
rc = new ErrorBox("Input Error","No topics selected.",on_error);
else
{ // convert the array of string equivalent topic numbers to a set of topic indexes
tset = new HashSet();
for (i=0; i<tarray.length; i++)
tset.add(new Integer(tarray[i]));
// generate the XML output
xout = conf.exportTopics(tset);
rc = new AttachmentContent(xout,"text/xml","exported-data.xml");
} // end else
} // end else if
else
{ // invalid command button pressed
logger.error("no known button click on POST to conf/export.js");
rc = new ErrorBox("Internal Error","Unknown command button pressed",on_error);
} // end else
} // end else
} // end try
catch (e)
{ // figure out exception type
etype = vlib.exceptionType(e) + "";
if (etype.match("AccessError"))
rc = new ErrorBox("Access Error",e.message,on_error);
else if (etype.match("DataException"))
rc = new ErrorBox("Database Error",e.message,on_error);
else if (etype.match("IOException"))
rc = new ErrorBox("I/O Error",e.message,on_error);
else
rc = e;
} // end catch
vlib.output(rc);

97
scripts/conf/import.js Normal file
View File

@ -0,0 +1,97 @@
// 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@ricochet.com>,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
// Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
//
// Contributor(s):
importPackage(java.lang);
importPackage(java.util);
importPackage(Packages.com.silverwrist.venice.core);
importPackage(Packages.com.silverwrist.venice.except);
importPackage(Packages.com.silverwrist.venice.ui);
importPackage(Packages.com.silverwrist.venice.ui.conf);
importPackage(Packages.com.silverwrist.venice.ui.helpers);
importPackage(Packages.com.silverwrist.venice.ui.view);
// get the request object and the community
rinput = bsf.lookupBean("request");
comm = rinput.getCommunity(true,"top.js.vs");
// get the current conference
currc = new CurrentConference(rinput);
conf = currc.getConference(true,"conf/conferences.js.vs?cc=" + comm.communityID);
on_error = "conf/manage_conf.js.vs?cc=" + comm.communityID + "&conf=" + conf.confID;
if (!(conf.canChangeConference()))
{ // you can't fiddle with this conference
vlib.output(new ErrorBox("Access Error","You do not have permission to import posts to this conference.",
on_error));
vlib.done();
} // end if
rc = null; // return from this script
try
{ // figure out what to do
if ("GET"==rinput.verb)
{ // load and display the JSP page for the form
rc = new JSPView("Import Messages: " + conf.name,"conf/import.jsp");
rc.menuSelector = Content.MENU_SELECTOR_COMMUNITY;
} // end get
else // POST
{ // which button was pressed to get the POST going?
if (rinput.isImageButtonClicked("cancel"))
rc = new Redirect(on_error,LinkTypes.SERVLET); // cancel - go back to menu
else if (rinput.isImageButtonClicked("import"))
{ // begin the import!
match_meth = rinput.getParameterInt("match",0);
create_new = rinput.hasParameter("create");
if (rinput.hasParameter("the_file"))
{ // perform the import and set up the results
msgs = conf.importMessages(rinput.getParameterDataStream("the_file"),match_meth,create_new);
rinput.setRequestAttribute("output.list",msgs);
rc = new JSPView("Import Message Results: " + conf.name,"conf/import_results.jsp");
rc.menuSelector = Content.MENU_SELECTOR_COMMUNITY;
} // end if
else // no input file specified
rc = new ErrorBox("Input Error","No input file specified.",
"conf/import.js.vs?cc=" + comm.communityID + "&conf=" + conf.confID);
} // end else if
else
{ // invalid command button pressed
logger.error("no known button click on POST to conf/import.js");
rc = new ErrorBox("Internal Error","Unknown command button pressed",on_error);
} // end else
} // end else
} // end try
catch (e)
{ // figure out the exception type
etype = vlib.exceptionType(e) + "";
if (etype.match("AccessError"))
rc = new ErrorBox("Access Error",e.message,on_error);
else if (etype.match("DataException"))
rc = new ErrorBox("Database Error",e.message,on_error);
else if (etype.match("IOException"))
rc = new ErrorBox("I/O Error",e.message,on_error);
else
rc = e;
} // end catch
vlib.output(rc);

View File

@ -0,0 +1,194 @@
/*
* 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@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.util;
import java.io.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.*;
public class Base64EncodeInputStream extends FilterInputStream
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static Logger logger = Logger.getLogger(Base64EncodeInputStream.class);
private static final int NREAD = 768; // must be divisible by three
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private byte[] m_coded_data = null;
private int m_ptr = 0;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public Base64EncodeInputStream(InputStream inner)
{
super(inner);
} // end constructor
/*--------------------------------------------------------------------------------
* Internal operations
*--------------------------------------------------------------------------------
*/
private boolean backfill() throws IOException
{
if ((m_coded_data!=null) && (m_coded_data.length<=m_ptr))
{ // the buffer is empty - clear it
logger.debug("buffer drained");
m_coded_data = null;
} // end if
if (m_coded_data==null)
{ // read in a chunk from the underlying stream
byte[] data = new byte[NREAD];
int nr = in.read(data);
if (nr<=0)
{ // done with underlying stream
logger.debug("B64EIS - underlying stream at EOF");
return true;
} // end if
if (logger.isDebugEnabled())
logger.debug("read " + nr + " bytes from underlying stream");
if (nr<NREAD)
{ // shorten the read-in array
byte[] data2 = new byte[nr];
System.arraycopy(data,0,data2,0,nr);
data = data2;
} // end if
m_coded_data = Base64.encodeBase64(data);
m_ptr = 0;
if (logger.isDebugEnabled())
logger.debug("reset buffer - now have " + m_coded_data.length + " bytes");
} // end if
return false;
} // end backfill
/*--------------------------------------------------------------------------------
* Overrides from class FilterInputStream
*--------------------------------------------------------------------------------
*/
public synchronized int read() throws IOException
{
if (backfill())
return -1; // end of file
return (int)(m_coded_data[m_ptr++]);
} // end read
public synchronized int read(byte[] b, int off, int len) throws IOException
{
if (b==null)
throw new NullPointerException("null array");
if (off<0)
throw new IndexOutOfBoundsException("negative offset");
if (len<0)
throw new IndexOutOfBoundsException("negative length");
if ((off + len)>b.length)
throw new IndexOutOfBoundsException("off right end of array");
if (len==0)
return 0;
int rc = 0;
while (len>0)
{ // force a backfill before copying
if (backfill())
break; // end of the underlying file
int ncpy = Math.min(len,m_coded_data.length - m_ptr);
System.arraycopy(m_coded_data,m_ptr,b,off,ncpy);
m_ptr += ncpy;
off += ncpy;
rc += ncpy;
len -= ncpy;
} // end while
if (rc==0)
rc = -1; // EOF
return rc;
} // end read
public synchronized long skip(long n) throws IOException
{
long rc = 0;
while (n>0)
{ // force a backfill before skipping
if (backfill())
break; // end of the underlying file
long nskp = Math.min(n,m_coded_data.length - m_ptr);
m_ptr += (int)nskp;
rc += nskp;
n -= nskp;
} // end while
return rc;
} // end skip
public void close() throws IOException
{
in.close();
m_coded_data = null;
} // end close
public synchronized int available() throws IOException
{
if (backfill())
return 0; // at end of file
return (m_coded_data.length - m_ptr) + (in.available() * 4 / 3);
} // end available
public void mark(int readLimit)
{ // do nothing
} // end mark
public void reset()
{ // do nothing
} // end reset
public boolean markSupported()
{
return false;
} // end markSupported
} // end class Base64EncodeInputStream

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -125,20 +125,25 @@ public class IOUtil
* @param input The stream to copy binary data from. * @param input The stream to copy binary data from.
* @param output The stream to copy binary data to. * @param output The stream to copy binary data to.
* @param bufsize The size of the buffer to allocate for copying. * @param bufsize The size of the buffer to allocate for copying.
* @return The total number of bytes copied.
* @exception java.io.IOException If an exception occurred while reading or writing data. * @exception java.io.IOException If an exception occurred while reading or writing data.
*/ */
public static void copy(InputStream input, OutputStream output, int bufsize) throws IOException public static int copy(InputStream input, OutputStream output, int bufsize) throws IOException
{ {
byte[] buffer = new byte[bufsize]; byte[] buffer = new byte[bufsize];
int rc = 0;
int rd = input.read(buffer); int rd = input.read(buffer);
while (rd>=0) while (rd>=0)
{ // simple read-write loop to shove data out the door { // simple read-write loop to shove data out the door
if (rd>0) if (rd>0)
output.write(buffer,0,rd); output.write(buffer,0,rd);
rc += rd;
rd = input.read(buffer); rd = input.read(buffer);
} // end while } // end while
return rc;
} // end copy } // end copy
/** /**
@ -147,13 +152,14 @@ public class IOUtil
* *
* @param input The stream to copy binary data from. * @param input The stream to copy binary data from.
* @param output The stream to copy binary data to. * @param output The stream to copy binary data to.
* @return The total number of bytes copied.
* @exception java.io.IOException If an exception occurred while reading or writing data. * @exception java.io.IOException If an exception occurred while reading or writing data.
* @see #DEFAULT_BUFSIZE * @see #DEFAULT_BUFSIZE
* @see #copy(java.io.InputStream,java.io.OutputStream,int) * @see #copy(java.io.InputStream,java.io.OutputStream,int)
*/ */
public static void copy(InputStream input, OutputStream output) throws IOException public static int copy(InputStream input, OutputStream output) throws IOException
{ {
copy(input,output,DEFAULT_BUFSIZE); return copy(input,output,DEFAULT_BUFSIZE);
} // end copy } // end copy
@ -246,20 +252,25 @@ public class IOUtil
* @param input The reader to copy character data from. * @param input The reader to copy character data from.
* @param output The writer to copy character data to. * @param output The writer to copy character data to.
* @param bufsize The size of the buffer to allocate for copying. * @param bufsize The size of the buffer to allocate for copying.
* @return The number of characters copied.
* @exception java.io.IOException If an exception occurred while reading or writing data. * @exception java.io.IOException If an exception occurred while reading or writing data.
*/ */
public static void copy(Reader input, Writer output, int bufsize) throws IOException public static int copy(Reader input, Writer output, int bufsize) throws IOException
{ {
char[] buffer = new char[bufsize]; char[] buffer = new char[bufsize];
int rc = 0;
int rd = input.read(buffer); int rd = input.read(buffer);
while (rd>=0) while (rd>=0)
{ // simple read-write loop to shove data out the door { // simple read-write loop to shove data out the door
if (rd>0) if (rd>0)
output.write(buffer,0,rd); output.write(buffer,0,rd);
rc += rd;
rd = input.read(buffer); rd = input.read(buffer);
} // end while } // end while
return rc;
} // end copy } // end copy
/** /**
@ -268,13 +279,14 @@ public class IOUtil
* *
* @param input The reader to copy character data from. * @param input The reader to copy character data from.
* @param output The writer to copy character data to. * @param output The writer to copy character data to.
* @return The number of characters copied.
* @exception java.io.IOException If an exception occurred while reading or writing data. * @exception java.io.IOException If an exception occurred while reading or writing data.
* @see #DEFAULT_BUFSIZE * @see #DEFAULT_BUFSIZE
* @see #copy(java.io.Reader,java.io.Writer,int) * @see #copy(java.io.Reader,java.io.Writer,int)
*/ */
public static void copy(Reader input, Writer output) throws IOException public static int copy(Reader input, Writer output) throws IOException
{ {
copy(input,output,DEFAULT_BUFSIZE); return copy(input,output,DEFAULT_BUFSIZE);
} // end copy } // end copy

View File

@ -9,16 +9,19 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
package com.silverwrist.venice.core; package com.silverwrist.venice.core;
import java.io.InputStream;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set;
import com.silverwrist.venice.except.AccessError; import com.silverwrist.venice.except.AccessError;
import com.silverwrist.venice.except.DataException; import com.silverwrist.venice.except.DataException;
import com.silverwrist.venice.except.EmailException; import com.silverwrist.venice.except.EmailException;
@ -43,6 +46,9 @@ public interface ConferenceContext
public static final int CUST_BLOCK_TOP = 0; public static final int CUST_BLOCK_TOP = 0;
public static final int CUST_BLOCK_BOTTOM = 1; public static final int CUST_BLOCK_BOTTOM = 1;
public static final int IMPORT_MATCH_NUM = 0;
public static final int IMPORT_MATCH_NAME = 1;
public abstract int getConfID(); public abstract int getConfID();
public abstract String getName(); public abstract String getName();
@ -192,4 +198,9 @@ public interface ConferenceContext
public abstract String getPostLink() throws DataException; public abstract String getPostLink() throws DataException;
public abstract String exportTopics(Set select_topics) throws AccessError, DataException, IOException;
public abstract List importMessages(InputStream xmlstream, int match_method, boolean create_new)
throws AccessError, DataException;
} // end interface ConferenceContext } // end interface ConferenceContext

View File

@ -18,6 +18,8 @@
package com.silverwrist.venice.core; package com.silverwrist.venice.core;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date; import java.util.Date;
import com.silverwrist.venice.except.AccessError; import com.silverwrist.venice.except.AccessError;
import com.silverwrist.venice.except.DataException; import com.silverwrist.venice.except.DataException;
@ -60,6 +62,8 @@ public interface TopicMessageContext
public abstract InputStream getAttachmentData() throws AccessError, DataException; public abstract InputStream getAttachmentData() throws AccessError, DataException;
public abstract int getAttachmentData(OutputStream here) throws AccessError, DataException, IOException;
public abstract boolean canHide(); public abstract boolean canHide();
public abstract boolean canScribble(); public abstract boolean canScribble();

View File

@ -9,14 +9,15 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
package com.silverwrist.venice.core.impl; package com.silverwrist.venice.core.impl;
import java.io.*;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
import org.apache.log4j.*; import org.apache.log4j.*;
@ -1778,6 +1779,95 @@ class ConferenceUserContextImpl implements ConferenceContext, ConferenceBackend
} // end getPostLink } // end getPostLink
public String exportTopics(Set select_topics) throws AccessError, DataException, IOException
{
if (logger.isDebugEnabled())
logger.debug("exportTopics(" + select_topics.toString() + ") entry");
if (!(getConferenceData().canChangeConference(level)))
throw new AccessError("You are not permitted to export posts from this conference.");
if (deleted)
throw new DataException("Cannot export posts from a deleted conference.");
// "Normalize" the topic selection set.
HashSet norm_select_topics = null;
if (select_topics!=null)
{ // build the normalized set
norm_select_topics = new HashSet();
for (Iterator it=select_topics.iterator(); it.hasNext(); )
{ // get each object out in turn
Object o = it.next();
if (o==null)
continue;
if (o instanceof Integer)
{ // it's already an integer
norm_select_topics.add(o);
continue;
} // end if
if (o instanceof Number)
{ // convert to Integer and add it
norm_select_topics.add(new Integer(((Number)o).intValue()));
continue;
} // end if
try
{ // append integer equivalent to set
norm_select_topics.add(new Integer(o.toString()));
} // end try
catch (NumberFormatException e)
{ // do nothing
} // end catch
} // end for
} // end if
ConferencingExporter xprt = new ConferencingExporter();
xprt.setTopics(norm_select_topics);
return xprt.exportConference(this);
} // end exportTopics
public List importMessages(InputStream xmlstream, int match_method, boolean create_new)
throws AccessError, DataException
{
if (xmlstream==null)
throw new NullPointerException("bad input stream");
if ((match_method!=IMPORT_MATCH_NUM) && (match_method!=IMPORT_MATCH_NAME))
throw new IndexOutOfBoundsException("invalid match method specified");
if (!(getConferenceData().canChangeConference(level)))
throw new AccessError("You are not permitted to import posts to this conference.");
if (deleted)
throw new DataException("Cannot import messages to a deleted conference.");
Connection conn = null;
try
{ // get a connection and create the worker
conn = env.getConnection();
ConferencingImporter worker = new ConferencingImporter(env.getUserID(),confid,match_method,create_new,conn,
env.getEngine());
// run it!
return worker.importMessages(xmlstream);
} // end try
catch (SQLException e)
{ // translate SQLException to DataException
throw new DataException("Error getting database connection: " + e.getMessage(),e);
} // end catch
finally
{ // shut down the connection
SQLUtil.shutdown(conn);
} // end finally
} // end importMessages
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Implementations from interface ConferenceBackend * Implementations from interface ConferenceBackend
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------

View File

@ -0,0 +1,220 @@
/*
* 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@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.core.impl;
import java.io.*;
import java.text.*;
import java.util.*;
import org.apache.log4j.*;
import com.silverwrist.util.*;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.except.*;
class ConferencingExporter
{
/*--------------------------------------------------------------------------------
* Static data members
*--------------------------------------------------------------------------------
*/
private static Logger logger = Logger.getLogger(ConferencingExporter.class);
private static final DateFormat s_datefmt;
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private StringWriter m_buffer = null;
private PrintWriter m_wr = null;
private Set m_include = null;
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
ConferencingExporter()
{ // do nothing
} // end constructor
/*--------------------------------------------------------------------------------
* Internal operations
*--------------------------------------------------------------------------------
*/
private void visit(TopicMessageUserContextImpl msg) throws DataException, AccessError, IOException
{
if (logger.isDebugEnabled())
logger.debug("exporting post #" + msg.getPostNumber());
m_wr.write("<post id=\"");
m_wr.print(msg.getPostID());
m_wr.write("\" parent=\"");
m_wr.print(msg.getParentPostID());
m_wr.write("\" index=\"");
m_wr.print(msg.getPostNumber());
m_wr.write("\" lines=\"");
m_wr.print(msg.getNumLines());
m_wr.write("\" author=\"");
m_wr.write(msg.getCreatorName());
m_wr.write("\" date=\"");
m_wr.write(s_datefmt.format(msg.getPostDate()));
m_wr.write("\" hidden=\"");
m_wr.write(msg.isHidden() ? "true" : "false");
m_wr.write("\">\n");
if (msg.isScribbled())
{ // write out the scribble information
m_wr.write("<scribbled by=\"");
m_wr.write(msg.getScribblingUser());
m_wr.write("\" date=\"");
m_wr.write(s_datefmt.format(msg.getScribbleDate()));
m_wr.write("\"/>\n");
} // end if
m_wr.write("<pseud><![CDATA[");
m_wr.write(msg.getPseud());
m_wr.write("]]></pseud>\n<text><![CDATA[");
m_wr.write(msg.getBodyText());
m_wr.write("]]></text>\n");
if (msg.hasAttachment())
{ // write out the attachment information
if (logger.isDebugEnabled())
logger.debug("exporting attachment for post #" + msg.getPostNumber());
m_wr.write("<attachment length=\"");
m_wr.print(msg.getAttachmentLength());
m_wr.write("\" type=\"");
m_wr.write(msg.getAttachmentType());
m_wr.write("\" filename=\"");
m_wr.write(msg.getAttachmentFilename());
m_wr.write("\">");
Reader r = null;
try
{ // copy the attachment data into the output
r = new BufferedReader(new InputStreamReader(new Base64EncodeInputStream(msg.getAttachmentData()),
"US-ASCII"));
IOUtil.copy(r,m_wr);
} // end try
catch (UnsupportedEncodingException e)
{ // whoops!
throw new InternalStateError("Encoding not supported?");
} // end catch
catch (IOException e)
{ // what happened here?
logger.error("I/O exception",e);
throw e;
} // end catch
finally
{ // close down our reader when we're done
IOUtil.shutdown(r);
} // end finally
m_wr.write("</attachment>\n");
} // end if
m_wr.write("</post>\n");
} // end visit
private void visit(TopicUserContextImpl topic) throws DataException, AccessError, IOException
{
if ((m_include!=null) && !(m_include.contains(new Integer(topic.getTopicNumber()))))
return; // skip this topic
if (logger.isDebugEnabled())
logger.debug("exporting topic \"" + topic.getName() + "\"");
// write the main topic information
m_wr.write("<topic index=\"");
m_wr.print(topic.getTopicNumber());
m_wr.write("\" frozen=\"");
m_wr.write(topic.isFrozen() ? "true" : "false");
m_wr.write("\" archived=\"");
m_wr.write(topic.isArchived() ? "true" : "false");
m_wr.write("\">\n<topicname><![CDATA[");
m_wr.write(topic.getName());
m_wr.write("]]></topicname>\n");
// get the posts and write them out
List l = topic.getMessages(0,topic.getTopMessage());
for (Iterator it=l.iterator(); it.hasNext(); )
visit((TopicMessageUserContextImpl)(it.next()));
// done with the topic
m_wr.write("</topic>\n");
} // end visit
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
void setTopics(Set s)
{
m_include = s;
} // end setTopics
String exportConference(ConferenceUserContextImpl conf) throws DataException, AccessError, IOException
{
if (logger.isDebugEnabled())
logger.debug("exporting conference \"" + conf.getName() + "\"");
m_buffer = new StringWriter();
m_wr = new PrintWriter(m_buffer);
m_wr.write("<?xml version=\"1.0\"?>\n<vcif>\n");
List l = conf.getTopicList(ConferenceContext.GET_ALL,ConferenceContext.SORT_NUMBER);
for (Iterator it=l.iterator(); it.hasNext(); )
visit((TopicUserContextImpl)(it.next()));
m_wr.write("</vcif>\n");
m_wr.flush();
// Return the finished buffer.
String rc = m_buffer.toString();
m_wr.close();
m_wr = null;
m_buffer = null;
return rc;
} // end exportConference
/*--------------------------------------------------------------------------------
* Static initializer
*--------------------------------------------------------------------------------
*/
static
{ // create an ISO 8601 date formatter
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
df.setTimeZone(new SimpleTimeZone(0,"UTC"));
s_datefmt = df;
} // end static initializer
} // end class ConferencingExporter

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -293,6 +293,13 @@ class PublishedMessageImpl implements TopicMessageContext
} // end getAttachmentData } // end getAttachmentData
public int getAttachmentData(OutputStream here) throws AccessError, DataException, IOException
{
// FUTURE: allow publishing paperclips?
throw new AccessError("There is no attachment data for this message.");
} // end getAttachmentData
public boolean canHide() public boolean canHide()
{ {
return false; return false;

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -200,6 +200,40 @@ class TopicMessageUserContextImpl implements TopicMessageContext
} // end refresh } // end refresh
/*--------------------------------------------------------------------------------
* Semi-internal operations
*--------------------------------------------------------------------------------
*/
final String getScribblingUser() throws DataException
{
if (scribble_uid==-1)
return null;
Connection conn = null;
try
{ // use a database connection to get the user name
conn = env.getConnection();
refresh(conn);
if (nuked)
return null; // post nuked!
return quickGetUserName(conn,scribble_uid);
} // end try
catch (SQLException e)
{ // turn this into a DataException
logger.error("DB error reading user name: " + e.getMessage(),e);
throw new DataException("unable to retrieve user name: " + e.getMessage(),e);
} // end catch
finally
{ // make sure we release the connection before we go
SQLUtil.shutdown(conn);
} // end finally
} // end getScribblingUser
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Implementations from interface TopicMessageContext * Implementations from interface TopicMessageContext
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -392,6 +426,8 @@ class TopicMessageUserContextImpl implements TopicMessageContext
public InputStream getAttachmentData() throws AccessError, DataException public InputStream getAttachmentData() throws AccessError, DataException
{ {
if (logger.isDebugEnabled())
logger.debug("getAttachmentData() for post " + postid);
if (nuked || (scribble_date!=null)) if (nuked || (scribble_date!=null))
{ // this would be an exercise in futility! { // this would be an exercise in futility!
logger.error("cannot attach to a nuked or scribbled message"); logger.error("cannot attach to a nuked or scribbled message");
@ -401,6 +437,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
Connection conn = null; Connection conn = null;
Statement stmt = null; Statement stmt = null;
ResultSet rs = null;
InputStream rc = null; InputStream rc = null;
try try
{ // open up a database connection { // open up a database connection
@ -434,7 +471,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
sql.append("SELECT data FROM postattach WHERE postid = ").append(postid).append(';'); sql.append("SELECT data FROM postattach WHERE postid = ").append(postid).append(';');
// Execute the query! // Execute the query!
ResultSet rs = stmt.executeQuery(sql.toString()); rs = stmt.executeQuery(sql.toString());
if (!(rs.next())) if (!(rs.next()))
{ // there is no attachment data! { // there is no attachment data!
logger.error("no attachment data to get"); logger.error("no attachment data to get");
@ -450,10 +487,12 @@ class TopicMessageUserContextImpl implements TopicMessageContext
switch (stgmethod) switch (stgmethod)
{ // where's our input really coming from { // where's our input really coming from
case 0: // copy verbatim case 0: // copy verbatim
logger.debug("stgmethod 0 = straight copy");
real_input = sqldata; real_input = sqldata;
break; break;
case 1: // gunzip it first case 1: // gunzip it first
logger.debug("stgmethod 1 = GZIP decompress");
real_input = new GZIPInputStream(sqldata); real_input = new GZIPInputStream(sqldata);
break; break;
@ -463,7 +502,10 @@ class TopicMessageUserContextImpl implements TopicMessageContext
} // end switch } // end switch
// Copy to a new stream. // Copy to a new stream.
rc = new ByteArrayInputStream(IOUtil.load(real_input)); byte[] ary = IOUtil.load(real_input);
if (logger.isDebugEnabled())
logger.debug("loaded data of length " + ary.length);
rc = new ByteArrayInputStream(ary);
} // end try } // end try
catch (SQLException e) catch (SQLException e)
@ -480,6 +522,7 @@ class TopicMessageUserContextImpl implements TopicMessageContext
} // end catch } // end catch
finally finally
{ // make sure we release the connection before we go { // make sure we release the connection before we go
SQLUtil.shutdown(rs);
SQLUtil.shutdown(stmt); SQLUtil.shutdown(stmt);
SQLUtil.shutdown(conn); SQLUtil.shutdown(conn);
@ -489,6 +532,102 @@ class TopicMessageUserContextImpl implements TopicMessageContext
} // end getAttachmentData } // end getAttachmentData
public int getAttachmentData(OutputStream here) throws AccessError, DataException, IOException
{
if (logger.isDebugEnabled())
logger.debug("getAttachmentData() for post " + postid);
if (nuked || (scribble_date!=null))
{ // this would be an exercise in futility!
logger.error("cannot attach to a nuked or scribbled message");
throw new AccessError("You cannot attach data to a message that no longer exists.");
} // end if
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try
{ // open up a database connection
conn = env.getConnection();
// make sure we have current data
refresh(conn);
if (nuked || (scribble_date!=null))
{ // this would be an exercise in futility!
logger.error("cannot attach to a nuked or scribbled message");
throw new AccessError("You cannot attach data to a message that no longer exists.");
} // end if
if (mimetype==null)
{ // there is no attachment data!
logger.error("no attachment data to get");
throw new AccessError("There is no attachment data for this message.");
} // end if
// This will cause a "hit" on the attachment data. Update that record.
stmt = conn.createStatement();
StringBuffer sql = new StringBuffer("UPDATE postattach SET hits = hits + 1, last_hit = '");
sql.append(SQLUtil.encodeDate(new java.util.Date())).append("' WHERE postid = ").append(postid);
sql.append(';');
stmt.executeUpdate(sql.toString());
// Create the SQL we need to retrieve the attachment.
sql.setLength(0);
sql.append("SELECT data FROM postattach WHERE postid = ").append(postid).append(';');
// Execute the query!
rs = stmt.executeQuery(sql.toString());
if (!(rs.next()))
{ // there is no attachment data!
logger.error("no attachment data to get");
throw new AccessError("There is no attachment data for this message.");
} // end if
// Since the InputStream we get from JDBC will probably go away when the connection is dropped, we
// need to make a temporary copy of it, to a ByteArrayOutputStream. (Attachments can only be
// 1 Mb in size, so this shouldn't be a big problem.)
InputStream sqldata = rs.getBinaryStream(1);
InputStream real_input;
switch (stgmethod)
{ // where's our input really coming from
case 0: // copy verbatim
logger.debug("stgmethod 0 = straight copy");
real_input = sqldata;
break;
case 1: // gunzip it first
logger.debug("stgmethod 1 = GZIP decompress");
real_input = new GZIPInputStream(sqldata);
break;
default:
throw new DataException("Unknown storage method value: " + stgmethod);
} // end switch
// copy the data and return number of bytes copied
return IOUtil.copy(real_input,here);
} // end try
catch (SQLException e)
{ // turn this into a DataException
logger.error("DB error retrieving attachment: " + e.getMessage(),e);
throw new DataException("unable to retrieve attachment data: " + e.getMessage(),e);
} // end catch
finally
{ // make sure we release the connection before we go
SQLUtil.shutdown(rs);
SQLUtil.shutdown(stmt);
SQLUtil.shutdown(conn);
} // end finally
} // end getAttachmentData
public boolean canHide() public boolean canHide()
{ {
return ( ((creator_uid==env.getUserID()) && (!env.isAnonymous())) return ( ((creator_uid==env.getUserID()) && (!env.isAnonymous()))

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -201,6 +201,17 @@ class TopicUserContextImpl implements TopicContext
} // end loadBozo } // end loadBozo
/*--------------------------------------------------------------------------------
* Semi-internal functions
*--------------------------------------------------------------------------------
*/
final int getTopMessage()
{
return top_message;
} // end getTopMessage
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Implementations from interface TopicContext * Implementations from interface TopicContext
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */

View File

@ -17,11 +17,9 @@
*/ */
package com.silverwrist.venice.ui.conf; package com.silverwrist.venice.ui.conf;
import java.io.InputStream; import java.io.*;
import java.io.IOException;
import com.silverwrist.venice.core.TopicMessageContext; import com.silverwrist.venice.core.TopicMessageContext;
import com.silverwrist.venice.except.AccessError; import com.silverwrist.venice.except.*;
import com.silverwrist.venice.except.DataException;
import com.silverwrist.venice.ui.ContentExecute; import com.silverwrist.venice.ui.ContentExecute;
import com.silverwrist.venice.ui.LinkTypes; import com.silverwrist.venice.ui.LinkTypes;
import com.silverwrist.venice.ui.RequestExec; import com.silverwrist.venice.ui.RequestExec;
@ -40,7 +38,7 @@ public class AttachmentContent extends ThrowableContent implements ContentExecut
private InputStream stm; private InputStream stm;
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Constructor * Constructors
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
@ -54,6 +52,26 @@ public class AttachmentContent extends ThrowableContent implements ContentExecut
} // end constructor } // end constructor
public AttachmentContent(String data, String type, String filename)
{
super();
this.type = type;
this.filename = filename;
try
{ // get the string data and output it
byte[] d = data.getBytes("UTF-8");
this.length = d.length;
this.stm = new ByteArrayInputStream(d);
} // end try
catch (UnsupportedEncodingException e)
{ // this is not supposed to happen
throw new InternalStateError("encoding not found?!?!?!?");
} // end catch
} // end constructor
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Implementations from interface ContentExecute * Implementations from interface ContentExecute
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------

View File

@ -9,9 +9,9 @@
* *
* The Original Code is the Venice Web Communities System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2001-04 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
* *
* Contributor(s): * Contributor(s):
*/ */
@ -166,6 +166,21 @@ public abstract class BaseServlet extends HttpServlet
my_output = new ErrorBox("Internal Error!", my_output = new ErrorBox("Internal Error!",
"No content returned for request: " + the_request.getVerb() + ": /" "No content returned for request: " + the_request.getVerb() + ": /"
+ default_location,null); + default_location,null);
else if (my_output instanceof RuntimeException)
{ // throw all RuntimeExceptions we get at this level
logger.error("BaseServlet caught runtime exception" + my_output.getClass().getName()
+ " in commonProcess",(Throwable)my_output);
throw new ServletException((Throwable)my_output);
} // end else if
else if (my_output instanceof VirtualMachineError)
{ // OutOfMemoryError, StackOverflowError, and such come here
System.gc(); // garbage collect so we have enough space to handle the error
logger.error("Virtual machine failure " + my_output.getClass().getName() + " in commonProcess",
(Throwable)my_output);
throw new ServletException((Throwable)my_output);
} // end else if
} // end try } // end try
catch (ThrowableContent tc) catch (ThrowableContent tc)

View File

@ -0,0 +1,60 @@
<%--
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@ricochet.com>,
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
Contributor(s):
--%>
<%@ page import = "java.util.*" %>
<%@ page import = "com.silverwrist.venice.core.*" %>
<%@ page import = "com.silverwrist.venice.ui.conf.CurrentConference" %>
<%@ page import = "com.silverwrist.venice.ui.view.JSPView" %>
<%@ taglib uri="/tlds/util" prefix="util" %>
<%@ taglib uri="/tlds/community" prefix="comm" %>
<%@ taglib uri="/tlds/conference" prefix="conf" %>
<%
JSPView view = JSPView.get(request);
final List topics = (List)(view.getRequestAttribute("topic.list"));
%>
<util:header>
<util:title>Export Messages</util:title>
<util:subtitle><util:escape>Conference: <conf:name/></util:escape></util:subtitle>
</util:header>
<util:form action="conf/export.js.vs" type="servlet">
<input type="hidden" name="cc" value="<comm:ID/>" />
<input type="hidden" name="conf" value="<conf:ID/>" />
<div align="center"><table border="0" cellpadding="0" cellspacing="2">
<tr><td align="left" colspan="3">
<util:font color="content.fg" size="content"><b>Select Topics to Export:</b></util:font>
</td></tr>
<% for (Iterator it=topics.iterator(); it.hasNext(); ) { %>
<% TopicContext t = (TopicContext)(it.next()); %>
<tr>
<td align="center">
<input type="checkbox" name="tselect" value="<%= t.getTopicNumber() %>" checked="checked" />
</td>
<td align="right"><util:font color="content.fg" size="content"><%= t.getTopicNumber() %>.</util:font></td>
<td align="left"><util:font color="content.fg" size="content">
<util:escape><%= t.getName() %></util:escape>
</util:font></td>
</tr>
<% } // end for %>
</table></div><br />
<div align="center">
<util:button id="export" type="input" />&nbsp;&nbsp;<util:button id="cancel" type="input" />
</div>
</util:form>

View File

@ -0,0 +1,53 @@
<%--
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@ricochet.com>,
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
Contributor(s):
--%>
<%@ page import = "java.util.*" %>
<%@ page import = "com.silverwrist.venice.core.*" %>
<%@ page import = "com.silverwrist.venice.ui.conf.CurrentConference" %>
<%@ page import = "com.silverwrist.venice.ui.view.JSPView" %>
<%@ taglib uri="/tlds/util" prefix="util" %>
<%@ taglib uri="/tlds/community" prefix="comm" %>
<%@ taglib uri="/tlds/conference" prefix="conf" %>
<%
JSPView view = JSPView.get(request);
%>
<util:header>
<util:title>Import Messages</util:title>
<util:subtitle><util:escape>Conference: <conf:name/></util:escape></util:subtitle>
</util:header>
<util:form action="conf/import.js.vs" type="servlet" isfile="true">
<input type="hidden" name="cc" value="<comm:ID/>" />
<input type="hidden" name="conf" value="<conf:ID/>" />
<div align="center">
<div align="left">
<util:font color="content.fg" size="content">Content data to be uploaded:</util:font>
<span class="cinput"><input type="file" name="the_file" size="48" /></span><br />
<util:font color="content.fg" size="content">
Match existing topics in the conference:
<select name="match" size="1">
<option value="<%= ConferenceContext.IMPORT_MATCH_NUM %>" selected="selected">By topic number</option>
<option value="<%= ConferenceContext.IMPORT_MATCH_NAME %>">By name</option>
</select><br />
<input type="checkbox" name="create" value="true" checked="checked" />
Create new topics if they don't exist
</util:font>
</div>
<util:button id="import" type="input" />&nbsp;&nbsp;<util:button id="cancel" type="input" />
</div>
</util:form>

View File

@ -0,0 +1,48 @@
<%--
The contents of this file are subject to the Mozilla Public License Version 1.1
(the "License"); you may not use this file except in compliance with the License.
You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
WARRANTY OF ANY KIND, either express or implied. See the License for the specific
language governing rights and limitations under the License.
The Original Code is the Venice Web Communities System.
The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
Contributor(s):
--%>
<%@ page import = "java.util.*" %>
<%@ page import = "com.silverwrist.venice.core.*" %>
<%@ page import = "com.silverwrist.venice.ui.conf.CurrentConference" %>
<%@ page import = "com.silverwrist.venice.ui.view.JSPView" %>
<%@ taglib uri="/tlds/util" prefix="util" %>
<%@ taglib uri="/tlds/community" prefix="comm" %>
<%@ taglib uri="/tlds/conference" prefix="conf" %>
<%
JSPView view = JSPView.get(request);
List msgs = (List)(view.getRequestAttribute("output.list"));
%>
<util:comment>Import Messages - Results</util:comment>
<util:header>
<util:title>Results of Import</util:title>
<util:subtitle><util:escape>to Conference: <conf:name/></util:escape></util:subtitle>
</util:header>
<div class="content"><util:font color="content.fg" size="content">
<util:xlink>
<util:href type="servlet">conf/manage_conf.js.vs?cc=<comm:ID/>&conf=<conf:ID/></util:href>
<util:text>Return to Manage Conference Menu</util:text>
</util:xlink><p>
<% if (msgs.isEmpty()) { %>
<i>No error messages from import.</i>
<% } else { %>
<% for (Iterator it=msgs.iterator(); it.hasNext(); ) { %>
<% String s = (String)(it.next()); %>
<util:escape><%= s %></util:escape><br />
<% } // end for %>
<% } // end if %>
</util:font></div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB