View Javadoc

1   /**
2    * This file Copyright (c) 2003-2011 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.cms.gui.dialog;
35  
36  import info.magnolia.cms.beans.config.MIMEMapping;
37  import info.magnolia.cms.beans.runtime.Document;
38  import info.magnolia.cms.beans.runtime.MultipartForm;
39  import info.magnolia.cms.core.Content;
40  import info.magnolia.cms.gui.control.File;
41  import info.magnolia.cms.gui.misc.CssConstants;
42  import info.magnolia.cms.gui.misc.Spacer;
43  
44  import java.io.IOException;
45  import java.io.Writer;
46  import java.util.ArrayList;
47  import java.util.List;
48  
49  import javax.jcr.PropertyType;
50  import javax.jcr.RepositoryException;
51  import javax.servlet.http.HttpServletRequest;
52  import javax.servlet.http.HttpServletResponse;
53  
54  import org.apache.commons.lang.StringUtils;
55  
56  
57  /**
58   * @author Vinzenz Wyser
59   * @version 2.0
60   */
61  public class DialogFile extends DialogBox {
62  
63      private List imageExtensions = new ArrayList();
64  
65      /**
66       * @see info.magnolia.cms.gui.dialog.DialogControl#init(HttpServletRequest, HttpServletResponse, Content, Content)
67       */
68      @Override
69      public void init(HttpServletRequest request, HttpServletResponse response, Content websiteNode, Content configNode)
70          throws RepositoryException {
71          super.init(request, response, websiteNode, configNode);
72          initImageExtensions();
73      }
74  
75      public List getImageExtensions() {
76          return this.imageExtensions;
77      }
78  
79      public void setImageExtensions(List l) {
80          this.imageExtensions = l;
81      }
82  
83      public void initImageExtensions() {
84          this.getImageExtensions().add("jpg"); //$NON-NLS-1$
85          this.getImageExtensions().add("jpeg"); //$NON-NLS-1$
86          this.getImageExtensions().add("gif"); //$NON-NLS-1$
87          this.getImageExtensions().add("png"); //$NON-NLS-1$
88          this.getImageExtensions().add("bmp"); //$NON-NLS-1$
89          this.getImageExtensions().add("swf"); //$NON-NLS-1$
90      }
91  
92      @Override
93      public void drawHtml(Writer out) throws IOException {
94          File control = getFileControl();
95          control.setType(this.getConfigValue("type", PropertyType.TYPENAME_STRING)); //$NON-NLS-1$
96          control.setSaveInfo(false); // set manualy below
97          control.setCssClass(CssConstants.CSSCLASS_FILE);
98          control.setCssClassFileName(CssConstants.CSSCLASS_EDIT);
99          control.setCssStyles("width", this.getConfigValue("width", "100%")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
100 
101         this.drawHtmlPre(out);
102 
103         String width = this.getConfigValue("width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
104 
105 
106         final boolean preview = Boolean.valueOf(getConfigValue("preview", "true")).booleanValue();
107         final boolean extensionIsDisplayableImage = this.getImageExtensions().contains(control.getExtension().toLowerCase());
108         final boolean showImage = extensionIsDisplayableImage && preview;
109 
110         StringBuffer htmlControlFileName = getHtmlControlFileName(control);
111         String htmlContentEmpty = control.getHtmlBrowse() + Spacer.getHtml(0, 0) + htmlControlFileName;
112         out.write("<div id=\"" + this.getName() + "_contentDiv\" style=\"width:100%;\">"); //$NON-NLS-1$ //$NON-NLS-2$
113         boolean exists = false;
114 
115         if (this.getStorageNode() != null) {
116             exists = this.getStorageNode().getNodeData(this.getName()).isExist();
117         }
118 
119         if (!exists) {
120             out.write(htmlContentEmpty);
121             out.write("</div>"); //$NON-NLS-1$
122         }
123         else {
124             String link = getLink(control);
125 
126             if (showImage) {
127 
128                 out.write("\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"" + width + "\">"); //$NON-NLS-1$ //$NON-NLS-2$
129                 out.write("<tr><td class=\"" + CssConstants.CSSCLASS_FILEIMAGE + "\">"); //$NON-NLS-1$ //$NON-NLS-2$
130 
131                 if ("swf".equals(control.getExtension().toLowerCase())) {
132 
133                     // flash movie
134                     out.write("<object type=\"application/x-shockwave-flash\" data=\"");
135                     out.write(link);
136                     out.write("\" title=\"");
137                     out.write(control.getFileName());
138                     out.write("\" ");
139                     out.write("width=\"150\" ");
140                     out.write("height=\"100\" ");
141                     out.write(">");
142 
143                     out.write("<param name=\"movie\" value=\"");
144                     out.write(link);
145                     out.write("\"/>");
146 
147                     out.write("</object>\n");
148 
149                 }
150                 else {
151                     // standard image
152 
153                     // todo: image thumbnail template
154                     // out.write("<img src=\""+ this.getRequest().getContextPath()
155                     // +THUMB_PATH+"?src="+control.getHandle()+"\"
156                     // class=\""+CSSCLASS_FILEIMAGE+"\">");
157                     // tmp workaround: resize in html ...
158 
159                     int imgwidth = 150;
160                     int imgheight = 150;
161 
162                     try{
163                         imgwidth = Integer.parseInt(control.getImageWidth());
164                         imgheight = Integer.parseInt(control.getImageHeight());
165                     }
166                     catch(NumberFormatException e){
167                         // ignore (is 150)
168                     }
169 
170                     // resize if to big
171                     if(imgwidth > imgheight && imgwidth > 150){
172                         imgheight = (int)(150.0/imgwidth * imgheight);
173                         imgwidth = 150;
174                     }
175                     else if(imgheight > imgwidth && imgheight > 150){
176                         imgwidth = (int)(150.0/imgheight * imgwidth);
177                         imgheight = 150;
178                     }
179 
180                     out.write("<img width=\"" + imgwidth + "\" height=\"" + imgheight + "\"src=\""); //$NON-NLS-1$
181                     out.write(link);
182                     out.write("\" class=\""); //$NON-NLS-1$
183                     out.write(CssConstants.CSSCLASS_FILEIMAGE);
184                     out.write("\" alt=\""); //$NON-NLS-1$
185                     out.write(control.getFileName());
186                     out.write("\" title=\""); //$NON-NLS-1$
187                     out.write(control.getFileName());
188                     out.write("\" />\n"); //$NON-NLS-1$
189 
190                     if (StringUtils.isNotEmpty(control.getImageWidth())) {
191                         out.write("<em style='white-space:nowrap'>"); //$NON-NLS-1$
192 
193                         out.write("width: "); //$NON-NLS-1$
194                         out.write(control.getImageWidth());
195 
196                         out.write(" height: "); //$NON-NLS-1$
197                         out.write(control.getImageHeight());
198 
199                         out.write("</em>\n"); //$NON-NLS-1$
200                     }
201 
202                 }
203 
204                 out.write("</td><td>"); //$NON-NLS-1$
205             }
206             writeInnerHtml(out, showImage, control, htmlControlFileName, link);
207 
208             out.write(Spacer.getHtml(12, 12));
209             out.write(control.getHtmlRemove("mgnlDialogFileRemove('" + this.getName() + "');")); //$NON-NLS-1$ //$NON-NLS-2$
210             if (showImage) {
211                 out.write("</td></tr></table>"); //$NON-NLS-1$
212             }
213             out.write("</div>\n"); //$NON-NLS-1$
214             out.write("<div style=\"position:absolute;top:-500px;left:-500px;visibility:hidden;\">\n<textarea id=\""); //$NON-NLS-1$
215             out.write(this.getName());
216             out.write("_contentEmpty\">");//$NON-NLS-1$
217             out.write(htmlContentEmpty);
218 
219             // @todo should be escaped, but we need to test it
220             // out.write(StringEscapeUtils.escapeXml(htmlContentEmpty));
221             out.write("</textarea>\n</div>\n"); //$NON-NLS-1$
222         }
223         control.setSaveInfo(true);
224         out.write(control.getHtmlSaveInfo());
225         control.setNodeDataTemplate(this.getConfigValue("nodeDataTemplate", null)); //$NON-NLS-1$
226         out.write(control.getHtmlNodeDataTemplate());
227         this.drawHtmlPost(out);
228     }
229 
230     protected String getLink(File control) {
231         String link = this.getRequest().getContextPath() + getFileURI(control);
232         if (!StringUtils.isEmpty(control.getExtension())) {
233             link += "." + control.getExtension();
234         }
235         return link;
236     }
237 
238     protected void writeInnerHtml(Writer out, final boolean showImage, File control, StringBuffer htmlControlFileName, String link) throws IOException {
239         out.write(htmlControlFileName.toString());
240         if (!showImage) {
241             String iconPath = MIMEMapping.getMIMETypeIcon(control.getExtension());
242 
243             out.write(Spacer.getHtml(0, 0));
244 
245             out.write("<a href=");
246             out.write(link);
247             out.write(" target=\"_blank\">"); //$NON-NLS-1$ //$NON-NLS-2$
248 
249             out.write("<img src=\"" //$NON-NLS-1$
250                 + this.getRequest().getContextPath()
251                 + iconPath
252                 + "\" class=\"" //$NON-NLS-1$
253                 + CssConstants.CSSCLASS_FILEICON
254                 + "\" border=\"0\">"); //$NON-NLS-1$
255             out.write(control.getFileName() + "." + control.getExtension() + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
256         }
257     }
258 
259     protected StringBuffer getHtmlControlFileName(File control) {
260         StringBuffer htmlControlFileName = new StringBuffer();
261         htmlControlFileName.append("<span class=\"" //$NON-NLS-1$
262             + CssConstants.CSSCLASS_DESCRIPTION
263             + "\">" //$NON-NLS-1$
264             + getMessage("dialog.file.filename") //$NON-NLS-1$
265             + "</span>"); //$NON-NLS-1$
266         htmlControlFileName.append(Spacer.getHtml(1, 1));
267         htmlControlFileName.append(control.getHtmlFileName() + "<span id=\"" //$NON-NLS-1$
268             + this.getName()
269             + "_fileNameExtension\">." //$NON-NLS-1$
270             + control.getExtension()
271             + "</span>"); //$NON-NLS-1$
272         return htmlControlFileName;
273     }
274 
275     @Override
276     public boolean validate() {
277         if (isRequired()) {
278             // if we have a form, then this is going to the database
279             MultipartForm form = (MultipartForm) getRequest().getAttribute(MultipartForm.REQUEST_ATTRIBUTE_NAME);
280             if (form != null) {
281                 Document doc = form.getDocument(getName());
282                 if (doc != null) { // we're submitting a document for this required field
283                     return true;
284                 }
285                 // we're removing the document
286                 // for this required field but
287                 // not uploading one
288                 if (form.getParameter(getName() + "_" + File.REMOVE) != null) {
289                     setValidationMessage("dialogs.validation.required");
290                     return false;
291                 }
292             }
293             // we are not uploading or removing
294             // check if there is a binary stored
295             if(this.getStorageNode() == null || !getStorageNode().getNodeData(getName()).isExist()){
296                 setValidationMessage("dialogs.validation.required");
297                 return false;
298             }
299         }
300         return true;
301     }
302 
303     /**
304      * Get the uri of the file (used to show images)
305      * @param control
306      * @return
307      */
308     protected String getFileURI(File control) {
309         return control.getHandle();
310     }
311 
312     /**
313      * Configures the inner file upload control
314      */
315     protected File getFileControl() {
316         File control = new File(this.getName(), this.getStorageNode());
317         return control;
318     }
319 }