/*********************************************************************************
* 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;
import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil;
import org.agnitas.beans.MailingBase;
import org.agnitas.cms.dao.CmsMailingDao;
import org.agnitas.cms.dao.impl.MediaFileDaoImpl;
import org.agnitas.cms.utils.ClassicTemplateGenerator;
import org.agnitas.cms.utils.CmsUtils;
import org.agnitas.cms.utils.dataaccess.CMTemplateManager;
import org.agnitas.cms.utils.dataaccess.MediaFileManager;
import org.agnitas.cms.utils.preview.PreviewImageGenerator;
import org.agnitas.cms.web.forms.CMTemplateForm;
import org.agnitas.cms.webservices.generated.CMTemplate;
import org.agnitas.cms.webservices.generated.MediaFile;
import org.agnitas.dao.MailingDao;
import org.agnitas.util.AgnUtils;
import org.agnitas.web.StrutsActionBase;
import org.agnitas.web.forms.StrutsFormBase;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.displaytag.pagination.PaginatedList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* Action for managing CM templates
*
* @author Vyacheslav Stepanov
*/
public class CMTemplateAction extends StrutsActionBase {
public static final int ACTION_PURE_PREVIEW = ACTION_LAST + 1;
public static final int ACTION_UPLOAD = ACTION_LAST + 2;
public static final int ACTION_STORE_UPLOADED = ACTION_LAST + 3;
public static final int ACTION_ASSIGN_LIST = ACTION_LAST + 4;
public static final int ACTION_STORE_ASSIGNMENT = ACTION_LAST + 5;
public static final int ACTION_EDIT_TEMPLATE = ACTION_LAST + 6;
public static final int ACTION_DELETE_IMAGE_TEMPLATE = ACTION_LAST + 7;
public static final int ACTION_SAVE_TEMPLATE = ACTION_LAST + 8;
// @todo will be moved to some other place
public static final String MEDIA_FOLDER = "template-media";
public static final String THUMBS_DB = "thumbs.db";
public static final int LIST_PREVIEW_WIDTH = 500;
public static final int LIST_PREVIEW_HEIGHT = 400;
public static final int PREVIEW_MAX_WIDTH = 150;
public static final int PREVIEW_MAX_HEIGHT = 150;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
CMTemplateForm aForm;
ActionMessages errors = new ActionMessages();
ActionMessages messages = new ActionMessages();
ActionForward destination = null;
if(!AgnUtils.isUserLoggedIn(req)) {
return mapping.findForward("logon");
}
if(form != null) {
aForm = (CMTemplateForm) form;
} else {
aForm = new CMTemplateForm();
}
AgnUtils.logger().info("Action: " + aForm.getAction());
// if preview size is changed - return to view page
if(AgnUtils.parameterNotEmpty(req, "changePreviewSize")) {
aForm.setAction(CMTemplateAction.ACTION_VIEW);
}
// if assign button is pressed - store mailings assignment
if(AgnUtils.parameterNotEmpty(req, "assign")) {
aForm.setAction(CMTemplateAction.ACTION_STORE_ASSIGNMENT);
}
try {
switch(aForm.getAction()) {
case CMTemplateAction.ACTION_LIST:
initializeColumnWidthsListIfNeeded(aForm);
destination = mapping.findForward("list");
aForm.reset(mapping, req);
setAvailableCharsets(aForm, req);
aForm.setAction(CMTemplateAction.ACTION_LIST);
break;
case CMTemplateAction.ACTION_ASSIGN_LIST:
initializeColumnWidthsListIfNeeded(aForm);
destination = mapping.findForward("assign_list");
aForm.reset(mapping, req);
aForm.setAction(CMTemplateAction.ACTION_ASSIGN_LIST);
break;
case CMTemplateAction.ACTION_STORE_ASSIGNMENT:
initializeColumnWidthsListIfNeeded(aForm);
storeMailingAssignment(req, aForm);
destination = mapping.findForward("assign_list");
aForm.reset(mapping, req);
aForm.setAction(CMTemplateAction.ACTION_ASSIGN_LIST);
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
break;
case CMTemplateAction.ACTION_VIEW:
loadCMTemplate(req, aForm);
aForm.setAction(CMTemplateAction.ACTION_SAVE);
destination = mapping.findForward("view");
break;
case CMTemplateAction.ACTION_UPLOAD:
aForm.setAction(CMTemplateAction.ACTION_STORE_UPLOADED);
setAvailableCharsets(aForm, req);
destination = mapping.findForward("upload");
break;
case CMTemplateAction.ACTION_STORE_UPLOADED:
errors = storeUploadedTemplate(aForm, req);
// if template is uploaded and stored successfuly - go to
// template edit page, otherwise - stay on upload page to display
// errors and allow user to repeat his try to upload template
if(errors.isEmpty()) {
AgnUtils.userlogger().info(AgnUtils.getAdmin(req).getUsername() + ": create CM template " + aForm.getName());
loadCMTemplate(req, aForm);
aForm.setAction(CMTemplateAction.ACTION_SAVE);
destination = mapping.findForward("view");
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
} else {
aForm.setAction(CMTemplateAction.ACTION_STORE_UPLOADED);
destination = mapping.findForward("list");
}
break;
case CMTemplateAction.ACTION_SAVE:
boolean saveOk = saveCMTemplate(aForm);
// if save is successful - stay on view page
// if not - got to list page
if(saveOk) {
aForm.setAction(CMTemplateAction.ACTION_SAVE);
destination = mapping.findForward("view");
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
} else {
destination = mapping.findForward("list");
aForm.setAction(CMTemplateAction.ACTION_LIST);
}
break;
case CMTemplateAction.ACTION_PURE_PREVIEW:
destination = mapping.findForward("pure_preview");
aForm.reset(mapping, req);
aForm.setPreview(getCmTemplatePreview(aForm.getCmTemplateId()));
aForm.setAction(CMTemplateAction.ACTION_PURE_PREVIEW);
break;
case CMTemplateAction.ACTION_CONFIRM_DELETE:
loadCMTemplate(req, aForm);
aForm.setAction(CMTemplateAction.ACTION_DELETE);
destination = mapping.findForward("delete");
break;
case CMTemplateAction.ACTION_DELETE:
if(AgnUtils.parameterNotEmpty(req, "kill")) {
deleteCMTemplate(aForm.getCmTemplateId(), req);
}
aForm.setAction(CMTemplateAction.ACTION_LIST);
destination = mapping.findForward("list");
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
break;
case CMTemplateAction.ACTION_EDIT_TEMPLATE:
loadCMTemplate(req, aForm);
aForm.setLMediaFile(this.getMediaFile(aForm.getCmTemplateId()));
aForm.setContentTemplateNoConvertion(getContentTemplate(aForm.getCmTemplateId()));
aForm.setAction(CMTemplateAction.ACTION_EDIT_TEMPLATE);
destination = mapping.findForward("edit_template");
break;
case CMTemplateAction.ACTION_DELETE_IMAGE_TEMPLATE:
this.deleteImage(req);
aForm.setLMediaFile(this.getMediaFile(aForm.getCmTemplateId()));
loadCMTemplate(req, aForm);
aForm.setAction(CMTemplateAction.ACTION_EDIT_TEMPLATE);
destination = mapping.findForward("edit_template");
break;
case CMTemplateAction.ACTION_SAVE_TEMPLATE:
if (aForm.getErrorFieldMap().isEmpty()) {
this.saveEditTemplate(req, aForm);
aForm.setLMediaFile(this.getMediaFile(aForm.getCmTemplateId()));
aForm.setAction(CMTemplateAction.ACTION_EDIT_TEMPLATE);
destination = mapping.findForward("edit_template");
if (errors.isEmpty()) {
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("default.changes_saved"));
req.removeAttribute("save_ok");
}
break;
} else{
aForm.setAction(CMTemplateAction.ACTION_EDIT_TEMPLATE);
destination = mapping.findForward("edit_template");
for(String key : aForm.getErrorFieldMap().keySet() ){
errors.add(key,new ActionMessage(aForm.getErrorFieldMap().get(key)));
}
req.setAttribute("save_ok","false");
}
}
}
catch(Exception e) {
AgnUtils.logger()
.error("Error while executing action with CM Template: " + e + "\n" +
AgnUtils.getStackTrace(e));
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.exception"));
}
// collect list of CM Templates for list-page
if(destination != null && "list".equals(destination.getName())) {
try {
setNumberOfRows(req, (StrutsFormBase) form);
req.setAttribute("cmTemplateList", getCMTemplateList(req));
} catch(Exception e) {
AgnUtils.logger()
.error("cmTemplateList: " + e + "\n" + AgnUtils.getStackTrace(e));
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.exception"));
}
}
// collect list of Mailings for assign-page
if(destination != null && "assign_list".equals(destination.getName())) {
try {
setNumberOfRows(req, (StrutsFormBase) form);
req.setAttribute("mailingsList", getMailingsList(req, aForm));
} catch(Exception e) {
AgnUtils.logger().error("getMailingsList: " + e + "\n" +
AgnUtils.getStackTrace(e));
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.exception"));
}
}
// Report any errors we have discovered back to the original form
if(!errors.isEmpty()) {
saveErrors(req, errors);
}
if(!messages.isEmpty()) {
saveMessages(req, messages);
}
return destination;
}
protected void initializeColumnWidthsListIfNeeded(CMTemplateForm aForm){
if (aForm.getColumnwidthsList() == null) {
aForm.setColumnwidthsList(getInitializedColumnWidthList(3));
}
}
private void setAvailableCharsets(CMTemplateForm aForm, HttpServletRequest request) {
List<String> charsets = new ArrayList<String>();
for(String charset : CMTemplateForm.CHARTERSET_LIST) {
if(allowed("charset.use." + charset.replaceAll("-", "_"), request)) {
charsets.add(charset);
}
}
aForm.setAvailableCharsets(charsets);
}
private void storeMailingAssignment(HttpServletRequest req, CMTemplateForm aForm) {
List<Integer> assignedMailings = new ArrayList<Integer>();
Enumeration parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()) {
String paramName = (String) parameterNames.nextElement();
if(paramName.startsWith("assign_mailing_")) {
String value = req.getParameter(paramName);
if(value != null) {
if(value.startsWith("mailing_")) {
value = value.substring("mailing_".length());
assignedMailings.add(Integer.parseInt(value));
}
}
}
}
List<Integer> mailingsToAssign = new ArrayList<Integer>();
List<Integer> mailingsToDeassign = new ArrayList<Integer>();
Map<Integer, Integer> oldAssignment = aForm.getOldAssignment();
for(Integer mailingId : oldAssignment.keySet()) {
if(!assignedMailings.contains(mailingId) &&
oldAssignment.get(mailingId) == aForm.getCmTemplateId()) {
mailingsToDeassign.add(mailingId);
}
}
for(Integer assignedMailingId : assignedMailings) {
if(oldAssignment.get(assignedMailingId) == null) {
mailingsToAssign.add(assignedMailingId);
} else if(oldAssignment.get(assignedMailingId) != aForm.getCmTemplateId()) {
mailingsToDeassign.add(assignedMailingId);
mailingsToAssign.add(assignedMailingId);
}
}
getTemplateManager().removeMailingBindings(mailingsToDeassign);
getTemplateManager()
.addMailingBindings(aForm.getCmTemplateId(), mailingsToAssign);
final ClassicTemplateGenerator classicTemplateGenerator =
(ClassicTemplateGenerator) getWebApplicationContext()
.getBean("ClassicTemplateGenerator");
for(Integer mailingId : mailingsToAssign) {
classicTemplateGenerator.generate(mailingId, req, false);
}
for(Integer mailingId : mailingsToDeassign) {
classicTemplateGenerator.generate(mailingId, req, false);
}
}
private ActionErrors storeUploadedTemplate(CMTemplateForm aForm,
HttpServletRequest req) {
ActionErrors errors = new ActionErrors();
FormFile file = aForm.getTemplateFile();
if(file != null) {
if(!file.getFileName().toLowerCase().endsWith("zip")) {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.cmtemplate.filetype"));
} else {
try {
byte[] fileData = file.getFileData();
if(fileData.length > 0) {
int templateId = readArchivedCMTemplate(aForm,
file.getInputStream(), req);
if(templateId == -1) {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.cmtemplate.notemplatefile"));
} else {
aForm.setCmTemplateId(templateId);
final int maxWidth = PREVIEW_MAX_WIDTH;
final int maxHeight = PREVIEW_MAX_HEIGHT;
final HttpSession session = req.getSession();
final PreviewImageGenerator previewImageGenerator =
new PreviewImageGenerator(getWebApplicationContext(),
session,
maxWidth,
maxHeight);
previewImageGenerator.generatePreview(templateId, 0, 0);
}
return errors;
}
} catch(IOException e) {
AgnUtils.logger()
.error("Error while uploading CM Template: " + e + "\n" +
AgnUtils.getStackTrace(e));
}
}
}
if(errors.isEmpty()) {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("error.cmtemplate.upload"));
}
return errors;
}
public int readArchivedCMTemplate(CMTemplateForm aForm, InputStream stream,
HttpServletRequest request) {
ZipInputStream zipInputStream = new ZipInputStream(stream);
ZipEntry entry;
String templateBody = null;
// binds image name in zip to image id in CCR (Central Content Repository)
Map<String, Integer> imageBindMap = new HashMap<String, Integer>();
int newTemplateId = createEmptyCMTemplate(request);
if(newTemplateId == -1){
return -1;
}
try {
while((entry = zipInputStream.getNextEntry()) != null) {
String entryName = entry.getName();
// hack for ignoring MACOS archive system folders
if(entryName.contains("__MACOSX")) {
continue;
}
// skip if directory
if(entryName.endsWith("/")) {
continue;
}
// if file is in media-folder - store it in CCR
if(entryName.startsWith(MEDIA_FOLDER)) {
// thumbs.db is ignored by EMM
if (!StringUtils.endsWithIgnoreCase(entryName, THUMBS_DB)) {
byte[] fileData = getEntryData(zipInputStream, entry);
int mediaFileId = storeMediaFile(fileData, entryName, newTemplateId,
request);
if (mediaFileId != -1) {
imageBindMap.put(entryName, mediaFileId);
}
}
} else if(entryName.endsWith(".html") && templateBody == null) {
// first html file that was found in root folder of
// zip-archive is considered to be a template-file
byte[] templateData = getEntryData(zipInputStream, entry);
templateBody = new String(templateData,
Charset.forName(aForm.getCharset()).name());
}
}
zipInputStream.close();
} catch(IOException e) {
AgnUtils.logger().error("Error occured reading CM template from zip: ", e);
}
if(templateBody == null) {
getTemplateManager().deleteCMTemplate(newTemplateId);
getMediaManager().removeMediaFilesForCMTemplateId(newTemplateId);
return -1;
} else {
templateBody = replacePictureLinks(templateBody, imageBindMap);
try {
getTemplateManager().updateContent(newTemplateId,
templateBody.getBytes(Charset.forName("UTF-8").name()));
} catch(UnsupportedEncodingException e) {
AgnUtils.logger().warn("Wrong charset name", e);
}
return newTemplateId;
}
}
private byte[] getEntryData(ZipInputStream zipInputStream, ZipEntry entry) throws
IOException {
byte[] fileData = new byte[(int) entry.getSize()];
byte[] buf = new byte[2048];
int bytesRead = 0;
int dataIndex = 0;
while(bytesRead != -1) {
bytesRead = zipInputStream.read(buf);
for(int i = 0; i < bytesRead; i++) {
if(dataIndex < fileData.length && i < buf.length) {
fileData[dataIndex] = buf[i];
dataIndex++;
}
}
}
return fileData;
}
private String replacePictureLinks(String templateBody,
Map<String, Integer> imageBindMap) {
for(String imageName : imageBindMap.keySet()) {
Integer imageId = imageBindMap.get(imageName);
String newImageUrl = CmsUtils.generateMediaFileUrl(imageId);
templateBody = templateBody.replaceAll("./" + imageName, newImageUrl);
templateBody = templateBody.replaceAll(imageName, newImageUrl);
}
return templateBody;
}
private int createEmptyCMTemplate(HttpServletRequest request) {
Locale locale = (Locale) request.getSession()
.getAttribute(org.apache.struts.Globals.LOCALE_KEY);
ResourceBundle bundle = ResourceBundle.getBundle("cmsmessages", locale);
CMTemplate template = new CMTemplate();
template.setCompanyId(AgnUtils.getCompanyID(request));
template.setName(bundle.getString("NewCMTemplateName"));
template.setDescription(bundle.getString("NewCMDescription"));
template.setContent(new byte[]{0});
template = getTemplateManager().createCMTemplate(template);
return template.getId();
}
private int storeMediaFile(byte[] fileData, String entryName,
int cmTemplateId, HttpServletRequest request) {
// get mime-type for file
String mimeType = CmsUtils.UNKNOWN_MIME_TYPE;
Collection mimeTypes = MimeUtil.getMimeTypes(entryName);
if(!mimeTypes.isEmpty()) {
MimeType type = (MimeType) mimeTypes.iterator().next();
mimeType = type.toString();
}
// store media file
MediaFile mediaFile = new MediaFile();
mediaFile.setCompanyId(AgnUtils.getCompanyID(request));
mediaFile.setCmTemplateId(cmTemplateId);
mediaFile.setName(entryName);
mediaFile.setMimeType(mimeType);
mediaFile.setContent(fileData);
mediaFile = getMediaManager().createMediaFile(mediaFile);
return mediaFile.getId();
}
private boolean saveCMTemplate(CMTemplateForm aForm) {
return getTemplateManager().updateCMTemplate(aForm.getCmTemplateId(),
aForm.getName(), aForm.getDescription());
}
private void loadCMTemplate(HttpServletRequest request, CMTemplateForm aForm) {
CMTemplate template = getTemplateManager().getCMTemplate(aForm.getCmTemplateId());
if(template != null) {
aForm.setName(template.getName());
aForm.setDescription(template.getDescription());
}
AgnUtils.userlogger().info(AgnUtils.getAdmin(request).getUsername() + ": do load CM template " + aForm.getName());
}
private void deleteImage(HttpServletRequest request){
int idImage = Integer.parseInt(request.getParameter("cmTemplateMediaFileId"));
this.getMediaManager().removeMediaFile(idImage);
}
private List<MediaFile> getMediaFile(int cmTemplateId) {
return getMediaManager().getMediaFilesForContentModuleTemplate(cmTemplateId);
}
private void saveEditTemplate(HttpServletRequest request, CMTemplateForm aForm) throws Exception{
for (MediaFile mediaFile : aForm.getLMediaFile()) {
final String imageUploadOrExternalSelect = request.getParameter(String.format("imageUploadOrExternal.%s.select", mediaFile.getId()));
final String imageUploadOrExternalUrl = request.getParameter(String.format("imageUploadOrExternal.%s.url", mediaFile.getId()));
final String changeImageSelect = request.getParameter(String.format("changeImage.%s.select", mediaFile.getId()));
if (!StringUtils.isEmpty(changeImageSelect) && changeImageSelect.equals("on")) {
if (!StringUtils.isEmpty(imageUploadOrExternalSelect)) {
if (imageUploadOrExternalSelect.equals("upload")) {
saveUploadImage(aForm, mediaFile.getId());
} else if (imageUploadOrExternalSelect.equals("external")) {
if (!StringUtils.isEmpty(imageUploadOrExternalSelect)){
getMediaManager().updateMediaFile(new MediaFile(0, 0, getImageToUrl(imageUploadOrExternalUrl), 0, 0, mediaFile.getId(), 0, null, null));
}
}
}
}
}
MediaFile mediaFile = new MediaFile(aForm.getCmTemplateId(), AgnUtils.getCompanyID(request),
null, 0, 0, -1, 0, "image/jpeg", null);
final String imageUploadOrExternalNew = request.getParameter("imageUploadOrExternal.new.select");
final String changeImageNewSelect = request.getParameter("changeImage.new.select");
if (!StringUtils.isEmpty(changeImageNewSelect) && changeImageNewSelect.equals("on")) {
mediaFile.setName("template-media/" + request.getParameter("name.new.text"));
if (!StringUtils.isEmpty(imageUploadOrExternalNew)) {
if (imageUploadOrExternalNew.equals("upload")) {
if (aForm.getLNewFile().containsKey(-1)) {
String fileName = aForm.getLNewFile().get(-1).getFileName();
mediaFile.setName("template-media/" + fileName);
mediaFile.setContent(aForm.getLNewFile().get(-1).getFileData());
getMediaManager().createMediaFile(mediaFile);
}
} else if (imageUploadOrExternalNew.equals("external")) {
final String image = request.getParameter("imageUploadOrExternal.new.url");
final String type = image.substring(image.lastIndexOf('.') + 1);
if (type.equals("gif")) {
mediaFile.setMimeType("image/gif");
} else if (type.equals("png")) {
mediaFile.setMimeType("image/png");
}
if (!StringUtils.isEmpty(image)){
mediaFile.setContent(getImageToUrl(image));
}
getMediaManager().createMediaFile(mediaFile);
}
}
}
replaceAgnitasTagImage(aForm, request);
}
private void replaceAgnitasTagImage(CMTemplateForm aForm,HttpServletRequest req){
String content = aForm.getContentTemplate();
String sPattern = "\\[agnIMAGE\\s*name=\"(.*)\"\\]";
Pattern pattern = Pattern.compile(sPattern);
Matcher matcher = pattern.matcher(content);
MediaFile mediaFile = null;
while (matcher.find()) {
mediaFile = getMediaManager().getMediaFileForContentModelAndMediaName(aForm.getCmTemplateId(),matcher.group(1));
if (mediaFile == null){continue;}
String imgTag = CmsUtils.generateMediaFileUrl(mediaFile.getId());
content = content.replaceFirst(sPattern,imgTag);
}
aForm.setContentTemplateNoConvertion(content);
getTemplateManager().updateContent(aForm.getCmTemplateId(),content.getBytes(Charset.forName("UTF-8")));
new PreviewImageGenerator(getWebApplicationContext(),req.getSession(), PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT).
generatePreview(aForm.getCmTemplateId(), 0, 0);
}
private String getContentTemplate(int cmTemplateId){
return new String(getTemplateManager().getCMTemplate(cmTemplateId).getContent(), Charset.forName("UTF-8"));
}
private void saveUploadImage(CMTemplateForm aForm,int id) throws IOException{
if(aForm.getLNewFile().containsKey(id)) {
Map<Integer, FormFile> mTemp = aForm.getLNewFile();
FormFile ffTemp = mTemp.get(id);
getMediaManager().updateMediaFile(new MediaFile(0, 0, ffTemp.getFileData(), 0, 0, id, 0, null, null));
}
}
private byte[] getImageToUrl(String address) throws IOException {
URL url = new URL(address);
InputStream urlInputStream = url.openStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1];
int n = 0;
while ((n = urlInputStream.read(buffer, 0, buffer.length)) > 0) {
outputStream.write(buffer);
}
return outputStream.toByteArray();
}
private MediaFileDaoImpl getMediaFileDao(){
MediaFileDaoImpl mediaFileDao = new MediaFileDaoImpl();
mediaFileDao.setApplicationContext(getWebApplicationContext());
return mediaFileDao;
}
protected void deleteCMTemplate(int templateId, HttpServletRequest req) {
getTemplateManager().deleteCMTemplate(templateId);
getMediaManager().removeMediaFilesForCMTemplateId(templateId);
AgnUtils.userlogger().info(AgnUtils.getAdmin(req).getUsername() + ": delete CM template " + templateId);
}
private String getCmTemplatePreview(int cmTemplateId) {
CMTemplate template = getTemplateManager().getCMTemplate(cmTemplateId);
if(template != null) {
try {
String templateContent = new String(template.getContent(), Charset.forName("UTF-8").name());
templateContent = CmsUtils.appendImageURLsWithSystemUrl(templateContent);
return templateContent;
} catch(UnsupportedEncodingException e) {
AgnUtils.logger().warn("Wrong charser name", e);
}
}
return "";
}
/**
* Gets list of CM Templates for overview-page table
*/
public List<CMTemplate> getCMTemplateList(HttpServletRequest request) throws
IllegalAccessException, InstantiationException {
return getTemplateManager().getCMTemplates(AgnUtils.getCompanyID(request));
}
/**
* Gets list of mailings for assign-page
*/
public PaginatedList getMailingsList(HttpServletRequest req,
CMTemplateForm templateForm) throws
IllegalAccessException, InstantiationException {
PaginatedList mailingList = getPageMailings(req, templateForm,
(MailingDao) getBean("MailingDao"));
List<Integer> mailingIds = getMailingIds(mailingList);
CmsMailingDao cmsMailingDao = (CmsMailingDao) getWebApplicationContext()
.getBean("CmsMailingDao");
List<Integer> mailingWithNoClassicTemplate =
cmsMailingDao.getMailingsWithNoClassicTemplate(mailingIds,
AgnUtils.getCompanyID(req));
Map<Integer, Integer> mailBinding = getTemplateManager()
.getMailingBinding(mailingIds);
templateForm.setOldAssignment(mailBinding);
List<Map> resultList = new ArrayList<Map>();
for(Object object : mailingList.getList()) {
Number mailingId;
String shortname;
String description;
if (object instanceof MailingBase) {
MailingBase mailingBean = (MailingBase) object;
mailingId = mailingBean.getId();
shortname = mailingBean.getShortname();
description = mailingBean.getDescription();
} else {
Map mailingMap = (Map) object;
mailingId = (Number)mailingMap.get("mailingid");
shortname = String.valueOf(mailingMap.get("shortname"));
description = AgnUtils.getStringFromNull(String.valueOf(mailingMap.get("description")));
}
Integer bindTemplate = mailBinding.get(mailingId.intValue());
boolean assigned = bindTemplate != null &&
bindTemplate == templateForm.getCmTemplateId();
Map newBean = new HashMap();
newBean.put("mailingid", mailingId);
newBean.put("shortname", shortname);
newBean.put("description", description);
newBean.put("hasCMTemplate", bindTemplate != null);
newBean.put("assigned", assigned);
newBean.put("hasClassicTemplate",
!mailingWithNoClassicTemplate.contains(mailingId.intValue()));
resultList.add(newBean);
}
mailingList.getList().clear();
mailingList.getList().addAll(resultList);
return mailingList;
}
public static PaginatedList getPageMailings(HttpServletRequest req,
StrutsFormBase aForm,
MailingDao mailingDao) {
String sort1 = req.getParameter("sort");
if(sort1 == null) {
sort1 = aForm.getSort();
} else {
aForm.setSort(sort1);
}
String sort = sort1;
String direction = req.getParameter("dir");
if(direction == null) {
direction = aForm.getOrder();
} else {
aForm.setOrder(direction);
}
String pageStr = req.getParameter("page");
if(pageStr == null || "".equals(pageStr.trim())) {
if(aForm.getPage() == null || "".equals(aForm.getPage().trim())) {
aForm.setPage("1");
}
pageStr = aForm.getPage();
} else {
aForm.setPage(pageStr);
}
if(aForm.isNumberOfRowsChanged()) {
aForm.setPage("1");
aForm.setNumberOfRowsChanged(false);
pageStr = "1";
}
int page = Integer.parseInt(pageStr);
int rownums = aForm.getNumberofRows();
PaginatedList mailingList = mailingDao.getMailingList(AgnUtils.getCompanyID(req),
"0", false, sort, direction, page, rownums);
return mailingList;
}
public static List<Integer> getMailingIds(PaginatedList mailingList) {
List<Integer> mailingIds = new ArrayList<Integer>();
for(Object object : mailingList.getList()) {
int mailingId = object instanceof MailingBase ? ((MailingBase) object).getId() : ((Number)((Map) object).get("mailingid")).intValue();
mailingIds.add(mailingId);//mailingBean.getId());
}
return mailingIds;
}
private CMTemplateManager getTemplateManager() {
return CmsUtils.getCMTemplateManager(getWebApplicationContext());
}
private MediaFileManager getMediaManager() {
return CmsUtils.getMediaFileManager(getWebApplicationContext());
}
}