View difference between Paste ID: rDUkPqf6 and jqe3m5Rj
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
}