250 lines
8.3 KiB
Java
Executable File
250 lines
8.3 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2001, 2002 Red Hat Inc. All Rights Reserved.
|
|
*
|
|
* The contents of this file are subject to the CCM Public
|
|
* License (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.redhat.com/licenses/ccmpl.html
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
package com.arsdigita.docmgr.ui;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.math.BigDecimal;
|
|
|
|
import org.apache.log4j.Category;
|
|
|
|
import com.arsdigita.bebop.ActionLink;
|
|
import com.arsdigita.bebop.page.BebopMapDispatcher;
|
|
import com.arsdigita.bebop.Label;
|
|
import com.arsdigita.bebop.Page;
|
|
import com.arsdigita.bebop.PageState;
|
|
import com.arsdigita.bebop.TabbedPane;
|
|
import com.arsdigita.bebop.event.ActionEvent;
|
|
import com.arsdigita.bebop.event.ActionListener;
|
|
import com.arsdigita.bebop.event.PrintEvent;
|
|
import com.arsdigita.bebop.event.PrintListener;
|
|
import com.arsdigita.dispatcher.DispatcherHelper;
|
|
import com.arsdigita.dispatcher.ObjectNotFoundException;
|
|
import com.arsdigita.dispatcher.RequestContext;
|
|
import com.arsdigita.docmgr.File;
|
|
import com.arsdigita.domain.DataObjectNotFoundException;
|
|
import com.arsdigita.web.Web;
|
|
|
|
/**
|
|
* Dispatcher for document manager application.
|
|
*
|
|
* @author <mailto href="StefanDeusch@computer.org">Stefan Deusch</a>
|
|
*/
|
|
|
|
public class DMDispatcher extends BebopMapDispatcher implements DMConstants {
|
|
|
|
private static Category s_log = Category.getInstance
|
|
(DMDispatcher.class.getName());
|
|
|
|
/**
|
|
* Default constructor instantiating the URL-page map.
|
|
*/
|
|
public DMDispatcher() {
|
|
addPage("", buildDMIndexPage(), true);
|
|
addPage("file", buildFileInfoPage());
|
|
}
|
|
|
|
/**
|
|
* Build index page for the document manager,
|
|
*/
|
|
|
|
private Page buildDMIndexPage() {
|
|
Page p = new DocmgrBasePage();
|
|
|
|
/**
|
|
* Create main administration tab.
|
|
*/
|
|
TabbedPane tb = new TabbedPane();
|
|
tb.setIdAttr("page-body");
|
|
|
|
//tb.addTab(WS_BROWSE_TITLE, new BrowsePane());
|
|
|
|
/*
|
|
* Disable Repositories tab because
|
|
* Still need to decide what to do with mounting
|
|
* repository, since repository are now application.
|
|
*
|
|
tb.addTab(WS_REPOSITORIES_TITLE, new RepositoryPane());
|
|
*/
|
|
|
|
p.add(new BrowsePane());
|
|
p.lock();
|
|
|
|
return p;
|
|
}
|
|
|
|
|
|
/**
|
|
* Build page for the administration of one file.
|
|
* * Implementation according to wireframes at
|
|
*/
|
|
|
|
private Page buildFileInfoPage() {
|
|
|
|
DocmgrBasePage p = new DocmgrBasePage() {
|
|
// need to override this to show the File name
|
|
protected void buildTitle() {
|
|
Label title = new Label();
|
|
title.addPrintListener(new PrintListener() {
|
|
public void prepare(PrintEvent e) {
|
|
PageState state = e.getPageState();
|
|
Label t = (Label) e.getTarget();
|
|
BigDecimal fid =
|
|
(BigDecimal) state.getValue(FILE_ID_PARAM);
|
|
if (fid!=null) {
|
|
t.setLabel
|
|
(DMUtils.getFile(fid).getName());
|
|
}
|
|
}
|
|
});
|
|
setTitle(title);
|
|
}
|
|
};
|
|
|
|
/* Temporary fix to sdm #204233, NavBar of Application allows only
|
|
one URL per application, so here we add a Link back to the parent folder
|
|
*/
|
|
Label backLinkLabel = GO_BACK_LABEL;
|
|
backLinkLabel.addPrintListener(new PrintListener() {
|
|
public void prepare(PrintEvent e) {
|
|
PageState state = e.getPageState();
|
|
|
|
Label t= (Label) e.getTarget();
|
|
String fixed = t.getLabel(e.getPageState());
|
|
String url = Web.getContext().getApplication().getTitle();
|
|
|
|
t.setLabel(fixed + " " + url);
|
|
}});
|
|
ActionLink backLink = new ActionLink(backLinkLabel);
|
|
backLink.addActionListener(new ActionListener() {
|
|
public void actionPerformed(ActionEvent e) {
|
|
PageState state = e.getPageState();
|
|
String url = Web.getContext().getApplication().getPath();
|
|
BigDecimal fid = (BigDecimal) state.getValue(FILE_ID_PARAM);
|
|
|
|
if (fid != null) {
|
|
url = url + "?d_id="+fid;
|
|
}
|
|
/*
|
|
BigDecimal pid = null;
|
|
BigDecimal fid = (BigDecimal) state.getValue(FILE_ID_PARAM);
|
|
if (fid!=null) {
|
|
pid = DMUtils.getFile(fid).getParentResource().getID();
|
|
}
|
|
*/
|
|
try {
|
|
DispatcherHelper.sendRedirect(state.getRequest(),
|
|
state.getResponse(),
|
|
url);
|
|
} catch (IOException iox) {
|
|
throw new RuntimeException("Redirect to Application failed"
|
|
+iox);
|
|
}
|
|
}});
|
|
backLink.setClassAttr("actionLink");
|
|
p.add(backLink);
|
|
|
|
// create main File-Info tabs
|
|
TabbedPane tb = new TabbedPane();
|
|
tb.setIdAttr("page-body");
|
|
|
|
tb.addTab(FILE_INFO_PROPERTIES_TITLE, new FileInfoPropertiesPane(p));
|
|
tb.addTab(FILE_INFO_HISTORY_TITLE, new FileInfoHistoryPane());
|
|
|
|
/*
|
|
* Disable Links tab because we have not
|
|
* decided how to link other KnItems to a document.
|
|
* 01/04/02 Stefan Deusch
|
|
*
|
|
tb.addTab(FILE_INFO_LINKS_TITLE, new FileInfoLinksPane());
|
|
*/
|
|
p.add(tb);
|
|
p.lock();
|
|
|
|
return p;
|
|
}
|
|
|
|
/**
|
|
* convenience wrapper method that allows to register a "" page
|
|
* for an index page, if the isIndex flag is try
|
|
*/
|
|
private void addPage(String url, Page p, boolean isIndex) {
|
|
if (isIndex) {
|
|
super.addPage("", p);
|
|
}
|
|
super.addPage(url, p);
|
|
}
|
|
|
|
public void dispatch(javax.servlet.http.HttpServletRequest req,
|
|
javax.servlet.http.HttpServletResponse resp,
|
|
RequestContext ctx)
|
|
throws IOException, javax.servlet.ServletException {
|
|
|
|
String url = req.getRequestURI();
|
|
|
|
int index = url.lastIndexOf("/download/");
|
|
|
|
if (index > 0) {
|
|
String str = req.getParameter(FILE_ID_PARAM.getName());
|
|
if (str != null) {
|
|
BigDecimal id = new BigDecimal(str);
|
|
|
|
File file = null;
|
|
try {
|
|
file = new File(id);
|
|
} catch(DataObjectNotFoundException nfe) {
|
|
throw new ObjectNotFoundException("The requested file no longer exists.");
|
|
}
|
|
|
|
String mimetype = file.getContentType();
|
|
if (mimetype == null) {
|
|
mimetype = File.DEFAULT_MIME_TYPE;
|
|
}
|
|
|
|
|
|
resp.setContentType(mimetype);
|
|
|
|
InputStream is = file.getInputStream();
|
|
|
|
byte[] buf = new byte[8192]; // 8k buffer
|
|
OutputStream os = null;
|
|
|
|
try {
|
|
os = resp.getOutputStream();
|
|
int sz = 0;
|
|
while ((sz = is.read(buf, 0 , 8192)) != -1) {
|
|
os.write(buf, 0, sz);
|
|
}
|
|
} catch (IOException iox) {
|
|
iox.printStackTrace();
|
|
throw new RuntimeException(iox.getMessage());
|
|
} finally {
|
|
try {
|
|
is.close();
|
|
os.close();
|
|
} catch(IOException iox2) { }
|
|
}
|
|
}
|
|
} else {
|
|
super.dispatch(req, resp, ctx);
|
|
}
|
|
|
|
}
|
|
|
|
}
|