1 16 package org.outerj.daisy.frontend; 17 18 import org.outerj.daisy.frontend.util.AbstractDaisyApple; 19 import org.outerj.daisy.frontend.util.HttpMethodNotAllowedException; 20 import org.outerj.daisy.frontend.components.docbasket.DocumentBasket; 21 import org.outerj.daisy.frontend.components.docbasket.DocumentBasketHelper; 22 import org.outerj.daisy.frontend.components.siteconf.SiteConf; 23 import org.outerj.daisy.repository.Repository; 24 import org.apache.cocoon.components.flow.apples.StatelessAppleController; 25 import org.apache.cocoon.components.flow.apples.AppleRequest; 26 import org.apache.cocoon.components.flow.apples.AppleResponse; 27 import org.apache.cocoon.environment.Request; 28 import org.apache.cocoon.forms.util.StringMessage; 29 import org.apache.avalon.framework.service.ServiceManager; 30 import org.apache.avalon.framework.service.Serviceable; 31 import org.apache.avalon.framework.service.ServiceException; 32 import org.apache.excalibur.xml.sax.XMLizable; 33 34 import java.util.Map ; 35 import java.util.HashMap ; 36 import java.util.List ; 37 import java.util.ArrayList ; 38 39 public class DocumentBasketApple extends AbstractDaisyApple implements StatelessAppleController, Serviceable { 40 private ServiceManager serviceManager; 41 private Repository repository; 42 private SiteConf siteConf; 43 44 public void service(ServiceManager serviceManager) throws ServiceException { 45 this.serviceManager = serviceManager; 46 } 47 48 protected void processInternal(AppleRequest appleRequest, AppleResponse appleResponse) throws Exception { 49 Request request = appleRequest.getCocoonRequest(); 50 siteConf = WikiHelper.getSiteConf(request); 51 repository = WikiHelper.getRepository(request, serviceManager); 52 53 55 if (request.getMethod().equals("GET")) { 56 58 DocumentBasket documentBasket = DocumentBasketHelper.getDocumentBasket(request, false); 59 if (documentBasket == null) 60 documentBasket = new DocumentBasket(); 62 showDocumentBasket(appleResponse, documentBasket, null); 63 } else if (request.getMethod().equals("POST")) { 64 String action = RequestUtil.getStringParameter(request, "basketAction"); 65 66 DocumentBasket documentBasket = DocumentBasketHelper.getDocumentBasket(request, true); 67 68 if (action.equals("clear")) { 69 documentBasket.clear(); 70 appleResponse.redirectTo("documentBasket"); 71 } else if (action.equals("removeSelected")) { 72 List entries = getEntriesAndCheckConcurrentUpdates(documentBasket, request, appleResponse); 73 if (entries == null) 74 return; 75 76 boolean[] selected = getSelectStatus(request, entries.size()); 78 79 List newEntries = new ArrayList (entries); 80 for (int i = selected.length - 1; i >=0 ; i--) { 81 if (selected[i]) 82 newEntries.remove(i); 83 } 84 documentBasket.setEntries(newEntries); 85 86 appleResponse.redirectTo("documentBasket"); 87 } else { 88 throw new Exception ("Invalid value for action parameter: \"" + action + "\"."); 89 } 90 91 } else { 92 throw new HttpMethodNotAllowedException(request.getMethod()); 93 } 94 } 95 96 private void showDocumentBasket(AppleResponse appleResponse, DocumentBasket documentBasket, XMLizable message) { 97 Map viewData = new HashMap (); 98 viewData.put("documentBasket", documentBasket); 99 if (message != null) 100 viewData.put("basketMessage", message); 101 viewData.put("pageContext", new PageContext(getMountPoint(), siteConf, repository, getLayoutType(), getSkin(), getContext())); 102 103 appleResponse.sendPage("internal/documentBasket/content", viewData); 104 } 105 106 111 private List getEntriesAndCheckConcurrentUpdates(DocumentBasket documentBasket, Request request, AppleResponse appleResponse) throws Exception { 112 List entries = documentBasket.getEntries(); 113 long currentUpdateCount = documentBasket.getUpdateCount(); 114 long requestUpdateCount = RequestUtil.getLongParameter(request, "basketUpdateCount"); 115 if (currentUpdateCount != requestUpdateCount) { 116 showDocumentBasket(appleResponse, documentBasket, new StringMessage("Your basket was updated since you requested this operation, so the operation has not been performed.")); 117 return null; 118 } 119 return entries; 120 } 121 122 private boolean[] getSelectStatus(Request request, int size) { 123 boolean[] selected = new boolean[size]; 124 for (int i = 0; i < size; i++) { 125 String checked = request.getParameter("entry." + (i + 1)); 126 selected[i] = checked != null && checked.equals("true"); 127 } 128 return selected; 129 } 130 131 } 132 | Popular Tags |