[Idrs-commit] CVS: Idrs/dev/src/net/sourceforge/idrs/core/servlet DataSource.java,NONE,1.1 MultiPart
Brought to you by:
bigman921
|
From: Marc B. <big...@us...> - 2002-02-27 23:56:35
|
Update of /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet
In directory usw-pr-cvs1:/tmp/cvs-serv12455/dev/src/net/sourceforge/idrs/core/servlet
Modified Files:
DocInfo.class IDRSSecurity.class IDRSServlet.class
IDRSServlet.java Init.class ReportStore.class
Added Files:
DataSource.java MultiPartRequest.java
Log Message:
Added upload support! Thanks to Dane Foster and Equity Technology Group for posting their code on sourceforge!
--- NEW FILE: DataSource.java ---
/********************************************************************************/
/**
<OWNER>Dane Foster</OWNER>
<ORGANIZATION>Equity Technology Group, Inc.</ORGANIZATION>
<YEAR>2001</YEAR>
Copyright (c) 2001, Equity Technology Group, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following
disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of
ETG or Dane Foster nor the names of its contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**/
/**
* Description: Represents a MIME encoded object
* @author Dane Foster <mailto:df...@eq...>
* @version 1.01
* @date 12.05.01
*/
package net.sourceforge.idrs.core.servlet;
public class DataSource
{
private String contentType, filename;
private byte[] binary;
/**
* Creates a new DataSource object.
*
* @param contentType The MIME type
* @param filename The objects name. This includes any path information
* @param bin The binary contents of the MIME object
*/
protected DataSource( String contentType, String filename, byte[] bin )
{
this.contentType = contentType;
this.filename = filename;
this.binary = bin;
}
/**
* Sets this object's content type. The String should be in MIME format (i.e. image/jpeg)
*
* @param type The MIME type
*/
protected void setContentType( String type )
{
this.contentType = type;
}
/**
* Sets this object's file name. This should include any path information.
* ex. /home/loser/images/you.jpg; c:\My Documents\My Pictures\you.gif
*
* @param name The file name
*/
protected void setFilename( String name )
{
this.filename = name;
}
/**
* Sets this object's binary content
*
* @param content An array of bytes
*/
protected void setBinaryContent( byte[] content )
{
this.binary = content;
}
/**
* @return The MIME type of this DataSource object
*/
public String getContentType()
{
return this.contentType;
}
/**
* @return The full file name including any path information
*/
public String getFilename()
{
return this.filename;
}
/**
* @return The object's name minus the path information or <code>null</code> if <code>getFilename()</code>
* returns <code>null</code>
*/
public String getName()
{
String name = this.filename;
if( null != name )
{
char separator = '/';
int indx = name.indexOf( separator ); // try unix first
if( -1 == indx )
{
separator = '\\'; // try Windows next
indx = name.indexOf( separator );
}
if( -1 != indx )
name = name.substring( name.lastIndexOf( separator ) + 1 );
}
return name;
}
/**
* @return The binary content of <code>this</code> MIME object
*/
public byte[] getBinaryContent()
{
return this.binary;
}
}
--- NEW FILE: MultiPartRequest.java ---
/*
* MultiPartRequest.java
*
* Created on February 27, 2002, 3:23 PM
*/
package net.sourceforge.idrs.core.servlet;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.*;
import java.io.ByteArrayOutputStream;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.*;
import java.security.*;
/********************************************************************************/
/**
<OWNER>Dane Foster</OWNER>
<ORGANIZATION>Equity Technology Group, Inc.</ORGANIZATION>
<YEAR>2001</YEAR>
Copyright (c) 2001, Equity Technology Group, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following
disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of
ETG or Dane Foster nor the names of its contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**/
/**
* Parses the ServletInputStream of encoding multipart/form-data and separates it into name value pairs.
* The name-value pairs are stored in the <code>map</code> argument. There are a couple of things to be aware of.
* This class is not a replacement for the <code>javax.servlet.ServletRequest</code> interface but augments it. It
* should only be used in cases where the client is POSTing multipart/form-data encoded data. This class will NOT
* work under any other conditions.
*
* <p>
* This class breaks the data into 4 groups of objects:<br>
* 1 - Strings<br>
* 2 - Arrays of Strings (String[])<br>
* 3 - DataSource objects<br>
* 4 - Arrays of DataSource objects (DataSource[])</p>
*
* <p>
* A String object is returned for text fields, text-areas, etc.<br>
* A String[] is returned for lists and check-boxes and etc.<br>
* A DataSource object is returned for binary data specified by <input type="file"><br>
* A DataSource[] is returned for file fields which allow multiple selections.<br>
* Just a note: I haven't found a browser yet that allows the multiple selection of filez but RFC 2388 and the W3C
* HTML 4.01 describes the format for this type of functionality so I've put it here.
*
* Usage senarios:<p>
* Naturally I'm assuming you (you the programmer that's using this class) already know the layout of the HTML
* form(s) that your serlvet(s) may be processing, therefore it's your responsiblity to avoid
* <code>NullPointerException</code>s that may be caused by trying to access a field that does not exist in the HTML
* form. Additionally, watch out for <code>ClassCastException</code>s that may be caused if you misjudge the type
* of data that form field contains.</p>
*
* <pre>
* // Get access to an image that the client uploaded to the servlet.
* DataSource uploadedFile = (DataSource)map.get( "fieldname" );
* byte[] binaryData = uploadedFile.getBinaryContent();
* String contentType = uploadedFile.getContentType();
* String fullFilename = uploadedFile.getFilename();// includes path info (i.e. /home/loser/images/smile.jpg)
* String filename = uploadedFile.getName();// excludes path info (i.e. smile.jpg)
* </pre>
*
* <pre>
* // Access list data (i.e. checkboxes, multiple selection lists)
* String[] typesOfMusic = (String[])map.get( "musicCheckBoxes" );
* </pre>
*
* This is equivalent to the <code>javax.servlet.ServletRequest</code>'s
* <code>public String[] getParameterValues( java.lang.String )</code> method.
*
* @param request A <code>ServletRequest</code> object.
* @param map The <code>Map</code> will be populated with the name value pairs of the HTML/XHTML form's
* content.
*/
public final class MultiPartRequest implements javax.servlet.http.HttpServletRequest {
private final static short UNDEF = -1;
private final static short READY = 0;
private final static short FILENAME = 1;
private final static short NAME = 2;
private final static short BINARY = 3;
private final static short TXTDATA = 4;
private final static short CONTENT_TYPE = 5;
private final static String CRLF = "\r\n";
private HashMap params;
private HttpServletRequest request;
/** Creates new MultiPartRequest */
public MultiPartRequest(HttpServletRequest request) throws Exception {
this.request = request;
this.params = new HashMap();
read(request,params);
}
private void read( ServletRequest request, Map map ) throws IOException
{
String filename = null;
String fieldName = null;
String contentType = null;
StringBuffer fieldValue = null;
//Get the separator for the form data.
int pos = request.getContentType().indexOf( '=' );
String boundary = "--" + request.getContentType().substring( pos + 1 ).trim();
ByteArrayOutputStream binarybuffer = new ByteArrayOutputStream();
byte[] bytes = new byte[ 1024 ];
ServletInputStream sStream = request.getInputStream();
int eof = sStream.readLine( bytes, 0, bytes.length );
short state = UNDEF;
while( -1 != eof )
{
String filter = new String( bytes, 0, eof );
String caseInsensitiveFilter = filter.toLowerCase();
if( filter.startsWith( boundary ) )
{
state = READY;
if( null != fieldName )
{
if( null != fieldValue )
{
Object o = map.get( fieldName ); // Find out if the field name already exists.
Object val = fieldValue.substring( 0, fieldValue.length() - 2 ); // Strip the CRLF
if( null != o ) // The field name already existed so assume we are dealing w/ a _list_ of values
{
if( o.getClass().isArray() )
{
int length = ((Object[])o).length;
String[] array = new String[ length + 1 ];
System.arraycopy( o, 0, array, 0, length );
array[ length ] = (String)val;
val = array;
array = null;
}
else
val = new String[]{(String)o, (String)val};
}
map.put( fieldName, val );
}
else if( binarybuffer.size() > 0 )
{
byte[] bin = binarybuffer.toByteArray();
byte[] copy = new byte[ bin.length - 2 ]; //strip CRLF
System.arraycopy( bin, 0, copy, 0, copy.length );
map.put( fieldName, new DataSource( contentType, filename, copy ) );
bin = copy = null;
}
fieldName = filename = contentType = null;
fieldValue = null;
binarybuffer.reset();
}
}
else if( caseInsensitiveFilter.startsWith( "content-disposition: form-data" ) && READY == state )
{
for( StringTokenizer tokenizer = new StringTokenizer( filter, ";=\"" ); tokenizer.hasMoreTokens(); )
{
String token = tokenizer.nextToken().trim();
if( token.startsWith( "name" ) )
{
fieldName = tokenizer.nextToken();
state = NAME;
}
else if( token.startsWith( "filename" ) )
{
state = FILENAME;
filename = tokenizer.nextToken();
}
}
}
else if( caseInsensitiveFilter.startsWith( "content-type: multipart/mixed" ) && NAME == state )
{
String subpartBoundary = "--" + filter.substring( filter.indexOf( '=' ) + 1 ).trim();
Object[] filez = handleSubpart( sStream, subpartBoundary );
map.put( fieldName, filez );
fieldName = null;
fieldValue = null;
filename = null;
contentType = null;
binarybuffer.reset();
state = UNDEF;
}
else if( caseInsensitiveFilter.startsWith( "content-type: " ) && FILENAME == state )
contentType = filter.substring( 14, filter.length() - 2 );// strip CRLF
else if( filter.equals( CRLF ) && state == FILENAME )
state = BINARY;
else if( filter.equals( CRLF ) && state == NAME )
state = TXTDATA;
else if( state == TXTDATA )
fieldValue = fieldValue == null ? new StringBuffer( filter ) : fieldValue.append( filter );
else if( state == BINARY )
binarybuffer.write( bytes, 0, eof );
eof = sStream.readLine( bytes, 0, bytes.length );
}// Parsing stops here. The Map should now contain all of the form's data.
sStream.close();
}
/**
* A state-machine similar to the read method except it only handles parsing mulipart/mixed encoded data
*
* @param inStream The ServletInputStream that it will get data from
* @param boundary The component boundary
*
* @return An array of DataSource objects containing the list of filez the user sent.
*/
private DataSource[] handleSubpart( ServletInputStream inStream, String startboundary ) throws IOException
{
String contentType = null;
String filename = null;
DataSource[] filez = null;
String endboundary = startboundary + "--";
byte[] binbucket = new byte[ 1024 ];
ByteArrayOutputStream binbuffer = new ByteArrayOutputStream();
short state = UNDEF;
int eof = inStream.readLine( binbucket, 0, binbucket.length );
while( -1 != eof )
{
String filter = new String( binbucket, 0, eof );
String lowercaseFilter = filter.toLowerCase();
if( filter.startsWith( startboundary ) )
{
state = READY;
if( binbuffer.size() > 0 )
{
byte[] bin = binbuffer.toByteArray();
byte[] bincopy = new byte[ bin.length - 2 ];// strip CRLF
System.arraycopy( bin, 0, bincopy, 0, bincopy.length );
if( null == filez )
filez = new DataSource[]{new DataSource( contentType, filename, bincopy )};
else
{
DataSource[] copy = new DataSource[ filez.length + 1 ];
System.arraycopy( filez, 0, copy, 0, filez.length );
copy[ filez.length ] = new DataSource( contentType, filename, bincopy );
filez = copy;
copy = null;
}
bin = bincopy = null;
binbuffer.reset();
}
if( filter.trim().equals( endboundary ) )
break;
}
else if( lowercaseFilter.startsWith( "content-disposition: " ) && READY == state )
{
int indx = filter.indexOf( "filename=" );
filename = filter.substring( indx + 10, filter.length() - 3 );// strip CRLF && the closing "
state = FILENAME;
}
else if( lowercaseFilter.startsWith( "content-type: " ) && FILENAME == state )
{
contentType = filter.substring( 14, filter.length() - 2 );
state = CONTENT_TYPE;
}
else if( filter.equals( CRLF ) && CONTENT_TYPE == state )
state = BINARY;
else if( BINARY == state )
binbuffer.write( binbucket, 0, eof );
eof = inStream.readLine( binbucket, 0, binbucket.length );
}
return filez;
}
public java.lang.Object getAttribute(java.lang.String str) {
return request.getAttribute(str);
}
public java.util.Enumeration getAttributeNames() {
return request.getAttributeNames();
}
public java.lang.String getCharacterEncoding() {
return this.request.getCharacterEncoding();
}
public int getContentLength() {
return request.getContentLength();
}
public java.lang.String getContentType() {
return request.getContentType();
}
public javax.servlet.ServletInputStream getInputStream() throws java.io.IOException {
return request.getInputStream();
}
public java.util.Locale getLocale() {
return this.request.getLocale();
}
public java.util.Enumeration getLocales() {
return this.request.getLocales();
}
public java.lang.String getParameter(java.lang.String str) {
Object val = params.get(str);
String sval;
if (val instanceof String[]) {
sval = ((String[])val)[0];
}
else if (val instanceof String) {
sval = (String) val;
}
else if (val instanceof DataSource[]) {
sval = ((DataSource[]) val)[0].getFilename();
}
else {
sval = ((DataSource) val).getFilename();
}
return sval;
}
public java.util.Enumeration getParameterNames() {
return new IteratorEnumeration(this.params.keySet().iterator());
}
public java.lang.String[] getParameterValues(java.lang.String str) {
Object val = params.get(str);
if (val instanceof String[]) {
return (String[])val;
}
else if (val instanceof String) {
String s = (String) val;
String ss[] = {(String) val};
return ss;
}
else {
return null;
}
}
public java.lang.String getProtocol() {
return request.getProtocol();
}
public java.io.BufferedReader getReader() throws java.io.IOException {
return request.getReader();
}
public java.lang.String getRealPath(java.lang.String str) {
return request.getRealPath(str);
}
public java.lang.String getRemoteAddr() {
return request.getRemoteAddr();
}
public java.lang.String getRemoteHost() {
return request.getRemoteHost();
}
public javax.servlet.RequestDispatcher getRequestDispatcher(java.lang.String str) {
return this.request.getRequestDispatcher(str);
}
public java.lang.String getScheme() {
return request.getScheme();
}
public java.lang.String getServerName() {
return request.getServerName();
}
public int getServerPort() {
return request.getServerPort();
}
public boolean isSecure() {
return request.isRequestedSessionIdFromCookie();
}
public void removeAttribute(java.lang.String str) {
request.removeAttribute(str);
}
public void setAttribute(java.lang.String str, java.lang.Object obj) {
request.setAttribute(str,obj);
}
public java.lang.String getAuthType() {
return request.getAuthType();
}
public java.lang.String getContextPath() {
return request.getContextPath();
}
public javax.servlet.http.Cookie[] getCookies() {
return request.getCookies();
}
public long getDateHeader(java.lang.String str) {
return request.getDateHeader(str);
}
public java.lang.String getHeader(java.lang.String str) {
return request.getHeader(str);
}
public java.util.Enumeration getHeaderNames() {
return request.getHeaderNames();
}
public java.util.Enumeration getHeaders(java.lang.String str) {
return request.getHeaders(str);
}
public int getIntHeader(java.lang.String str) {
return request.getIntHeader(str);
}
public java.lang.String getMethod() {
return request.getMethod();
}
public java.lang.String getPathInfo() {
return request.getPathInfo();
}
public java.lang.String getPathTranslated() {
return request.getPathTranslated();
}
public java.lang.String getQueryString() {
return request.getQueryString();
}
public java.lang.String getRemoteUser() {
return request.getRemoteUser();
}
public java.lang.String getRequestURI() {
return request.getRequestURI();
}
public java.lang.String getRequestedSessionId() {
return request.getRequestedSessionId();
}
public java.lang.String getServletPath() {
return request.getServletPath();
}
public javax.servlet.http.HttpSession getSession() {
return request.getSession();
}
public javax.servlet.http.HttpSession getSession(boolean param) {
return request.getSession(param);
}
public java.security.Principal getUserPrincipal() {
return request.getUserPrincipal();
}
public boolean isRequestedSessionIdFromCookie() {
return request.isRequestedSessionIdFromCookie();
}
public boolean isRequestedSessionIdFromURL() {
return request.isRequestedSessionIdFromURL();
}
public boolean isRequestedSessionIdFromUrl() {
return request.isRequestedSessionIdFromUrl();
}
public boolean isRequestedSessionIdValid() {
return request.isRequestedSessionIdValid();
}
public boolean isUserInRole(java.lang.String str) {
return request.isUserInRole(str);
}
public void saveFile(String key,String path) throws Exception {
DataSource ds;
if (params.get(key) instanceof DataSource[]) {
ds = ((DataSource[]) params.get(key))[0];
}
else if (params.get(key) instanceof DataSource) {
ds = ((DataSource) params.get(key));
}
else {
throw new IllegalArgumentException(key + " is not a file");
}
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(path)));
out.write(ds.getBinaryContent()) ;
out.close();
}
public int numFiles(String key) throws Exception {
Object val = params.get(key);
DataSource[] ds;
if (val instanceof DataSource[]) {
ds = (DataSource[]) val;
return ds.length;
}
else {
throw new IllegalArgumentException(key + " is not a list of files");
}
}
public void saveFile(String key,int i,String path) throws Exception {
DataSource ds;
if (params.get(key) instanceof DataSource[]) {
ds = ((DataSource[]) params.get(key))[i];
}
else if (params.get(key) instanceof DataSource) {
throw new IllegalArgumentException(key + " is not a list of files");
}
else {
throw new IllegalArgumentException(key + " is not a file");
}
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(path)));
out.write(ds.getBinaryContent());
out.close();
}
public void setCharacterEncoding(String val) throws java.io.UnsupportedEncodingException {
request.setCharacterEncoding(val);
}
public Map getParameterMap() {
return params;
}
public StringBuffer getRequestURL() {
return request.getRequestURL();
}
}
Index: DocInfo.class
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/DocInfo.class,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
Binary files /tmp/cvsy4dMeZ and /tmp/cvseaDulO differ
Index: IDRSSecurity.class
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/IDRSSecurity.class,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
Binary files /tmp/cvsuZSLp0 and /tmp/cvseg92HQ differ
Index: IDRSServlet.class
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/IDRSServlet.class,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
Binary files /tmp/cvsaW0lV1 and /tmp/cvs4wtJxT differ
Index: IDRSServlet.java
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/IDRSServlet.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** IDRSServlet.java 23 Jan 2002 21:33:52 -0000 1.8
--- IDRSServlet.java 27 Feb 2002 23:56:31 -0000 1.9
***************
*** 50,53 ****
--- 50,55 ----
public IDRSServlet() {
}
+
+
/*
***************
*** 150,156 ****
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException {
! preProc(req, resp);
}
--- 152,192 ----
}
+ /**
+ *Determines if request is simple, or needs to be parsed
+ *Taken from Jakarta Turbine
+ */
+ private boolean isSimpleForm(HttpServletRequest req)
+ {
+ String header = req.getHeader("Content-Type");
+ if( header != null && header.indexOf("multipart/form-data") >= 0)
+ return false;
+ return true;
+ }
+
+
+
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException {
! HttpServletRequest request=null;
!
! if (isSimpleForm(req)) {
! request = req;
! }
! else {
! try {
! request = new MultiPartRequest(req);
! }
! catch (Exception e) {
! try {
! System.out.println("Error in parsing multi/part request");
! e.printStackTrace(System.out);
! }
! catch (Exception ee) {}
! }
! }
!
! if (request == null) request = req;
!
! preProc(request, resp);
}
***************
*** 162,166 ****
@param sysCon The System Connection used by the system
*/
!
/*
ERRORS: Conn doesn't exist, System maxed out
--- 198,202 ----
@param sysCon The System Connection used by the system
*/
!
/*
ERRORS: Conn doesn't exist, System maxed out
***************
*** 417,420 ****
--- 453,458 ----
docName = rap.getParameter("doc_Name");
}
+
+
//initialize some information about the report
Index: Init.class
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/Init.class,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
Binary files /tmp/cvsFrZv93 and /tmp/cvsEeB06X differ
Index: ReportStore.class
===================================================================
RCS file: /cvsroot/idrs/Idrs/dev/src/net/sourceforge/idrs/core/servlet/ReportStore.class,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
Binary files /tmp/cvscK4Xw5 and /tmp/cvsO4Z0W0 differ
|