Because my old snippet does not work anymore for ND9 (the IBM changed the internal methods / objects) I had to create a new way to disable the validation of the FileDownload control. Now I have switched to a PhaseListener which waits for to any XspEventHandler and checks if this event handler is a child of the FileDownload control. If so, it skips the validation.
Here is the code for the PhaseListener:
package ch.hasselba.xpages;
import java.util.Iterator;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import com.ibm.xsp.component.UIViewRootEx;
import com.ibm.xsp.component.xp.XspEventHandler;
import com.ibm.xsp.component.xp.XspFileDownload;
import com.ibm.xsp.context.FacesContextExImpl;
import com.ibm.xsp.util.FacesUtil;
public class FileDownloadPhaseListener implements PhaseListener {
/**
* FileDownloadPhaseListener
*
* by Sven Hasselbach, 19.12.2014
*/
private static final long serialVersionUID = 1L;
public void afterPhase(PhaseEvent arg0) {}
public void beforePhase(PhaseEvent arg0) {
try{
FacesContextExImpl fc = (FacesContextExImpl) FacesContext.getCurrentInstance();
// get client id
String clientId = FacesUtil.getHiddenFieldValue(fc);
// extract last id
String[] ids = clientId.split(":");
String id = ids[ ids.length - 1 ];
// search for the component
UIViewRootEx uiRoot = (UIViewRootEx) fc.getViewRoot();
UIComponent cmp = FacesUtil.getComponentFor(uiRoot, id );
if( cmp instanceof XspEventHandler ){
while( cmp != null ){
// found the download control?
if( cmp instanceof XspFileDownload ){
// disable validation & quit the process
fc.setDisableValidators( true );
break;
}
// climb up the component tree
cmp = cmp.getParent();
}
}
}catch(Exception e){}
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_VALIDATIONS;
}
}
When using it on a XPage…
… you can now delete a File …
… but cannot submit a form with the required field:
This is the required faces-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<lifecycle>
<phase-listener>ch.hasselba.xpages.FileDownloadPhaseListener</phase-listener>
</lifecycle>
</faces-config>
P.S. Keep in mind that this article has been posted in the “Quick-n-Dirty” category.