package com.joe.jsf.component; import java.util.Map; import javax.faces.component.UINamingContainer; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; public class SubformComponent extends UINamingContainer { public SubformComponent() { } @Override public void processDecodes(FacesContext arg0) { if(!isSubmitted()) return; super.processDecodes(arg0); } @Override public void processUpdates(FacesContext arg0) { if(!isSubmitted()) return; super.processUpdates(arg0); } @Override public void processValidators(FacesContext arg0) { if(!isSubmitted()) return; super.processValidators(arg0); //MethodBinding onUpdate = (MethodBinding) this.getAttributes().get("update"); //onUpdate.invoke(FacesContext.getCurrentInstance(), new Object[0]); } public boolean isSubmitted() { return (isSubmittedForm() || (isInSubmittedForm() && submitOnParentSubmit())); } public boolean submitOnParentSubmit() { Map<String, Object> attributes = this.getAttributes(); Object required_value = attributes.get("requiredForSaveAll"); boolean required = true; if(required_value instanceof Boolean) { required = (Boolean) required_value; } if(required_value instanceof String) { required = (required_value.equals("true")); } return required; } public boolean isInSubmittedForm() { String client_id = this.getClientId(FacesContext.getCurrentInstance()); return client_id.startsWith(findSpecificFormSubmitted()); } public boolean isSubmittedForm() { String client_id = this.getClientId(FacesContext.getCurrentInstance()); return client_id.equals(findSpecificFormSubmitted()); } public String findSpecificFormSubmitted() { ExternalContext ctx = FacesContext.getCurrentInstance() .getExternalContext(); Map<String, String> param = ctx.getRequestParameterMap(); String form_id; //String submit_id = param.get("ice.event.captured"); //System.out.println("Form: " + submit_id); String target_id = param.get("ice.event.target"); //System.out.println("Target: " + target_id); String[] parts = target_id.split(":"); form_id = parts[0]; // System.out.println("Event triggered by: " + submit_id); // Find deepest form int depth = -1; for (int i = parts.length - 1; i >= 0; i--) { if (parts[i].endsWith("_form")) { depth = i; break; } } // Put all but the last part back together for (int i = 1; i <= depth; i++) { form_id += ":" + parts[i]; } return form_id; } }