/*********************************************************************************
* The contents of this file are subject to the Common Public Attribution
* License Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.openemm.org/cpal1.html. The License is based on the Mozilla
* Public License Version 1.1 but Sections 14 and 15 have been added to cover
* use of software over a computer network and provide for limited attribution
* for the Original Developer. In addition, Exhibit A has been modified to be
* consistent with Exhibit B.
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is OpenEMM.
* The Original Developer is the Initial Developer.
* The Initial Developer of the Original Code is AGNITAS AG. All portions of
* the code written by AGNITAS AG are Copyright (c) 2009 AGNITAS AG. All Rights
* Reserved.
*
* Contributor(s): AGNITAS AG.
********************************************************************************/
package org.agnitas.cms.web.forms;
import org.agnitas.cms.web.CMTemplateAction;
import org.agnitas.cms.webservices.generated.MediaFile;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.UrlValidator;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;
import org.apache.struts.upload.MultipartRequestHandler;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.util.*;
/**
* @author Vyacheslav Stepanov
*/
public class CMTemplateForm extends CmsBaseForm {
protected int cmTemplateId;
private FormFile templateFile;
private Map<Integer,FormFile> lNewFile;
private List<MediaFile> lMediaFile;
private String contentTemplate;
public static final List<String> CHARTERSET_LIST = Arrays
.asList("utf-8", "iso-8859-1", "iso-8859-15", "gb2312");
private List<String> availableCharsets;
private String charset = CHARTERSET_LIST.get(0);
protected Map<Integer, Integer> oldAssignment;
private UrlValidator urlValidator = new UrlValidator(new String[]{"http", "https"});
private Map<String, String> errorFieldMap;
//public static final List<String> PREVIEW_MODE_LIST = Arrays
// .asList("in table column", "in popup window");
public static final int PREVIEW_MODE_COLUMN = 0;
public static final int PREVIEW_MODE_POPUP = 1;
private int previewMode = 0;
public Map<String, String> getErrorFieldMap() {
return errorFieldMap;
}
public void setErrorFieldMap(Map<String, String> errorFieldMap) {
this.errorFieldMap = errorFieldMap;
}
public int getCmTemplateId() {
return cmTemplateId;
}
public void setCmTemplateId(int cmTemplateId) {
this.cmTemplateId = cmTemplateId;
}
public void setAvailableCharsets(List<String> charsets) {
availableCharsets = charsets;
}
public List<String> getAvailableCharsets() {
return availableCharsets;
}
public FormFile getTemplateFile() {
return templateFile;
}
public void setTemplateFile(FormFile templateFile) {
this.templateFile = templateFile;
}
public Map<Integer, Integer> getOldAssignment() {
return oldAssignment;
}
public void setOldAssignment(Map<Integer, Integer> oldAssignment) {
this.oldAssignment = oldAssignment;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public List<MediaFile> getLMediaFile() {
return lMediaFile;
}
public void setLMediaFile(List<MediaFile> lMediaFile) {
this.lMediaFile = lMediaFile;
}
public Map<Integer, FormFile> getLNewFile() {
return lNewFile;
}
public void setLNewFile(Map<Integer, FormFile> lNewFile) {
this.lNewFile = lNewFile;
}
public String getContentTemplate() {
return contentTemplate;
}
public void setContentTemplate(String contentTemplate) {
setContentTemplateNoConvertion(contentTemplate);
}
public void setContentTemplateNoConvertion(String contentTemplate) {
this.contentTemplate = contentTemplate;
}
public int getPreviewMode() {
return previewMode;
}
public void setPreviewMode(int previewMode) {
this.previewMode = previewMode;
}
/**
* Validate the properties that have been set from this HTTP request, and
* return an <code>ActionErrors</code> object that encapsulates any
* validation errors that have been found. If no errors are found, return
* <code>null</code> or an <code>ActionErrors</code> object with no
* recorded error messages.
*
* @param mapping The mapping used to select this instance
* @param request The servlet request we are processing
* @return errors
*/
public ActionErrors formSpecificValidate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors actionErrors = new ActionErrors();
try {
this.handelExternaleUrl(this,request,actionErrors);
this.handelUploadUrl(this, request);
if(templateFile != null) {
String utf8Name = URLEncoder.encode(templateFile.getFileName(), "utf-8");
if(!templateFile.getFileName().equals(utf8Name)) {
actionErrors.add("global",
new ActionMessage("error.mailing.hosted_image_filename"));
}
}
if(action == CMTemplateAction.ACTION_SAVE) {
if(name.length() < 3) {
actionErrors.add("shortname", new ActionMessage("error.nameToShort"));
}
}
} catch(Exception e) {
// do nothing
}
return actionErrors;
}
private void handelUploadUrl(CMTemplateForm aForm, HttpServletRequest request) {
final Map<String, String> errorFieldMap = this.getErrorFieldMap();
MultipartRequestHandler requestHandler = aForm.getMultipartRequestHandler();
final Map<Integer, FormFile> lFormFile = new HashMap<Integer, FormFile>();
for(MediaFile mediaFile : aForm.getLMediaFile()) {
String uploadOrExternal = request.getParameter("imageUploadOrExternal." + mediaFile.getId() + ".select");
boolean isUpload = (!StringUtils.isEmpty(uploadOrExternal) && uploadOrExternal.equals("upload"));
String fileInputName = String.format("imageUploadOrExternal.%s.file", mediaFile.getId());
if (requestHandler != null && isUpload) {
FormFile file = (FormFile) requestHandler.getFileElements().get(fileInputName);
if (file != null) {
if (!StringUtils.isEmpty(file.getFileName())) {
lFormFile.put(mediaFile.getId(), (FormFile) file);
} else {
errorFieldMap.put("url_img_upload_" + mediaFile.getId(), "error.import.no_file");
}
}
}
}
if(requestHandler != null) {
String uploadOrExternal = request.getParameter("imageUploadOrExternal.new.select");
boolean isUpload = (!StringUtils.isEmpty(uploadOrExternal) && uploadOrExternal.equals("upload"));
FormFile file = (FormFile) requestHandler.getFileElements().get("imageUploadOrExternal.new.file");
if(file != null && isUpload) {
if(!StringUtils.isEmpty(file.getFileName())) {
lFormFile.put(-1, (FormFile) file);
} else {
errorFieldMap.put("url_img_new_upload", "error.import.no_file");
}
}
}
if(!lFormFile.isEmpty()) {
aForm.setLNewFile(lFormFile);
}
this.setErrorFieldMap(errorFieldMap);
}
private void handelExternaleUrl(CMTemplateForm aForm, HttpServletRequest request, ActionErrors actionErrors) {
final Map<String,String> errorFieldMap = new Hashtable<String,String>();
for(MediaFile mediaFile : aForm.getLMediaFile()) {
String externaleImage = request.getParameter(String.format("imageUploadOrExternal.%s.select", mediaFile.getId()));
if(!StringUtils.isEmpty(externaleImage) && externaleImage.equals("external")){
this.validateUrl(String.format("url_img_%s", mediaFile.getId()),
request.getParameter(String.format("imageUploadOrExternal.%s.url", mediaFile.getId())), errorFieldMap);
}
}
String externaleNewImage = request.getParameter("imageUploadOrExternal.new.select");
if(!StringUtils.isEmpty(externaleNewImage) && externaleNewImage.equals("external")) {
final String imageUrl = request.getParameter("imageUploadOrExternal.new.url");
this.validateUrl("url_img_new", imageUrl, errorFieldMap);
final String urlImageName = request.getParameter("name.new.text");
if(StringUtils.isEmpty(urlImageName)){
errorFieldMap.put("url_img_name","error.cmtemplate.edit.nameadd");
}
}
this.setErrorFieldMap(errorFieldMap);
}
private void validateUrl(String parametr, String url, Map<String,String> errorFieldMap) {
if(!urlValidator.isValid(url)) {
errorFieldMap.put(parametr,"error.linkUrlWrong");
}
}
@Override
protected boolean isParameterExcludedForUnsafeHtmlTagCheck( String parameterName, HttpServletRequest request) {
return parameterName.equals( "contentTemplate");
}
}