blob: c7bf45de92fbad1ffc07952d5ecbba792124a1e8 [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.server.io;
import org.apache.log4j.Logger;
import org.apache.jackrabbit.util.Text;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavResourceIterator;
import javax.jcr.Item;
import javax.jcr.Repository;
import javax.jcr.NodeIterator;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.Date;
/**
* <code>DirListingExportHandler</code> represents a simple export for collections:
* a human-readable view listing the members.<br>
* Note: If {@link #exportContent(ExportContext, boolean)} is called the view list
* child nodes only, without respecting their representation as <code>DavResource</code>s.
*/
public class DirListingExportHandler implements IOHandler {
private static Logger log = Logger.getLogger(DirListingExportHandler.class);
private IOManager ioManager;
/**
* Creates a new <code>DirListingExportHandler</code>
*
* @param ioManager
*/
public DirListingExportHandler(IOManager ioManager) {
this.ioManager = ioManager;
}
/**
* Always returns false
*
* @see IOHandler#canImport(ImportContext, boolean)
*/
public boolean canImport(ImportContext context, boolean isFolder) {
return false;
}
/**
* Always returns false
*
* @see IOHandler#canImport(ImportContext, DavResource)
*/
public boolean canImport(ImportContext context, DavResource resource) {
return false;
}
/**
* Does nothing and returns false
*
* @see IOHandler#importContent(ImportContext, boolean)
*/
public boolean importContent(ImportContext context, boolean isCollection) throws IOException {
// can only handle export
return false;
}
/**
* Does nothing and returns false
*
* @see IOHandler#importContent(ImportContext, DavResource)
*/
public boolean importContent(ImportContext context, DavResource resource) throws IOException {
return false;
}
/**
* @return true if the specified context is still valid and provides a
* export root and if 'isCollection' is true. False otherwise
* @see IOHandler#canExport(ExportContext, boolean)
*/
public boolean canExport(ExportContext context, boolean isCollection) {
if (context == null || context.isCompleted()) {
return false;
}
return isCollection && context.getExportRoot() != null;
}
/**
* @return true if the specified context is still valid and provides a
* export root and if the specified resource is a collection. False otherwise.
* @see IOHandler#canExport(ExportContext, DavResource)
* @see DavResource#isCollection()
*/
public boolean canExport(ExportContext context, DavResource resource) {
if (resource == null) {
return false;
}
return canExport(context, resource.isCollection());
}
/**
* @see IOHandler#exportContent(ExportContext, boolean)
*/
public boolean exportContent(ExportContext context, boolean isCollection) throws IOException {
if (!canExport(context, isCollection)) {
throw new IOException(getName() + ": Cannot export " + context.getExportRoot());
}
// properties (contentlength undefined)
context.setModificationTime(new Date().getTime());
context.setContentType("text/html", "UTF-8");
context.setETag("");
// data
if (context.hasStream()) {
PrintWriter writer = new PrintWriter(new OutputStreamWriter(context.getOutputStream(), "utf8"));
try {
Item item = context.getExportRoot();
Repository rep = item.getSession().getRepository();
String repName = rep.getDescriptor(Repository.REP_NAME_DESC);
String repURL = rep.getDescriptor(Repository.REP_VENDOR_URL_DESC);
String repVersion = rep.getDescriptor(Repository.REP_VERSION_DESC);
writer.print("<html><head><title>");
writer.print(repName);
writer.print(" ");
writer.print(repVersion);
writer.print(" ");
writer.print(item.getPath());
writer.print("</title></head>");
writer.print("<body><h2>");
writer.print(item.getPath());
writer.print("</h2><ul>");
writer.print("<li><a href=\"..\">..</a></li>");
if (item.isNode()) {
NodeIterator iter = ((Node)item).getNodes();
while (iter.hasNext()) {
Node child = iter.nextNode();
String label = Text.getName(child.getPath());
writer.print("<li><a href=\"");
writer.print(Text.escape(label));
if (child.isNode()) {
writer.print("/");
}
writer.print("\">");
writer.print(label);
writer.print("</a></li>");
}
}
writer.print("</ul><hr size=\"1\"><em>Powered by <a href=\"");
writer.print(repURL);
writer.print("\">");
writer.print(repName);
writer.print("</a> version ");
writer.print(repVersion);
writer.print("</em></body></html>");
} catch (RepositoryException e) {
// should not occur
log.debug(e.getMessage());
}
writer.close();
}
return true;
}
/**
* @see IOHandler#exportContent(ExportContext, DavResource)
*/
public boolean exportContent(ExportContext context, DavResource resource) throws IOException {
if (!canExport(context, resource)) {
throw new IOException(getName() + ": Cannot export " + context.getExportRoot());
}
// properties (contentlength undefined)
context.setModificationTime(new Date().getTime());
context.setContentType("text/html", "UTF-8");
context.setETag("");
// data
if (context.hasStream()) {
PrintWriter writer = new PrintWriter(new OutputStreamWriter(context.getOutputStream(), "utf8"));
try {
Item item = context.getExportRoot();
Repository rep = item.getSession().getRepository();
String repName = rep.getDescriptor(Repository.REP_NAME_DESC);
String repURL = rep.getDescriptor(Repository.REP_VENDOR_URL_DESC);
String repVersion = rep.getDescriptor(Repository.REP_VERSION_DESC);
writer.print("<html><head><title>");
writer.print(repName);
writer.print(" ");
writer.print(repVersion);
writer.print(" ");
writer.print(resource.getResourcePath());
writer.print("</title></head>");
writer.print("<body><h2>");
writer.print(resource.getResourcePath());
writer.print("</h2><ul>");
writer.print("<li><a href=\"..\">..</a></li>");
DavResourceIterator iter = resource.getMembers();
while (iter.hasNext()) {
DavResource child = iter.nextResource();
String label = Text.getName(child.getResourcePath());
writer.print("<li><a href=\"");
writer.print(child.getHref());
writer.print("\">");
writer.print(label);
writer.print("</a></li>");
}
writer.print("</ul><hr size=\"1\"><em>Powered by <a href=\"");
writer.print(repURL);
writer.print("\">");
writer.print(repName);
writer.print("</a> version ");
writer.print(repVersion);
writer.print("</em></body></html>");
} catch (RepositoryException e) {
// should not occur
log.debug(e.getMessage());
}
writer.close();
}
return true;
}
/**
* @see IOHandler#getIOManager()
*/
public IOManager getIOManager() {
return ioManager;
}
/**
* @see IOHandler#getName()
*/
public String getName() {
return "DirListing Export";
}
}