/*
* Created on 14.12.2004
*/
package com.idega.content.presentation;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlCommandButton;
import javax.faces.component.html.HtmlGraphicImage;
import javax.faces.component.html.HtmlOutputLink;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.apache.commons.httpclient.HttpException;
import org.apache.webdav.lib.util.WebdavStatus;
import com.idega.business.IBOLookup;
import com.idega.content.business.ContentUtil;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.IWContext;
import com.idega.presentation.Table;
import com.idega.presentation.text.DownloadLink;
import com.idega.slide.business.IWSlideSession;
import com.idega.slide.util.VersionHelper;
import com.idega.slide.util.WebdavExtendedResource;
import com.idega.slide.util.WebdavResourceVersion;
import com.idega.util.FileUtil;
import com.idega.util.IWTimestamp;
import com.idega.util.Timer;
import com.idega.webface.WFUtil;
/**
* @author gimmi
*/
public class WebDAVFileDetails extends ContentBlock implements ActionListener {
private static String ACTION = "wdf_ac";
private static String ACTION_TOGGLE_LOCK = "togLock";
private static String ACTION_CHECK_OUT = "checkout";
private static String ACTION_CHECK_IN = "checkin";
private static String ACTION_UNCHECK_OUT = "uncheckout";
private static final String PARAMETER_RESOURCE_PATH = "wfd_prp";
private boolean detailed = true;
private boolean useVersionControl = true;
protected void initializeComponent(FacesContext context) {
WebdavExtendedResource resource = getWebdavExtendedResource();
String userName = null;
if (resource != null) {
try {
// Making sure all properties are set
resource.setProperties();
userName = getIWSlideSession().getUserFullName();
}
catch(HttpException he){
if(he.getReasonCode()==WebdavStatus.SC_NOT_FOUND){
//escape out of the processing if the resource is not found
return;
}
else{
he.printStackTrace();
}
}
catch (IOException e) {
e.printStackTrace();
}
String resourceName = resource.getDisplayName();
int row = 1;
Table table = new Table();
table.setId(this.getId() + "_table");
// table.setWidth("100%");
// table.setBorder(1);
HtmlOutputLink link = new HtmlOutputLink();
link.setValue(resource.getEncodedPath());
link.setStyleClass("wf_listlink");
link.setId(getId() + "_dl");
link.getChildren().add(getBundle().getLocalizedText("download_view"));
table.add(getText("document_name"), 1, row);
table.add(WFUtil.getText(resourceName,"wf_listtext"), 2, row);
table.add(link, 2, ++row);
table.add(getText("size"), 1, ++row);
table.add(WFUtil.getText(FileUtil.getHumanReadableSize(resource.getGetContentLength()),"wf_listtext"), 2, row);
table.add(getText("folder"), 1, ++row);
HtmlOutputText loc = WFUtil.getTextVB("WebDAVListBean.webDAVPath");
loc.setStyleClass("wf_listtext");
table.add(loc, 2, row);
table.add(getText("content_type"), 1, ++row);
table.add(WFUtil.getText(resource.getGetContentType(),"wf_listtext"), 2, row);
Locale locale = IWContext.getInstance().getCurrentLocale();
table.add(getText("creation_date"), 1, ++row);
table.add(WFUtil.getText(new IWTimestamp(resource.getCreationDateString()).getLocaleDateAndTime(locale, IWTimestamp.MEDIUM, IWTimestamp.MEDIUM),"wf_listtext"), 2, row);
table.add(getText("modification_date"), 1, ++row);
table.add(WFUtil.getText(new IWTimestamp(resource.getGetLastModified()).getLocaleDateAndTime(locale, IWTimestamp.MEDIUM, IWTimestamp.MEDIUM),"wf_listtext"), 2, row);
if (this.detailed) {
if (this.useVersionControl) {
// Lock/Unlock
table.add(getText("locked_unlocked"), 1, ++row);
if (resource.isLocked()) {
HtmlGraphicImage lock = new HtmlGraphicImage();
lock.setUrl(IWMainApplication.getDefaultIWMainApplication().getURIFromURL(ContentUtil.getBundle().getResourcesVirtualPath())+"/images/locked.gif");
lock.setId(this.getId()+"_lock");
lock.setHeight("16");// sizes that make sense 16/32/64/128
lock.setStyle("alignment:bottom");
table.add(lock, 2, row);
table.add(getText("locked", "wf_listtext"), 2, row);
} else {
table.add(getText("unlocked", "wf_listtext"), 2, row);
}
table.add(WFUtil.getText(" - "), 2, row);
HtmlCommandButton lockToggler = new HtmlCommandButton();
lockToggler.setId(getId()+"_lockTogg");
lockToggler.getAttributes().put(PARAMETER_RESOURCE_PATH, resource.getPath());
if (resource.isLocked()) {
getBundle().getLocalizedUIComponent("unlock", lockToggler);
} else {
getBundle().getLocalizedUIComponent("lock", lockToggler);
}
lockToggler.setStyleClass("wf_listlink");
lockToggler.setActionListener(WFUtil.createMethodBinding("#{contentviewerbean.processAction}", new Class[]{ActionEvent.class}));
lockToggler.getAttributes().put(ACTION, ACTION_TOGGLE_LOCK);
table.add(lockToggler, 2, row);
}
if (this.useVersionControl) {
//Checkout/in
table.add(getText("checkout_status"), 1, ++row);
String checkedOut = resource.getCheckedOut();
if (checkedOut == null || "".equals(checkedOut)) {
table.add(getText("not_checked_out", "wf_listtext"), 2, row);
} else {
table.add(getText("checked_out", "wf_listtext"), 2, row);
table.add(WFUtil.getText(" ("+checkedOut.substring(checkedOut.lastIndexOf("/")+1)+")","wf_listtext"), 2, row);
}
table.add(WFUtil.getText(" - "), 2, row);
HtmlCommandButton checkOuter = new HtmlCommandButton();
checkOuter.setId(getId()+"_check");
checkOuter.getAttributes().put(PARAMETER_RESOURCE_PATH, resource.getPath());
checkOuter.setStyleClass("wf_listlink");
checkOuter.setActionListener(WFUtil.createMethodBinding("#{contentviewerbean.processAction}", new Class[]{ActionEvent.class}));
if (checkedOut == null || "".equals(checkedOut)) {
getBundle().getLocalizedUIComponent("check_out", checkOuter);
checkOuter.getAttributes().put(ACTION, ACTION_CHECK_OUT);
table.add(checkOuter, 2, row);
} else {
if (VersionHelper.hasUserCheckedOutResource(resource, userName)) {
getBundle().getLocalizedUIComponent("uncheck_out", checkOuter);
checkOuter.getAttributes().put(ACTION, ACTION_UNCHECK_OUT);
table.add(checkOuter, 2, row);
HtmlCommandButton checkInner = new HtmlCommandButton();
checkInner.setId(getId()+"_check");
checkInner.getAttributes().put(PARAMETER_RESOURCE_PATH, resource.getPath());
checkInner.setStyleClass("wf_listlink");
checkInner.setActionListener(WFUtil.createMethodBinding("#{contentviewerbean.processAction}", new Class[]{ActionEvent.class}));
getBundle().getLocalizedUIComponent("check_in", checkInner);
checkInner.getAttributes().put(ACTION, ACTION_CHECK_IN);
table.add(" ", 2, row);
table.add(checkInner, 2, row);
} else {
HtmlOutputText comm = new HtmlOutputText();
comm.setValue("("+VersionHelper.getCheckedOutName(resource)+")");
comm.setStyleClass("wf_listtext");
table.add(comm, 2, row);
}
}
}
//Metadata
WebDAVMetadata metadataUI = new WebDAVMetadata(getCurrentResourcePath());
++row;
table.mergeCells(1, row, 2, row);
table.add(metadataUI, 1, row);
//Categories
WebDAVCategories categoriesUI = new WebDAVCategories(getCurrentResourcePath(), IWContext.getIWContext(context).getCurrentLocale().toString());
categoriesUI.setId(this.getId()+"_categories");
++row;
table.mergeCells(1, row, 2, row);
table.add(categoriesUI, 1, row);
if (this.useVersionControl) {
//Then add the version table
Table vTable = getVersionReportTable(resource);
++row;
table.mergeCells(1, row, 2, row);
table.add(vTable, 1, row);
}
}
this.getChildren().add(table);
}
}
protected Table getVersionReportTable(WebdavExtendedResource resource) {
Locale locale = IWContext.getInstance().getCurrentLocale();
Timer timer = new Timer();
timer.start();
List versions = VersionHelper.getAllVersions(resource);
Table vTable = new Table(8,versions.size()+1);
vTable.setId(vTable.getId() + "_ver");
vTable.setRowStyleClass(1,"wf_listheading");
vTable.setStyleClass("wf_listtable");
int vRow = 1;
int vColumn = 1;
vTable.add(getBundle().getLocalizedText("version"), vColumn, vRow);
vTable.add(getBundle().getLocalizedText("download"), ++vColumn, vRow);
vTable.add(getBundle().getLocalizedText("created_by"), ++vColumn, vRow);
vTable.add(getBundle().getLocalizedText("comment"), ++vColumn, vRow);
vTable.add(getBundle().getLocalizedText("checkout"), ++vColumn, vRow);
vTable.add(getBundle().getLocalizedText("checkin"), ++vColumn, vRow);
vTable.add(getBundle().getLocalizedText("last_modified"), ++vColumn, vRow);
if (!versions.isEmpty()) {
Iterator iter = versions.iterator();
while (iter.hasNext()) {
vColumn = 0;
WebdavResourceVersion version = (WebdavResourceVersion) iter.next();
++vRow;
if(vRow%2==0){
vTable.setRowStyleClass(vRow,"wf_listevenrow");
}
else{
vTable.setRowStyleClass(vRow,"wf_listoddrow");
}
String versionName = version.getVersionName();
vTable.add(WFUtil.getText(versionName,"wf_listtext"), ++vColumn, vRow);
DownloadLink versionPath = new DownloadLink(getBundle().getLocalizedString("download"));
versionPath.setId("dl_"+vRow);
versionPath.setStyleClass("wf_listlink");
if (versionName != null) {
String url = version.getURL();
versionPath.setRelativeFilePath(url);
}
//so we have a sensable name for the file!
if(versionName!=null){
String fileName = "v"+versionName.replace('.','_')+"-"+resource.getDisplayName();
versionPath.setAlternativeFileName(fileName);
}
//versionPath.getChildren().add(WFUtil.getText("Download/View"));
vTable.add(versionPath, ++vColumn, vRow);
vTable.add(WFUtil.getText(version.getCreatorDisplayName(),"wf_listtext"), ++vColumn, vRow);
String tComment = version.getComment();
HtmlOutputText comment = new HtmlOutputText();
comment.setStyleClass("wf_listtext");
if ("INITIAL VERSION.".equals(tComment)) {
getBundle().getLocalizedUIComponent("initial_version", comment);
} else {
comment.setValue(tComment);
}
vTable.add(comment, ++vColumn, vRow);
// vTable.add(WFUtil.getText(version.getComment(),"wf_listtext"), ++vColumn, vRow);
vTable.add(WFUtil.getText(version.getCheckedOut(),"wf_listtext"), ++vColumn, vRow);
vTable.add(WFUtil.getText(version.getCheckedIn(),"wf_listtext"), ++vColumn, vRow);
// vTable.add(WFUtil.getText(version.getLastModified(),"wf_listtext"), ++vColumn, vRow);
vTable.add(WFUtil.getText(new IWTimestamp(resource.getGetLastModified()).getLocaleDateAndTime(locale, IWTimestamp.MEDIUM, IWTimestamp.MEDIUM),"wf_listtext"), ++vColumn, vRow);
}
}
++vRow;
vTable.add("Creation time", 3, vRow);
vTable.add(timer.getTimeString(), 4, vRow);
timer.stop();
return vTable;
}
private void toggleLock(WebdavExtendedResource resource) {
if (resource.isLocked()) {
VersionHelper.unlock(resource);
} else {
VersionHelper.lock(resource);
}
super.refreshList();
}
public void processAction(ActionEvent event) throws AbortProcessingException {
UIComponent comp = (UIComponent) event.getSource();
String action = (String) comp.getAttributes().get(ACTION);
String path = (String) comp.getAttributes().get(PARAMETER_RESOURCE_PATH);
WebdavExtendedResource res = getWebdavExentededResource(path);
try {
if (ACTION_TOGGLE_LOCK.equals(action)) {
if (res != null) {
toggleLock(res);
}
} else if (ACTION_CHECK_OUT.equals(action)) {
IWSlideSession ss = (IWSlideSession) IBOLookup.getSessionInstance(IWContext.getInstance(), IWSlideSession.class);
VersionHelper.checkOut(res, ss.getUserFullName());
refreshList();
} else if (ACTION_CHECK_IN.equals(action)) {
VersionHelper.checkIn(res);
refreshList();
} else if (ACTION_UNCHECK_OUT.equals(action)) {
VersionHelper.unCheckOut(res);
refreshList();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setDetailed(boolean detailed) {
this.detailed = detailed;
}
public void setUseVersionControl(boolean useVersionControl) {
this.useVersionControl = useVersionControl;
}
public Object saveState(FacesContext ctx) {
Object values[] = new Object[3];
values[0] = super.saveState(ctx);
values[1] = new Boolean(this.detailed);
values[2] = new Boolean(this.useVersionControl);
return values;
}
public void restoreState(FacesContext ctx, Object state) {
Object values[] = (Object[]) state;
super.restoreState(ctx, values[0]);
this.detailed = ((Boolean) values[1]).booleanValue();
this.useVersionControl = ((Boolean) values[2]).booleanValue();
}
}