/*
* Provided by CSTI Consulting
* Following GNU LESSER GENERAL PUBLIC LICENSE
* You may obtain more details at
*
* http://www.csticonsulting.com
* Copyright (c) 2006-2011 Consultation CS-TI inc.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.salesmanager.central.catalog;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.salesmanager.central.BaseAction;
import com.salesmanager.central.profile.Context;
import com.salesmanager.central.profile.ProfileConstants;
import com.salesmanager.central.web.DynamicImage;
import com.salesmanager.core.entity.catalog.Product;
import com.salesmanager.core.entity.merchant.MerchantStore;
import com.salesmanager.core.module.model.application.FileModule;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.catalog.CatalogService;
import com.salesmanager.core.service.merchant.MerchantService;
import com.salesmanager.core.service.reference.ReferenceService;
import com.salesmanager.core.util.FileUtil;
import com.salesmanager.core.util.LabelUtil;
import com.salesmanager.core.util.MessageUtil;
import com.salesmanager.core.util.ProductImageUtil;
import com.salesmanager.core.util.PropertiesUtil;
import com.salesmanager.core.util.SpringUtil;
/**
* Upload and manage product images
* @author Carl Samson
*
*/
public class EditImagesAction extends BaseAction {
private File[] upload;
private String[] uploadFileName;
private String[] uploadContentType;
private static Logger log = Logger.getLogger(EditImagesAction.class);
// image validation
private static long maximagesize;
private static long maxfilesize;
private static Map imgctypes = new HashMap();
private static Configuration conf = PropertiesUtil.getConfiguration();
private Product product;
//id of image to be deleted
private String imageId = null;
static {
String smaxfsize = conf.getString("core.product.image.maxfilesize");
if (smaxfsize == null) {
log
.error("Properties core.product.image.maxfilesize not defined in config.properties");
smaxfsize = "100000";
}
long maxsize = 0;
try {
maxsize = Long.parseLong(smaxfsize);
} catch (Exception e) {
log
.error("Properties core.product.image.maxfilesize not an integer");
maxsize = 100000;
}
maximagesize = maxsize;
smaxfsize = conf.getString("core.product.file.maxfilesize");
if (smaxfsize == null) {
log
.error("Properties core.product.file.maxfilesize not defined in config.properties");
smaxfsize = "8000000";
}
try {
maxsize = Long.parseLong(smaxfsize);
} catch (Exception e) {
log
.error("Properties core.product.file.maxfilesize not an integer");
maxsize = 100000;
}
String ctlist = conf.getString("core.product.image.contenttypes");
if (ctlist == null) {
log.error("No content types defined for images");
} else {
StringTokenizer st = new StringTokenizer(ctlist, ";");
while (st.hasMoreTokens()) {
String ct = (String) st.nextToken();
imgctypes.put(ct, ct);
}
}
maxfilesize = maxsize;
}
public String displayImages() throws Exception {
super.setPageTitle("label.product.images");
//get the product
CatalogService cservice = (CatalogService)ServiceFactory.getService(ServiceFactory.CatalogService);
Product p = cservice.getProduct(this.getProduct().getProductId());
if(p==null || p.getMerchantId()!=super.getContext().getMerchantid()) {
super.setAuthorizationMessage();
displayImages();
return INPUT;
}
p.setLocale(super.getLocale());
this.setProduct(p);
//do this for 4 images
if (!StringUtils.isBlank(product.getProductImage1())) {
DynamicImage img = new DynamicImage();
img
.setImageName(new StringBuffer()
.append(conf
.getString("core.product.image.large.prefix"))
.append("-").append(
this.getProduct().getProductImage1())
.toString());
img.setImagePath(FileUtil.getProductFilePath()
+ "/" + super.getContext().getMerchantid() + "/");
super.getServletRequest().setAttribute("DYNIMG1", img);
super.getServletRequest().setAttribute("uploadimagename1",
product.getProductImage1());
}
if (!StringUtils.isBlank(product.getProductImage2())) {
DynamicImage img = new DynamicImage();
img
.setImageName(new StringBuffer()
.append(conf
.getString("core.product.image.large.prefix"))
.append("-").append(
this.getProduct().getProductImage2())
.toString());
img.setImagePath(FileUtil.getProductFilePath()
+ "/" + super.getContext().getMerchantid() + "/");
super.getServletRequest().setAttribute("DYNIMG2", img);
super.getServletRequest().setAttribute("uploadimagename2",
product.getProductImage2());
}
if (!StringUtils.isBlank(product.getProductImage3())) {
DynamicImage img = new DynamicImage();
img
.setImageName(new StringBuffer()
.append(conf
.getString("core.product.image.large.prefix"))
.append("-").append(
this.getProduct().getProductImage3())
.toString());
img.setImagePath(FileUtil.getProductFilePath()
+ "/" + super.getContext().getMerchantid() + "/");
super.getServletRequest().setAttribute("DYNIMG3", img);
super.getServletRequest().setAttribute("uploadimagename3",
product.getProductImage3());
}
if (!StringUtils.isBlank(product.getProductImage4())) {
DynamicImage img = new DynamicImage();
img
.setImageName(new StringBuffer()
.append(conf
.getString("core.product.image.large.prefix"))
.append("-").append(
this.getProduct().getProductImage4())
.toString());
img.setImagePath(FileUtil.getProductFilePath()
+ "/" + super.getContext().getMerchantid() + "/");
super.getServletRequest().setAttribute("DYNIMG4", img);
super.getServletRequest().setAttribute("uploadimagename4",
product.getProductImage4());
}
super.getServletRequest().setAttribute("imagewidth","200");
super.getServletRequest().setAttribute("imageheight","200");
super.getServletRequest().setAttribute("product.productId",String.valueOf(p.getProductId()));
return SUCCESS;
}
public String saveImages() throws Exception {
super.setPageTitle("label.product.images");
displayImages();
//get product first
CatalogService cservice = (CatalogService)ServiceFactory.getService(ServiceFactory.CatalogService);
Product p = cservice.getProduct(this.getProduct().getProductId());
if(p==null || p.getMerchantId()!=super.getContext().getMerchantid()) {
super.setAuthorizationMessage();
return INPUT;
}
this.getProduct().setMerchantId(p.getMerchantId());
p.setLocale(super.getLocale());
if(upload==null || upload.length==0) {
return INPUT;
}
boolean hasError = false;
//validate images
if (this.getUploadContentType()!=null && this.getUploadContentType().length>0) {
for (String c: uploadContentType) {
if (!imgctypes.containsKey(c)) {
super
.addActionError(
getText("error.message.product.image.invalidfiletype")
+ " "
+ getText("label.product.uploadimage"));
hasError = true;
}
}
}
if (this.getUpload()!=null && this.getUpload().length>0) {
for (File u: upload) {
if (u.length() > this.maximagesize) {
super.addActionError(
getText("error.message.product.image.file") + " "
+ getText("label.product.uploadimage"));
hasError = true;
}
}
}
if(hasError) {
return INPUT;
}
//upload pictures
ReferenceService rservice = (ReferenceService) ServiceFactory
.getService(ServiceFactory.ReferenceService);
MerchantService service = (MerchantService) ServiceFactory
.getService(ServiceFactory.MerchantService);
MerchantStore mStore = service.getMerchantStore(super.getContext()
.getMerchantid());
Map<String, String> moduleConfigMap = rservice
.getModuleConfigurationsKeyValue(mStore
.getTemplateModule(), mStore.getCountry());
for (int i = 0; i< this.getUpload().length;i++) {
File f = this
.getUpload()[i];
ProductImageUtil imageSpecifications = new ProductImageUtil();
imageSpecifications.uploadProductImages(
f, this.getUploadFileName()[i],
this.getUploadContentType()[i],
this.getProduct(), moduleConfigMap);
}
for(int i=0;i<uploadFileName.length;i++) {
if(i==0) {
if(StringUtils.isBlank(p.getProductImage1())) {
p.setProductImage1(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage2())) {
p.setProductImage2(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage3())) {
p.setProductImage3(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage4())) {
p.setProductImage4(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
}
if(i==1) {
if(StringUtils.isBlank(p.getProductImage1())) {
p.setProductImage1(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage2())) {
p.setProductImage2(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage3())) {
p.setProductImage3(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage4())) {
p.setProductImage4(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
}
if(i==2) {
if(StringUtils.isBlank(p.getProductImage1())) {
p.setProductImage1(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage2())) {
p.setProductImage2(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage3())) {
p.setProductImage3(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage4())) {
p.setProductImage4(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
}
if(i==3) {
if(StringUtils.isBlank(p.getProductImage1())) {
p.setProductImage1(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage2())) {
p.setProductImage2(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage3())) {
p.setProductImage3(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
if(StringUtils.isBlank(p.getProductImage4())) {
p.setProductImage4(new StringBuffer().append(p.getProductId()).append("-").append(
uploadFileName[i]).toString());
continue;
}
}
}
cservice.saveOrUpdateProduct(p);
super.setSuccessMessage();
return SUCCESS;
}
public String deleteImage() throws Exception {
// get the product firts
Context ctx = (Context) super.getServletRequest().getSession()
.getAttribute(ProfileConstants.context);
this.displayImages();
CatalogService cservice = (CatalogService)ServiceFactory.getService(ServiceFactory.CatalogService);
Product p = cservice.getProduct(this.getProduct().getProductId());
if(p==null || p.getMerchantId()!=super.getContext().getMerchantid()) {
super.setAuthorizationMessage();
return INPUT;
}
if(StringUtils.isBlank(this.getImageId())) {
log.error("Image id is null");
super.setTechnicalMessage();
return INPUT;
}
String folder = null;
String imagename = null;
int iId = 0;
try {
iId = Integer.parseInt(this.getImageId());
} catch (Exception e) {
log.error("Image id is not numeric " + this.getImageId());
super.setTechnicalMessage();
return INPUT;
}
String imageName = null;
switch (iId) {
case 1:
imageName = p.getProductImage1();
p.setProductImage1(null);
break;
case 2:
imageName = p.getProductImage2();
p.setProductImage2(null);
break;
case 3:
imageName = p.getProductImage3();
p.setProductImage3(null);
break;
case 4:
imageName = p.getProductImage4();
p.setProductImage4(null);
break;
}
if(imageName==null) {
log.error("Invalid image id " + this.getImageId());
super.setTechnicalMessage();
return INPUT;
}
ProductImageUtil imutil = new ProductImageUtil();
folder = FileUtil.getProductFilePath()
+ "/"
+ ctx.getMerchantid() + "/";
cservice.saveOrUpdateProduct(p);
FileModule fh = (FileModule) SpringUtil.getBean("localfile");
fh.deleteFile(ctx.getMerchantid(), new File(new StringBuffer()
.append(folder).append(imageName).toString()));// delete
// regular
fh
.deleteFile(
ctx.getMerchantid(),
new File(
new StringBuffer()
.append(folder)
.append(
conf
.getString("core.product.image.small.prefix"))
.append("-").append(imageName)
.toString()));
fh
.deleteFile(
ctx.getMerchantid(),
new File(
new StringBuffer()
.append(folder)
.append(
conf
.getString("core.product.image.large.prefix"))
.append("-").append(imageName)
.toString()));
super.setSuccessMessage();
return SUCCESS;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getImageId() {
return imageId;
}
public void setImageId(String imageId) {
this.imageId = imageId;
}
}