remm 01/09/24 01:19:30
Modified: . build.xml
src/doc changelog.xml
Added: src/stores/slidestore/file XAFileContentStore.java
Log:
- Add welcome web application, based on the new Slide tag library.
Revision Changes Path
1.124 +21 -0 jakarta-slide/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-slide/build.xml,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- build.xml 2001/09/24 01:56:37 1.123
+++ build.xml 2001/09/24 08:19:30 1.124
@@ -1254,6 +1254,27 @@
<delete file="${slide.dist}/server/server/lib/crimson.jar" />
<delete file="${slide.dist}/server/server/lib/jaxp.jar" />
+ <!-- Welcome web application -->
+ <war warfile="${slide.dist}/server/webapps/ROOT.war"
+ webxml="src/wrappers/catalina/root/WEB-INF/web.xml"
+ basedir="src/wrappers/catalina/root">
+ <zipfileset dir="${struts.home}/lib" prefix="WEB-INF">
+ <include name="struts-bean.tld"/>
+ <include name="struts-html.tld"/>
+ <include name="struts-logic.tld"/>
+ </zipfileset>
+ <zipfileset dir="src/taglib" prefix="WEB-INF">
+ <include name="slide-struts.tld"/>
+ </zipfileset>
+ <zipfileset dir="${slide.dist}/slide/lib" prefix="WEB-INF/lib">
+ <include name="slide-taglib-struts.jar"/>
+ <include name="slide-taglib-common.jar"/>
+ </zipfileset>
+ <zipfileset dir="${struts.home}/lib" prefix="WEB-INF/lib">
+ <include name="struts.jar"/>
+ </zipfileset>
+ </war>
+
<!-- Catalina HTML manager -->
<war warfile="${slide.dist}/server/webapps/manager.war"
webxml="src/wrappers/catalina/manager.xml">
1.60 +4 -0 jakarta-slide/src/doc/changelog.xml
Index: changelog.xml
===================================================================
RCS file: /home/cvs/jakarta-slide/src/doc/changelog.xml,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- changelog.xml 2001/09/24 01:46:08 1.59
+++ changelog.xml 2001/09/24 08:19:30 1.60
@@ -92,6 +92,10 @@
Update the standalone server to include the administration web
application (RM)
</update>
+ <add>
+ Add a welcome web application to the standalone server, which will
+ help first time users get started (RM)
+ </add>
</changelog>
</p>
1.1 jakarta-slide/src/stores/slidestore/file/XAFileContentStore.java
Index: XAFileContentStore.java
===================================================================
/*
* $Header:
/home/cvs/jakarta-slide/src/stores/slidestore/file/XAFileContentStore.java,v 1.1
2001/09/24 08:19:30 remm Exp $
* $Revision: 1.1 $
* $Date: 2001/09/24 08:19:30 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package slidestore.file;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Date;
import java.util.Vector;
import java.io.*;
import javax.transaction.xa.XAException;
import javax.transaction.xa.Xid;
import org.apache.slide.common.*;
import org.apache.slide.store.*;
import org.apache.slide.structure.*;
import org.apache.slide.content.*;
import org.apache.slide.util.logger.Logger;
import slidestore.reference.fileDeleter.DeleterWalker;
/**
* Transactional filesystem implementation of ContentStore.
*
* @author Remy Maucherat
* @version $Revision: 1.1 $
*/
public class XAFileContentStore extends AbstractSimpleService
implements ContentStore {
// -------------------------------------------------------------- Constants
public static final int BUFFER_SIZE = 2048;
public static final String CHARACTER_ENCODING = "8859_1";
/**
* Default rootpath is the current directory
*/
private static final String DEFAULT_ROOTPATH = ".";
private static final String filter[] = new String[1];
static {
filter[0] = "*.*";
}
// ----------------------------------------------------- Instance Variables
/**
* Path from which files are stored.
*/
private String rootpath;
/**
* Temporary path used to store the original files when they are modified.
*/
private String temppath;
/**
* True if versioning.
*/
private boolean version = true;
/**
* True if a transaction is currently active.
*/
private boolean transactionActive = false;
/**
* True if content written from a prior server run should be removed.
* WARNING: setting this option to true will remove all files, located
* under the RootPath location!
*/
private boolean removePriorContent = false;
/**
* List of resources created during the transaction.
*/
private Vector createdResources = new Vector();
/**
* List of deleted directories.
*/
private Vector deletedDirectories = new Vector();
// ----------------------------------------------------- XAResource Mathods
public void commit(Xid xid, boolean onePhase)
throws XAException {
super.commit(xid, onePhase);
// Commit
createdResources.clear();
remove(new File(temppath));
transactionActive = false;
}
public void rollback(Xid xid)
throws XAException {
super.rollback(xid);
// Rollback
Enumeration createdResourcesList = createdResources.elements();
while (createdResourcesList.hasMoreElements()) {
File resource = (File) createdResourcesList.nextElement();
remove(resource);
}
Enumeration deletedDirectoriesList = deletedDirectories.elements();
createdResources.clear();
deletedDirectories.clear();
remove(new File(temppath));
transactionActive = false;
}
public void start(Xid xid, int flags)
throws XAException {
super.start(xid, flags);
transactionActive = true;
}
// ---------------------------------------------------- ServiceImpl Methods
/**
* Read parameters.
*
* @param parameters Hashtable containing the parameters' name
* and associated value
*/
public synchronized void setParameters(Hashtable parameters)
throws ServiceParameterErrorException,
ServiceParameterMissingException {
// A parameter will tell were serialization files are.
rootpath = (String) parameters.get("rootpath");
if (rootpath == null) {
// Default is that files are stored starting in the
// current directory
rootpath = DEFAULT_ROOTPATH;
}
String versionValue = (String) parameters.get("version");
if (versionValue != null) {
version = Boolean.valueOf(versionValue).booleanValue();
}
String removePriorContentValue =
(String) parameters.get("resetBeforeStarting");
if (removePriorContentValue != null) {
removePriorContent =
removePriorContentValue.equalsIgnoreCase("true");
}
}
/**
* Initializes content store.
*
* @exception ServiceInitializationFailedException Throws an exception
* if the store has already been initialized before
*/
public synchronized void initialize(NamespaceAccessToken token)
throws ServiceInitializationFailedException {
try {
// remove prior content specified at rootPath
if ((removePriorContent) && (!DEFAULT_ROOTPATH.equals(rootpath)))
reset();
File baseDir = new File(rootpath);
token.getLogger().log("FileContentStore rootpath: "
+ baseDir.getAbsolutePath(), Logger.INFO);
baseDir.mkdirs();
} catch (Exception e) {
e.printStackTrace();
throw new ServiceInitializationFailedException(this, e);
}
}
/**
* Deletes content store.
*
* @exception ServiceResetFailedException
*/
public void reset()
throws ServiceResetFailedException {
new DeleterWalker(rootpath, filter);
}
/**
* This function tells whether or not the service is connected.
*
* @return boolean true if we are connected
* @exception ServiceAccessException Service access error
*/
public boolean isConnected()
throws ServiceAccessException {
return true;
}
/**
* Connects to the underlying data source (if any is needed).
*
* @exception ServiceConnectionFailedException Connection failed
*/
public void connect()
throws ServiceConnectionFailedException {
}
/**
* Disconnects from the underlying data source.
*
* @exception ServiceDisconnectionFailedException Disconnection failed
*/
public void disconnect()
throws ServiceDisconnectionFailedException {
}
// --------------------------------------------------- ContentStore Methods
/**
* Retrive revision content.
*
* @param uri Uri
* @param revisionNumber Node revision number
*/
public NodeRevisionContent retrieveRevisionContent
(Uri uri, NodeRevisionDescriptor revisionDescriptor)
throws ServiceAccessException, RevisionNotFoundException {
NodeRevisionContent result = null;
String revisionUri = null;
if (version)
revisionUri = uri.toString() + "_"
+ revisionDescriptor.getRevisionNumber();
else
revisionUri = uri.toString();
try {
File file = new File(rootpath + revisionUri);
FileInputStream is = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader
(is, CHARACTER_ENCODING);
result = new NodeRevisionContent();
result.setContent(reader);
result.setContent(is);
} catch (FileNotFoundException e) {
throw new RevisionNotFoundException
(uri.toString(),
revisionDescriptor.getRevisionNumber());
} catch (IOException e) {
e.printStackTrace();
throw new ServiceAccessException(this, e.getMessage());
}
return result;
}
/**
* Create a new revision
*
* @param uri Uri
* @param revisionDescriptor Node revision descriptor
* @param revisionContent Node revision content
*/
public void createRevisionContent
(Uri uri, NodeRevisionDescriptor revisionDescriptor,
NodeRevisionContent revisionContent)
throws ServiceAccessException, RevisionAlreadyExistException {
String revisionUri = null;
if (version)
revisionUri = uri.toString() + "_"
+ revisionDescriptor.getRevisionNumber();
else
revisionUri = uri.toString();
try {
File file = new File(rootpath + revisionUri);
File parentFile = new File(file.getParent());
if ((parentFile != null) && (!parentFile.exists())) {
parentFile.mkdirs();
}
boolean created = !file.exists();
if (!created) {
throw new RevisionAlreadyExistException
(uri.toString(), revisionDescriptor.getRevisionNumber());
}
InputStream is = revisionContent.streamContent();
if (is != null) {
OutputStream os = new FileOutputStream(file);
// We copy 8 ko with each read
byte[] buffer = new byte[BUFFER_SIZE];
long position = 0;
long contentLength = revisionDescriptor.getContentLength();
while (true) {
int nChar = is.read(buffer);
if (nChar == -1) {
break;
}
os.write(buffer, 0, nChar);
position = position + nChar;
}
os.close();
is.close();
if (contentLength != -1) {
if (position != contentLength) {
// set content length so that repository is consistent
revisionDescriptor.setContentLength(position);
if (position < contentLength) {
// Not enough bytes read !!!
throw new IOException("Not enough bytes read");
}
if (position > contentLength) {
// Not enough bytes read !!!
throw new IOException("Too many bytes read");
}
// FIXME : Delete the file
}
} else {
revisionDescriptor.setContentLength(position);
}
} else {
}
} catch (IOException e) {
throw new ServiceAccessException(this, e.getMessage());
} catch(RevisionAlreadyExistException e) {
throw e; // we do NOT want this caught by next clause.
} catch (Exception e) {
e.printStackTrace();
throw new ServiceAccessException(this, e.getMessage());
}
}
/**
* Modify the latest revision of an object.
*
* @param uri Uri
* @param revisionDescriptor Node revision descriptor
* @param revisionContent Node revision content
*/
public void storeRevisionContent
(Uri uri, NodeRevisionDescriptor revisionDescriptor,
NodeRevisionContent revisionContent)
throws ServiceAccessException, RevisionNotFoundException {
String revisionUri = null;
if (version) {
revisionUri = uri.toString() + "_"
+ revisionDescriptor.getRevisionNumber();
} else {
revisionUri = uri.toString();
}
try {
File file = new File(rootpath + revisionUri);
InputStream is = revisionContent.streamContent();
if (is != null) {
OutputStream os = null;
try {
os = new FileOutputStream(file);
} catch (FileNotFoundException ex) {
// Try to create the parent directory and try again
File parentFile = new File(file.getParent());
if ((parentFile != null) && (!parentFile.exists())) {
parentFile.mkdirs();
}
os = new FileOutputStream(file);
}
// We copy 8 ko with each read
byte[] buffer = new byte[BUFFER_SIZE];
long position = 0;
long contentLength = revisionDescriptor.getContentLength();
while (true) {
int nChar = is.read(buffer);
if (nChar == -1) {
break;
}
os.write(buffer, 0, nChar);
position = position + nChar;
}
os.close();
is.close();
if (contentLength != -1) {
if (position != contentLength) {
if (position < contentLength) {
// Not enough bytes read !!!
throw new IOException("Not enough bytes read");
}
if (position > contentLength) {
// Not enough bytes read !!!
throw new IOException("Too many bytes read");
}
// FIXME : Delete the file
}
} else {
revisionDescriptor.setContentLength(position);
}
} else {
}
} catch (FileNotFoundException e) {
throw new RevisionNotFoundException
(uri.toString(), revisionDescriptor.getRevisionNumber());
} catch (IOException e) {
e.printStackTrace();
throw new ServiceAccessException(this, e.getMessage());
}
}
/**
* Remove revision.
*
* @param uri Uri
* @param revisionNumber Node revision number
*/
public void removeRevisionContent
(Uri uri, NodeRevisionDescriptor revisionDescriptor)
throws ServiceAccessException {
String revisionUri = null;
if (version) {
revisionUri = uri.toString() + "_"
+ revisionDescriptor.getRevisionNumber();
} else {
revisionUri = uri.toString();
}
try {
File file = new File(rootpath + revisionUri);
boolean deleted = file.delete();
File parentFile = new File(file.getParent());
if (parentFile != null) {
parentFile.delete();
}
} catch (Exception e) {
e.printStackTrace();
throw new ServiceAccessException(this, e.getMessage());
}
}
// ------------------------------------------------------ Protected Methods
/**
* Remove the specified file or directory and all of its contents.
*
* @param toRemove Directory or file to be removed
* @return false if failed
*/
protected boolean remove(File toRemove) {
boolean result = true;
if (toRemove.isDirectory()) {
String list[] = toRemove.list();
for (int i = 0; i < list.length; i++) {
File file = new File(toRemove, list[i]);
if (file.isDirectory()) {
result = remove(file);
} else {
if (!file.delete())
result = false;
}
}
}
if (!toRemove.delete())
result = false;
return result;
}
}