1 package com.icesoft.faces.webapp.http.core; 2 3 import com.icesoft.faces.application.D2DViewHandler; 4 import com.icesoft.faces.webapp.http.common.Request; 5 import com.icesoft.faces.webapp.http.common.Server; 6 7 import javax.faces.FactoryFinder; 8 import javax.faces.component.UIComponent; 9 import javax.faces.component.UIForm; 10 import javax.faces.component.UIInput; 11 import javax.faces.el.ValueBinding; 12 import javax.faces.context.FacesContext; 13 import javax.faces.lifecycle.Lifecycle; 14 import javax.faces.lifecycle.LifecycleFactory; 15 import java.util.ArrayList ; 16 import java.util.Arrays ; 17 import java.util.Collection ; 18 import java.util.Iterator ; 19 import java.util.List ; 20 import java.util.Map ; 21 import java.util.HashMap ; 22 23 public class ReceiveSendUpdates implements Server { 24 private static final String REQUIRED = "required"; 25 private static final LifecycleFactory LifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 26 private Lifecycle lifecycle = LifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 27 private Map commandQueues; 28 private Collection synchronouslyUpdatedViews; 29 30 public ReceiveSendUpdates(Map commandQueues, Collection synchronouslyUpdatedViews) { 31 this.commandQueues = commandQueues; 32 this.synchronouslyUpdatedViews = synchronouslyUpdatedViews; 33 } 34 35 public void service(final Request request) throws Exception { 36 List viewIdentifiers = Arrays.asList(request.getParameterAsStrings("viewNumber")); 37 synchronouslyUpdatedViews.addAll(viewIdentifiers); 38 39 FacesContext context = FacesContext.getCurrentInstance(); 40 if (request.getParameterAsBoolean("partial", false)) { 41 String componentID = request.getParameter("ice.event.captured"); 42 UIComponent component = D2DViewHandler.findComponent(componentID, context.getViewRoot()); 43 renderCyclePartial(context, component); 44 } else { 45 renderCycle(context); 46 } 47 48 request.respondWith(new SendUpdates.Handler(commandQueues, request)); 49 } 50 51 public void shutdown() { 52 } 53 54 private void renderCycle(FacesContext context) { 55 synchronized (context) { 56 com.icesoft.util.SeamUtilities.removeSeamDebugPhaseListener(lifecycle); 57 lifecycle.execute(context); 58 lifecycle.render(context); 59 } 60 } 61 62 private void renderCyclePartial(FacesContext context, 63 UIComponent component) { 64 synchronized (context) { 65 Map alteredRequiredComponents = 66 setRequiredFalseInFormContaining(component); 67 com.icesoft.util.SeamUtilities.removeSeamDebugPhaseListener(lifecycle); 68 lifecycle.execute(context); 69 lifecycle.render(context); 70 setRequiredTrue(alteredRequiredComponents); 71 } 72 } 73 74 private void setRequiredTrue(Map requiredComponents) { 75 Iterator i = requiredComponents.keySet().iterator(); 76 UIInput next = null; 77 while (i.hasNext()) { 78 next = (UIInput) i.next(); 79 ValueBinding valueBinding = (ValueBinding) 80 requiredComponents.get(next); 81 if (null != valueBinding) { 82 next.setValueBinding(REQUIRED, valueBinding); 83 } else { 84 next.setRequired(true); 85 } 86 } 87 } 88 89 private Map setRequiredFalseInFormContaining(UIComponent component) { 90 Map alteredComponents = new HashMap (); 91 UIComponent form = getContainingForm(component); 92 setRequiredFalseOnAllChildrenExceptOne(form, component, 93 alteredComponents); 94 return alteredComponents; 95 } 96 97 private void setRequiredFalseOnAllChildrenExceptOne(UIComponent parent, 98 UIComponent componentToAvoid, 99 Map alteredComponents) { 100 ValueBinding FALSE_BINDING = FacesContext.getCurrentInstance() 101 .getApplication().createValueBinding("#{false}"); 102 int length = parent.getChildCount(); 103 UIComponent next = null; 104 for (int i = 0; i < length; i++) { 105 next = (UIComponent) parent.getChildren().get(i); 106 if (next instanceof UIInput && next != componentToAvoid) { 107 UIInput input = (UIInput) next; 108 if (input.isRequired()) { 109 ValueBinding valueBinding = 110 input.getValueBinding(REQUIRED); 111 if (null != valueBinding) { 112 input.setValueBinding(REQUIRED, FALSE_BINDING); 113 } else { 114 input.setRequired(false); 115 } 116 alteredComponents.put(input, valueBinding); 117 } 118 } 119 setRequiredFalseOnAllChildrenExceptOne(next, componentToAvoid, 120 alteredComponents); 121 } 122 } 123 124 private UIComponent getContainingForm(UIComponent component) { 125 if (null == component) { 126 return FacesContext.getCurrentInstance().getViewRoot(); 127 } 128 UIComponent parent = component.getParent(); 129 while (parent != null) { 130 if (parent instanceof UIForm) { 131 break; 132 } 133 parent = parent.getParent(); 134 } 135 return (UIForm) parent; 136 } 137 138 139 } 140 | Popular Tags |