SHOW:
|
|
- or go back to the newest paste.
| 1 | - | package de.kupium.util; |
| 1 | + | |
| 2 | ||
| 3 | import javax.faces.component.UIComponent; | |
| 4 | import javax.faces.context.FacesContext; | |
| 5 | import javax.faces.context.ResponseWriter; | |
| 6 | import javax.faces.convert.ConverterException; | |
| 7 | import javax.servlet.ServletRequestWrapper; | |
| 8 | import <YourPackage>.MultipartRequest; | |
| 9 | ||
| 10 | import org.apache.commons.fileupload.FileItem; | |
| 11 | import org.primefaces.component.fileupload.FileUpload; | |
| 12 | import org.primefaces.event.FileUploadEvent; | |
| 13 | import org.primefaces.model.DefaultUploadedFile; | |
| 14 | import org.primefaces.renderkit.CoreRenderer; | |
| 15 | import org.primefaces.util.ComponentUtils; | |
| 16 | import org.primefaces.util.HTML; | |
| 17 | import org.primefaces.util.WidgetBuilder; | |
| 18 | ||
| 19 | public class FileUploadRenderer extends CoreRenderer {
| |
| 20 | ||
| 21 | @Override | |
| 22 | public void decode(FacesContext context, UIComponent component) {
| |
| 23 | FileUpload fileUpload = (FileUpload) component; | |
| 24 | String clientId = fileUpload.getClientId(context); | |
| 25 | MultipartRequest multipartRequest = getMultiPartRequestInChain(context); | |
| 26 | ||
| 27 | if(multipartRequest != null) {
| |
| 28 | FileItem file = multipartRequest.getFileItem(clientId); | |
| 29 | ||
| 30 | if(fileUpload.getMode().equals("simple")) {
| |
| 31 | decodeSimple(context, fileUpload, file); | |
| 32 | } | |
| 33 | else {
| |
| 34 | decodeAdvanced(context, fileUpload, file); | |
| 35 | } | |
| 36 | } | |
| 37 | } | |
| 38 | ||
| 39 | public void decodeSimple(FacesContext context, FileUpload fileUpload, FileItem file) {
| |
| 40 | if(file.getName().equals(""))
| |
| 41 | fileUpload.setSubmittedValue("");
| |
| 42 | else | |
| 43 | fileUpload.setSubmittedValue(new DefaultUploadedFile(file)); | |
| 44 | } | |
| 45 | ||
| 46 | public void decodeAdvanced(FacesContext context, FileUpload fileUpload, FileItem file) {
| |
| 47 | if(file != null) {
| |
| 48 | fileUpload.queueEvent(new FileUploadEvent(fileUpload, new DefaultUploadedFile(file))); | |
| 49 | } | |
| 50 | } | |
| 51 | ||
| 52 | /** | |
| 53 | * Finds our MultipartRequestServletWrapper in case application contains other RequestWrappers | |
| 54 | */ | |
| 55 | private MultipartRequest getMultiPartRequestInChain(FacesContext facesContext) {
| |
| 56 | Object request = facesContext.getExternalContext().getRequest(); | |
| 57 | ||
| 58 | while(request instanceof ServletRequestWrapper) {
| |
| 59 | if(request instanceof MultipartRequest) {
| |
| 60 | return (MultipartRequest) request; | |
| 61 | } | |
| 62 | else {
| |
| 63 | request = ((ServletRequestWrapper) request).getRequest(); | |
| 64 | } | |
| 65 | } | |
| 66 | ||
| 67 | return null; | |
| 68 | } | |
| 69 | ||
| 70 | @Override | |
| 71 | public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
| |
| 72 | FileUpload fileUpload = (FileUpload) component; | |
| 73 | ||
| 74 | encodeMarkup(context, fileUpload); | |
| 75 | encodeScript(context, fileUpload); | |
| 76 | } | |
| 77 | ||
| 78 | protected void encodeScript(FacesContext context, FileUpload fileUpload) throws IOException {
| |
| 79 | ResponseWriter writer = context.getResponseWriter(); | |
| 80 | String clientId = fileUpload.getClientId(context); | |
| 81 | String mode = fileUpload.getMode(); | |
| 82 | WidgetBuilder wb = getWidgetBuilder(context); | |
| 83 | wb.widget("FileUpload", fileUpload.resolveWidgetVar(), clientId, "fileupload", true)
| |
| 84 | .attr("mode", mode);
| |
| 85 | ||
| 86 | if(!mode.equals("simple")) {
| |
| 87 | String update = fileUpload.getUpdate(); | |
| 88 | String process = fileUpload.getProcess(); | |
| 89 | ||
| 90 | wb.attr("autoUpload", fileUpload.isAuto())
| |
| 91 | .attr("dnd", fileUpload.isDragDropSupport())
| |
| 92 | .attr("update", ComponentUtils.findClientIds(context, fileUpload, update), null)
| |
| 93 | .attr("process", ComponentUtils.findClientIds(context, fileUpload, process), null)
| |
| 94 | .attr("maxFileSize", fileUpload.getSizeLimit(), Integer.MAX_VALUE)
| |
| 95 | .attr("invalidFileMessage", fileUpload.getInvalidFileMessage(), null)
| |
| 96 | .attr("invalidSizeMessage", fileUpload.getInvalidSizeMessage(), null)
| |
| 97 | .callback("onstart", "function()", fileUpload.getOnstart())
| |
| 98 | .callback("oncomplete", "function()", fileUpload.getOncomplete());
| |
| 99 | ||
| 100 | if(fileUpload.getAllowTypes() != null) {
| |
| 101 | wb.append(",acceptFileTypes:").append(fileUpload.getAllowTypes());
| |
| 102 | } | |
| 103 | } | |
| 104 | ||
| 105 | startScript(writer, clientId); | |
| 106 | writer.write(wb.build()); | |
| 107 | endScript(writer); | |
| 108 | } | |
| 109 | ||
| 110 | protected void encodeMarkup(FacesContext context, FileUpload fileUpload) throws IOException {
| |
| 111 | if(fileUpload.getMode().equals("simple"))
| |
| 112 | encodeSimpleMarkup(context, fileUpload); | |
| 113 | else | |
| 114 | encodeAdvancedMarkup(context, fileUpload); | |
| 115 | } | |
| 116 | ||
| 117 | protected void encodeAdvancedMarkup(FacesContext context, FileUpload fileUpload) throws IOException {
| |
| 118 | ResponseWriter writer = context.getResponseWriter(); | |
| 119 | String clientId = fileUpload.getClientId(context); | |
| 120 | String styleClass = fileUpload.getStyleClass(); | |
| 121 | styleClass = styleClass == null ? FileUpload.CONTAINER_CLASS : FileUpload.CONTAINER_CLASS + " " + styleClass; | |
| 122 | ||
| 123 | writer.startElement("div", fileUpload);
| |
| 124 | writer.writeAttribute("id", clientId, "id");
| |
| 125 | writer.writeAttribute("class", styleClass, "id");
| |
| 126 | if(fileUpload.getStyle() != null) | |
| 127 | writer.writeAttribute("style", fileUpload.getStyle(), "style");
| |
| 128 | ||
| 129 | //buttonbar | |
| 130 | writer.startElement("div", fileUpload);
| |
| 131 | writer.writeAttribute("class", FileUpload.BUTTON_BAR_CLASS, "styleClass");
| |
| 132 | ||
| 133 | //choose button | |
| 134 | encodeChooseButton(context, fileUpload); | |
| 135 | ||
| 136 | if(fileUpload.isShowButtons() && !fileUpload.isAuto()) {
| |
| 137 | encodeButton(context, fileUpload.getUploadLabel(), FileUpload.UPLOAD_BUTTON_CLASS, "ui-icon-arrowreturnthick-1-n"); | |
| 138 | encodeButton(context, fileUpload.getCancelLabel(), FileUpload.CANCEL_BUTTON_CLASS, "ui-icon-cancel"); | |
| 139 | } | |
| 140 | ||
| 141 | writer.endElement("div");
| |
| 142 | ||
| 143 | //content | |
| 144 | writer.startElement("div", null);
| |
| 145 | writer.writeAttribute("class", FileUpload.CONTENT_CLASS, null);
| |
| 146 | ||
| 147 | writer.startElement("table", null);
| |
| 148 | writer.writeAttribute("class", FileUpload.FILES_CLASS, null);
| |
| 149 | writer.endElement("table");
| |
| 150 | ||
| 151 | writer.endElement("div");
| |
| 152 | ||
| 153 | writer.endElement("div");
| |
| 154 | } | |
| 155 | ||
| 156 | protected void encodeSimpleMarkup(FacesContext context, FileUpload fileUpload) throws IOException {
| |
| 157 | encodeInputField(context, fileUpload, fileUpload.getClientId(context)); | |
| 158 | } | |
| 159 | ||
| 160 | protected void encodeChooseButton(FacesContext context, FileUpload fileUpload) throws IOException {
| |
| 161 | ResponseWriter writer = context.getResponseWriter(); | |
| 162 | String clientId = fileUpload.getClientId(context); | |
| 163 | ||
| 164 | writer.startElement("label", null);
| |
| 165 | writer.writeAttribute("class", HTML.BUTTON_TEXT_ICON_LEFT_BUTTON_CLASS + " " + FileUpload.CHOOSE_BUTTON_CLASS, null);
| |
| 166 | ||
| 167 | //button icon | |
| 168 | writer.startElement("span", null);
| |
| 169 | writer.writeAttribute("class", HTML.BUTTON_LEFT_ICON_CLASS + " ui-icon-plusthick", null);
| |
| 170 | writer.endElement("span");
| |
| 171 | ||
| 172 | //text | |
| 173 | writer.startElement("span", null);
| |
| 174 | writer.writeAttribute("class", HTML.BUTTON_TEXT_CLASS, null);
| |
| 175 | writer.writeText(fileUpload.getLabel(), "value"); | |
| 176 | writer.endElement("span");
| |
| 177 | ||
| 178 | encodeInputField(context, fileUpload, clientId + "_input"); | |
| 179 | ||
| 180 | writer.endElement("label");
| |
| 181 | } | |
| 182 | ||
| 183 | protected void encodeInputField(FacesContext context, FileUpload fileUpload, String clientId) throws IOException {
| |
| 184 | ResponseWriter writer = context.getResponseWriter(); | |
| 185 | ||
| 186 | writer.startElement("input", null);
| |
| 187 | writer.writeAttribute("type", "file", null);
| |
| 188 | writer.writeAttribute("id", clientId, null);
| |
| 189 | writer.writeAttribute("name", clientId, null);
| |
| 190 | ||
| 191 | if(fileUpload.isMultiple()) writer.writeAttribute("multiple", "multiple", null);
| |
| 192 | if(fileUpload.getStyle() != null) writer.writeAttribute("style", fileUpload.getStyle(), "style");
| |
| 193 | if(fileUpload.getStyleClass() != null) writer.writeAttribute("class", fileUpload.getStyleClass(), "styleClass");
| |
| 194 | if(fileUpload.isDisabled()) writer.writeAttribute("disabled", "disabled", "disabled");
| |
| 195 | ||
| 196 | writer.endElement("input");
| |
| 197 | } | |
| 198 | ||
| 199 | protected void encodeButton(FacesContext context, String label, String styleClass, String icon) throws IOException {
| |
| 200 | ResponseWriter writer = context.getResponseWriter(); | |
| 201 | ||
| 202 | writer.startElement("button", null);
| |
| 203 | writer.writeAttribute("type", "button", null);
| |
| 204 | writer.writeAttribute("class", HTML.BUTTON_TEXT_ICON_LEFT_BUTTON_CLASS + " " + styleClass, null);
| |
| 205 | ||
| 206 | //button icon | |
| 207 | String iconClass = HTML.BUTTON_LEFT_ICON_CLASS ; | |
| 208 | writer.startElement("span", null);
| |
| 209 | writer.writeAttribute("class", iconClass + " " + icon, null);
| |
| 210 | writer.endElement("span");
| |
| 211 | ||
| 212 | //text | |
| 213 | writer.startElement("span", null);
| |
| 214 | writer.writeAttribute("class", HTML.BUTTON_TEXT_CLASS, null);
| |
| 215 | writer.writeText(label, "value"); | |
| 216 | writer.endElement("span");
| |
| 217 | ||
| 218 | writer.endElement("button");
| |
| 219 | } | |
| 220 | ||
| 221 | /** | |
| 222 | * Return null if no file is submitted in simple mode | |
| 223 | * | |
| 224 | * @param context | |
| 225 | * @param component | |
| 226 | * @param submittedValue | |
| 227 | * @return | |
| 228 | * @throws ConverterException | |
| 229 | */ | |
| 230 | @Override | |
| 231 | public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
| |
| 232 | FileUpload fileUpload = (FileUpload) component; | |
| 233 | ||
| 234 | if(fileUpload.getMode().equals("simple") && submittedValue != null && submittedValue.equals("")) {
| |
| 235 | return null; | |
| 236 | } | |
| 237 | else {
| |
| 238 | return submittedValue; | |
| 239 | } | |
| 240 | } | |
| 241 | } |