| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 |
| * |
| * 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 org.ofbiz.product.imagemanagement; |
| |
| import java.awt.Image; |
| import java.awt.image.BufferedImage; |
| import java.awt.image.ImagingOpException; |
| import java.awt.image.RenderedImage; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.RandomAccessFile; |
| import java.nio.ByteBuffer; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| import javax.imageio.ImageIO; |
| |
| import javolution.util.FastList; |
| import javolution.util.FastMap; |
| |
| import org.jdom.JDOMException; |
| import org.ofbiz.base.util.Debug; |
| import org.ofbiz.base.util.UtilDateTime; |
| import org.ofbiz.base.util.UtilGenerics; |
| import org.ofbiz.base.util.UtilMisc; |
| import org.ofbiz.base.util.UtilProperties; |
| import org.ofbiz.base.util.UtilValidate; |
| import org.ofbiz.base.util.string.FlexibleStringExpander; |
| import org.ofbiz.common.image.ImageTransform; |
| import org.ofbiz.entity.Delegator; |
| import org.ofbiz.entity.GenericEntityException; |
| import org.ofbiz.entity.GenericValue; |
| import org.ofbiz.entity.util.EntityQuery; |
| import org.ofbiz.entity.util.EntityUtil; |
| import org.ofbiz.entity.util.EntityUtilProperties; |
| import org.ofbiz.service.DispatchContext; |
| import org.ofbiz.service.GenericServiceException; |
| import org.ofbiz.service.LocalDispatcher; |
| import org.ofbiz.service.ServiceUtil; |
| |
| /** |
| * Product Services |
| */ |
| public class ImageManagementServices { |
| |
| public static final String module = ImageManagementServices.class.getName(); |
| public static final String resource = "ProductErrorUiLabels"; |
| private static int imageCount = 0; |
| private static String imagePath; |
| |
| public static Map<String, Object> addMultipleuploadForProduct(DispatchContext dctx, Map<String, ? extends Object> context) |
| throws IOException, JDOMException { |
| |
| Map<String, Object> result = FastMap.newInstance(); |
| LocalDispatcher dispatcher = dctx.getDispatcher(); |
| Delegator delegator = dctx.getDelegator(); |
| GenericValue userLogin = (GenericValue) context.get("userLogin"); |
| String productId = (String) context.get("productId"); |
| productId = productId.trim(); |
| String productContentTypeId = (String) context.get("productContentTypeId"); |
| ByteBuffer imageData = (ByteBuffer) context.get("uploadedFile"); |
| String uploadFileName = (String) context.get("_uploadedFile_fileName"); |
| String imageResize = (String) context.get("imageResize"); |
| Locale locale = (Locale) context.get("locale"); |
| |
| if (UtilValidate.isNotEmpty(uploadFileName)) { |
| String imageFilenameFormat = EntityUtilProperties.getPropertyValue("catalog", "image.filename.format", delegator); |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| String imageServerUrl = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.url", delegator), context); |
| String rootTargetDirectory = imageServerPath; |
| File rootTargetDir = new File(rootTargetDirectory); |
| if (!rootTargetDir.exists()) { |
| boolean created = rootTargetDir.mkdirs(); |
| if (!created) { |
| String errMsg = "Cannot create the target directory"; |
| Debug.logFatal(errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } |
| } |
| |
| String sizeType = null; |
| if (UtilValidate.isNotEmpty(imageResize)) { |
| sizeType = imageResize; |
| } |
| |
| Map<String, Object> contentCtx = FastMap.newInstance(); |
| contentCtx.put("contentTypeId", "DOCUMENT"); |
| contentCtx.put("userLogin", userLogin); |
| Map<String, Object> contentResult = FastMap.newInstance(); |
| try { |
| contentResult = dispatcher.runSync("createContent", contentCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| String contentId = (String) contentResult.get("contentId"); |
| result.put("contentFrameId", contentId); |
| result.put("contentId", contentId); |
| |
| // File to use for original image |
| FlexibleStringExpander filenameExpander = FlexibleStringExpander.getInstance(imageFilenameFormat); |
| String fileLocation = filenameExpander.expandString(UtilMisc.toMap("location", "products", "type", sizeType, "id", contentId)); |
| String filenameToUse = fileLocation; |
| if (fileLocation.lastIndexOf("/") != -1) { |
| filenameToUse = fileLocation.substring(fileLocation.lastIndexOf("/") + 1); |
| } |
| |
| String fileContentType = (String) context.get("_uploadedFile_contentType"); |
| if (fileContentType.equals("image/pjpeg")) { |
| fileContentType = "image/jpeg"; |
| } else if (fileContentType.equals("image/x-png")) { |
| fileContentType = "image/png"; |
| } |
| |
| List<GenericValue> fileExtension = FastList.newInstance(); |
| try { |
| fileExtension = EntityQuery.use(delegator).from("FileExtension").where("mimeTypeId", fileContentType).queryList(); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| GenericValue extension = EntityUtil.getFirst(fileExtension); |
| if (extension != null) { |
| filenameToUse += "." + extension.getString("fileExtensionId"); |
| } |
| |
| // Create folder product id. |
| String targetDirectory = imageServerPath + "/" + productId; |
| File targetDir = new File(targetDirectory); |
| if (!targetDir.exists()) { |
| boolean created = targetDir.mkdirs(); |
| if (!created) { |
| String errMsg = "Cannot create the target directory"; |
| Debug.logFatal(errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } |
| } |
| |
| File file = new File(imageServerPath + "/" + productId + "/" + uploadFileName); |
| String imageName = null; |
| imagePath = imageServerPath + "/" + productId + "/" + uploadFileName; |
| file = checkExistsImage(file); |
| if (UtilValidate.isNotEmpty(file)) { |
| imageName = file.getPath(); |
| imageName = imageName.substring(imageName.lastIndexOf(File.separator) + 1); |
| } |
| |
| if (UtilValidate.isEmpty(imageResize)) { |
| // Create image file original to folder product id. |
| try { |
| RandomAccessFile out = new RandomAccessFile(file, "rw"); |
| out.write(imageData.array()); |
| out.close(); |
| } catch (FileNotFoundException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteFile", UtilMisc.toMap("fileName", file.getAbsolutePath()), locale)); |
| } catch (IOException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteBinaryData", UtilMisc.toMap("fileName", file.getAbsolutePath()), locale)); |
| } |
| } |
| // Scale Image in different sizes |
| if (UtilValidate.isNotEmpty(imageResize)) { |
| File fileOriginal = new File(imageServerPath + "/" + productId + "/" + imageName); |
| fileOriginal = checkExistsImage(fileOriginal); |
| uploadFileName = fileOriginal.getName(); |
| |
| try { |
| RandomAccessFile outFile = new RandomAccessFile(fileOriginal, "rw"); |
| outFile.write(imageData.array()); |
| outFile.close(); |
| } catch (FileNotFoundException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteFile", UtilMisc.toMap("fileName", fileOriginal.getAbsolutePath()), locale)); |
| } catch (IOException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteBinaryData", UtilMisc.toMap("fileName", fileOriginal.getAbsolutePath()), locale)); |
| } |
| |
| Map<String, Object> resultResize = FastMap.newInstance(); |
| try { |
| resultResize.putAll(ImageManagementServices.scaleImageMangementInAllSize(context, imageName, sizeType, productId)); |
| } catch (IOException e) { |
| String errMsg = "Scale additional image in all different sizes is impossible : " + e.toString(); |
| Debug.logError(e, errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } catch (JDOMException e) { |
| String errMsg = "Errors occur in parsing ImageProperties.xml : " + e.toString(); |
| Debug.logError(e, errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } |
| } |
| |
| Map<String, Object> contentThumbnail = createContentThumbnail(dctx, context, userLogin, imageData, productId, imageName); |
| String filenameToUseThumb = (String) contentThumbnail.get("filenameToUseThumb"); |
| String contentIdThumb = (String) contentThumbnail.get("contentIdThumb"); |
| |
| String imageUrl = imageServerUrl + "/" + productId + "/" + imageName; |
| String imageUrlThumb = imageServerUrl + "/" + productId + "/" + filenameToUseThumb; |
| |
| createContentAndDataResource(dctx, userLogin, imageName, imageUrl, contentId, fileContentType); |
| createContentAndDataResource(dctx, userLogin, filenameToUseThumb, imageUrlThumb, contentIdThumb, fileContentType); |
| |
| Map<String, Object> createContentAssocMap = FastMap.newInstance(); |
| createContentAssocMap.put("contentAssocTypeId", "IMAGE_THUMBNAIL"); |
| createContentAssocMap.put("contentId", contentId); |
| createContentAssocMap.put("contentIdTo", contentIdThumb); |
| createContentAssocMap.put("userLogin", userLogin); |
| createContentAssocMap.put("mapKey", "100"); |
| try { |
| dispatcher.runSync("createContentAssoc", createContentAssocMap); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| Map<String, Object> productContentCtx = FastMap.newInstance(); |
| productContentCtx.put("productId", productId); |
| productContentCtx.put("productContentTypeId", productContentTypeId); |
| productContentCtx.put("fromDate", UtilDateTime.nowTimestamp()); |
| productContentCtx.put("userLogin", userLogin); |
| productContentCtx.put("contentId", contentId); |
| productContentCtx.put("statusId", "IM_PENDING"); |
| try { |
| dispatcher.runSync("createProductContent", productContentCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| Map<String, Object> contentApprovalCtx = FastMap.newInstance(); |
| contentApprovalCtx.put("contentId", contentId); |
| contentApprovalCtx.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("createImageContentApproval", contentApprovalCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| String autoApproveImage = EntityUtilProperties.getPropertyValue("catalog", "image.management.autoApproveImage", delegator); |
| if (autoApproveImage.equals("Y")) { |
| Map<String, Object> autoApproveCtx = FastMap.newInstance(); |
| autoApproveCtx.put("contentId", contentId); |
| autoApproveCtx.put("userLogin", userLogin); |
| autoApproveCtx.put("checkStatusId", "IM_APPROVED"); |
| try { |
| dispatcher.runSync("updateStatusImageManagement", autoApproveCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| } |
| } |
| return result; |
| } |
| |
| public static Map<String, Object> removeImageFileForImageManagement(DispatchContext dctx, Map<String, ? extends Object> context){ |
| String productId = (String) context.get("productId"); |
| String contentId = (String) context.get("contentId"); |
| String dataResourceName = (String) context.get("dataResourceName"); |
| Delegator delegator = dctx.getDelegator(); |
| |
| try { |
| if (UtilValidate.isNotEmpty(contentId)) { |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| File file = new File(imageServerPath + "/" + productId + "/" + dataResourceName); |
| file.delete(); |
| } |
| } catch (Exception e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| return ServiceUtil.returnSuccess(); |
| } |
| |
| public static Map<String, Object> scaleImageMangementInAllSize(Map<String, ? extends Object> context, String filenameToUse, String resizeType, String productId) |
| throws IllegalArgumentException, ImagingOpException, IOException, JDOMException { |
| |
| /* VARIABLES */ |
| Locale locale = (Locale) context.get("locale"); |
| List<String> sizeTypeList = null; |
| if (UtilValidate.isNotEmpty(resizeType)) { |
| sizeTypeList = UtilMisc.toList(resizeType); |
| } else { |
| sizeTypeList = UtilMisc.toList("small","100x75", "150x112", "320x240", "640x480", "800x600", "1024x768", "1280x1024", "1600x1200"); |
| } |
| |
| int index; |
| Map<String, Map<String, String>> imgPropertyMap = FastMap.newInstance(); |
| BufferedImage bufImg, bufNewImg; |
| double imgHeight, imgWidth; |
| Map<String, String> imgUrlMap = FastMap.newInstance(); |
| Map<String, Object> resultXMLMap = FastMap.newInstance(); |
| Map<String, Object> resultBufImgMap = FastMap.newInstance(); |
| Map<String, Object> resultScaleImgMap = FastMap.newInstance(); |
| Map<String, Object> result = FastMap.newInstance(); |
| |
| /* ImageProperties.xml */ |
| String imgPropertyFullPath = System.getProperty("ofbiz.home") + "/applications/product/config/ImageProperties.xml"; |
| resultXMLMap.putAll(ImageTransform.getXMLValue(imgPropertyFullPath, locale)); |
| if (resultXMLMap.containsKey("responseMessage") && resultXMLMap.get("responseMessage").equals("success")) { |
| imgPropertyMap.putAll(UtilGenerics.<Map<String, Map<String, String>>>cast(resultXMLMap.get("xml"))); |
| } else { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.unable_to_parse", locale) + " : ImageProperties.xml"; |
| Debug.logError(errMsg, module); |
| result.put("errorMessage", errMsg); |
| return result; |
| } |
| |
| /* IMAGE */ |
| // get Name and Extension |
| index = filenameToUse.lastIndexOf("."); |
| String imgExtension = filenameToUse.substring(index + 1); |
| // paths |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", (Delegator) context.get("delegator")), context); |
| String imageServerUrl = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.url", (Delegator) context.get("delegator")), context); |
| |
| |
| /* get original BUFFERED IMAGE */ |
| resultBufImgMap.putAll(ImageTransform.getBufferedImage(imageServerPath + "/" + productId + "/" + filenameToUse, locale)); |
| |
| if (resultBufImgMap.containsKey("responseMessage") && resultBufImgMap.get("responseMessage").equals("success")) { |
| bufImg = (BufferedImage) resultBufImgMap.get("bufferedImage"); |
| |
| // get Dimensions |
| imgHeight = bufImg.getHeight(); |
| imgWidth = bufImg.getWidth(); |
| if (imgHeight == 0.0 || imgWidth == 0.0) { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.one_current_image_dimension_is_null", locale) + " : imgHeight = " + imgHeight + " ; imgWidth = " + imgWidth; |
| Debug.logError(errMsg, module); |
| result.put("errorMessage", errMsg); |
| return result; |
| } |
| |
| /* scale Image for each Size Type */ |
| for (String sizeType : sizeTypeList) { |
| resultScaleImgMap.putAll(ImageTransform.scaleImage(bufImg, imgHeight, imgWidth, imgPropertyMap, sizeType, locale)); |
| |
| if (resultScaleImgMap.containsKey("responseMessage") && resultScaleImgMap.get("responseMessage").equals("success")) { |
| bufNewImg = (BufferedImage) resultScaleImgMap.get("bufferedImage"); |
| |
| // write the New Scaled Image |
| |
| String targetDirectory = imageServerPath + "/" + productId; |
| File targetDir = new File(targetDirectory); |
| if (!targetDir.exists()) { |
| boolean created = targetDir.mkdirs(); |
| if (!created) { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.unable_to_create_target_directory", locale) + " - " + targetDirectory; |
| Debug.logFatal(errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } |
| } |
| |
| // write new image |
| try { |
| ImageIO.write(bufNewImg, imgExtension, new File(imageServerPath + "/" + productId + "/" + filenameToUse)); |
| File deleteFile = new File(imageServerPath + "/" + filenameToUse); |
| deleteFile.delete(); |
| //FIXME can be removed ? |
| // boolean check = deleteFile.delete(); |
| } catch (IllegalArgumentException e) { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.one_parameter_is_null", locale) + e.toString(); |
| Debug.logError(errMsg, module); |
| result.put("errorMessage", errMsg); |
| return result; |
| } catch (IOException e) { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.error_occurs_during_writing", locale) + e.toString(); |
| Debug.logError(errMsg, module); |
| result.put("errorMessage", errMsg); |
| return result; |
| } |
| |
| /* write Return Result */ |
| String imageUrl = imageServerUrl + "/" + productId + "/" + filenameToUse; |
| imgUrlMap.put(sizeType, imageUrl); |
| |
| } // scaleImgMap |
| } // sizeIter |
| |
| result.put("responseMessage", "success"); |
| result.put("imageUrlMap", imgUrlMap); |
| result.put("original", resultBufImgMap); |
| return result; |
| |
| } else { |
| String errMsg = UtilProperties.getMessage(resource, "ScaleImage.unable_to_scale_original_image", locale) + " : " + filenameToUse; |
| Debug.logError(errMsg, module); |
| result.put("errorMessage", errMsg); |
| return ServiceUtil.returnError(errMsg); |
| } |
| } |
| |
| public static Map<String, Object> createContentAndDataResource(DispatchContext dctx, GenericValue userLogin, String filenameToUse, String imageUrl, String contentId, String fileContentType){ |
| Map<String, Object> result = FastMap.newInstance(); |
| LocalDispatcher dispatcher = dctx.getDispatcher(); |
| Delegator delegator = dctx.getDelegator(); |
| |
| Map<String, Object> dataResourceCtx = FastMap.newInstance(); |
| |
| dataResourceCtx.put("objectInfo", imageUrl); |
| dataResourceCtx.put("dataResourceName", filenameToUse); |
| dataResourceCtx.put("userLogin", userLogin); |
| dataResourceCtx.put("dataResourceTypeId", "IMAGE_OBJECT"); |
| dataResourceCtx.put("mimeTypeId", fileContentType); |
| dataResourceCtx.put("isPublic", "Y"); |
| |
| Map<String, Object> dataResourceResult = FastMap.newInstance(); |
| try { |
| dataResourceResult = dispatcher.runSync("createDataResource", dataResourceCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| String dataResourceId = (String) dataResourceResult.get("dataResourceId"); |
| result.put("dataResourceFrameId", dataResourceId); |
| result.put("dataResourceId", dataResourceId); |
| |
| Map<String, Object> contentUp = FastMap.newInstance(); |
| contentUp.put("contentId", contentId); |
| contentUp.put("dataResourceId", dataResourceResult.get("dataResourceId")); |
| contentUp.put("contentName", filenameToUse); |
| contentUp.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("updateContent", contentUp); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| GenericValue content = null; |
| try { |
| content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| if (content != null) { |
| GenericValue dataResource = null; |
| try { |
| dataResource = content.getRelatedOne("DataResource", false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| if (dataResource != null) { |
| dataResourceCtx.put("dataResourceId", dataResource.getString("dataResourceId")); |
| try { |
| dispatcher.runSync("updateDataResource", dataResourceCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| } |
| } |
| return result; |
| } |
| |
| public static Map<String, Object> createContentThumbnail(DispatchContext dctx, Map<String, ? extends Object> context, GenericValue userLogin, ByteBuffer imageData, String productId, String imageName){ |
| Map<String, Object> result = FastMap.newInstance(); |
| LocalDispatcher dispatcher = dctx.getDispatcher(); |
| Delegator delegator = dctx.getDelegator(); |
| Locale locale = (Locale) context.get("locale"); |
| //FIXME can be removed ? |
| // String imageFilenameFormat = UtilProperties.getPropertyValue("catalog", "image.filename.format"); |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| String nameOfThumb = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.nameofthumbnail", delegator), context); |
| |
| // Create content for thumbnail |
| Map<String, Object> contentThumb = FastMap.newInstance(); |
| contentThumb.put("contentTypeId", "DOCUMENT"); |
| contentThumb.put("userLogin", userLogin); |
| Map<String, Object> contentThumbResult = FastMap.newInstance(); |
| try { |
| contentThumbResult = dispatcher.runSync("createContent", contentThumb); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| String contentIdThumb = (String) contentThumbResult.get("contentId"); |
| result.put("contentIdThumb", contentIdThumb); |
| |
| /*// File to use for image thumbnail |
| FlexibleStringExpander filenameExpanderThumb = FlexibleStringExpander.getInstance(imageFilenameFormat); |
| String fileLocationThumb = filenameExpanderThumb.expandString(UtilMisc.toMap("location", "products", "type", "small", "id", contentIdThumb)); |
| String filenameToUseThumb = fileLocationThumb; |
| if (fileLocationThumb.lastIndexOf("/") != -1) { |
| filenameToUseThumb = fileLocationThumb.substring(fileLocationThumb.lastIndexOf("/") + 1); |
| } |
| |
| String fileContentType = (String) context.get("_uploadedFile_contentType"); |
| if (fileContentType.equals("image/pjpeg")) { |
| fileContentType = "image/jpeg"; |
| } else if (fileContentType.equals("image/x-png")) { |
| fileContentType = "image/png"; |
| } |
| |
| List<GenericValue> fileExtensionThumb = FastList.newInstance(); |
| try { |
| fileExtensionThumb = delegator.findByAnd("FileExtension", UtilMisc.toMap("mimeTypeId", fileContentType), null, false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| GenericValue extensionThumb = EntityUtil.getFirst(fileExtensionThumb); |
| if (extensionThumb != null) { |
| filenameToUseThumb += "." + extensionThumb.getString("fileExtensionId"); |
| }*/ |
| //String uploadFileName = (String) context.get("_uploadedFile_fileName"); |
| String filenameToUseThumb = imageName.substring(0 , imageName.indexOf(".")) + nameOfThumb; |
| String fileContentType = (String) context.get("_uploadedFile_contentType"); |
| if (fileContentType.equals("image/pjpeg")) { |
| fileContentType = "image/jpeg"; |
| } else if (fileContentType.equals("image/x-png")) { |
| fileContentType = "image/png"; |
| } |
| |
| List<GenericValue> fileExtensionThumb = FastList.newInstance(); |
| try { |
| fileExtensionThumb = EntityQuery.use(delegator).from("FileExtension").where("mimeTypeId", fileContentType).queryList(); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| GenericValue extensionThumb = EntityUtil.getFirst(fileExtensionThumb); |
| if (extensionThumb != null) { |
| |
| filenameToUseThumb += "." + extensionThumb.getString("fileExtensionId"); |
| } |
| result.put("filenameToUseThumb", filenameToUseThumb); |
| // Create image file thumbnail to folder product id. |
| File fileOriginalThumb = new File(imageServerPath + "/" + productId + "/" + filenameToUseThumb); |
| try { |
| RandomAccessFile outFileThumb = new RandomAccessFile(fileOriginalThumb, "rw"); |
| outFileThumb.write(imageData.array()); |
| outFileThumb.close(); |
| } catch (FileNotFoundException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteFile", |
| UtilMisc.toMap("fileName", fileOriginalThumb.getAbsolutePath()), locale)); |
| } catch (IOException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "ProductImageViewUnableWriteBinaryData", |
| UtilMisc.toMap("fileName", fileOriginalThumb.getAbsolutePath()), locale)); |
| } |
| |
| Map<String, Object> resultResizeThumb = FastMap.newInstance(); |
| try { |
| resultResizeThumb.putAll(ImageManagementServices.scaleImageMangementInAllSize(context, filenameToUseThumb, "thumbnail", productId)); |
| } catch (IOException e) { |
| String errMsg = "Scale additional image in all different sizes is impossible : " + e.toString(); |
| Debug.logError(e, errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } catch (JDOMException e) { |
| String errMsg = "Errors occur in parsing ImageProperties.xml : " + e.toString(); |
| Debug.logError(e, errMsg, module); |
| return ServiceUtil.returnError(errMsg); |
| } |
| return result; |
| } |
| |
| public static Map<String, Object> resizeImageThumbnail(BufferedImage bufImg, double imgHeight, double imgWidth) { |
| |
| /* VARIABLES */ |
| BufferedImage bufNewImg; |
| double defaultHeight, defaultWidth, scaleFactor; |
| Map<String, Object> result = FastMap.newInstance(); |
| |
| /* DIMENSIONS from ImageProperties */ |
| defaultHeight = 100; |
| defaultWidth = 100; |
| |
| /* SCALE FACTOR */ |
| // find the right Scale Factor related to the Image Dimensions |
| if (imgHeight > imgWidth) { |
| scaleFactor = defaultHeight / imgHeight; |
| |
| // get scaleFactor from the smallest width |
| if (defaultWidth < (imgWidth * scaleFactor)) { |
| scaleFactor = defaultWidth / imgWidth; |
| } |
| } else { |
| scaleFactor = defaultWidth / imgWidth; |
| // get scaleFactor from the smallest height |
| if (defaultHeight < (imgHeight * scaleFactor)) { |
| scaleFactor = defaultHeight / imgHeight; |
| } |
| } |
| |
| int bufImgType; |
| if (BufferedImage.TYPE_CUSTOM == bufImg.getType()) { |
| // apply a type for image majority |
| bufImgType = BufferedImage.TYPE_INT_ARGB_PRE; |
| } else { |
| bufImgType = bufImg.getType(); |
| } |
| |
| // scale original image with new size |
| Image newImg = bufImg.getScaledInstance((int) (imgWidth * scaleFactor), (int) (imgHeight * scaleFactor), Image.SCALE_SMOOTH); |
| |
| bufNewImg = ImageTransform.toBufferedImage(newImg, bufImgType); |
| |
| result.put("bufferedImage", bufNewImg); |
| result.put("scaleFactor", scaleFactor); |
| return result; |
| } |
| |
| public static File checkExistsImage(File file) { |
| if (!file.exists()) { |
| imageCount = 0; |
| imagePath = null; |
| return file; |
| } |
| imageCount++; |
| String filePath = imagePath.substring(0, imagePath.lastIndexOf(".")); |
| String type = imagePath.substring(imagePath.lastIndexOf(".") + 1); |
| file = new File(filePath + "(" + imageCount + ")." + type); |
| return checkExistsImage(file); |
| } |
| |
| public static Map<String, Object> resizeImage(BufferedImage bufImg, double imgHeight, double imgWidth, double resizeHeight, double resizeWidth) { |
| |
| /* VARIABLES */ |
| BufferedImage bufNewImg; |
| double defaultHeight, defaultWidth, scaleFactor; |
| Map<String, Object> result = FastMap.newInstance(); |
| |
| /* DIMENSIONS from ImageProperties */ |
| defaultHeight = resizeHeight; |
| defaultWidth = resizeWidth; |
| |
| /* SCALE FACTOR */ |
| // find the right Scale Factor related to the Image Dimensions |
| if (imgHeight > imgWidth) { |
| scaleFactor = defaultHeight / imgHeight; |
| |
| // get scaleFactor from the smallest width |
| if (defaultWidth < (imgWidth * scaleFactor)) { |
| scaleFactor = defaultWidth / imgWidth; |
| } |
| } else { |
| scaleFactor = defaultWidth / imgWidth; |
| // get scaleFactor from the smallest height |
| if (defaultHeight < (imgHeight * scaleFactor)) { |
| scaleFactor = defaultHeight / imgHeight; |
| } |
| } |
| |
| int bufImgType; |
| if (BufferedImage.TYPE_CUSTOM == bufImg.getType()) { |
| // apply a type for image majority |
| bufImgType = BufferedImage.TYPE_INT_ARGB_PRE; |
| } else { |
| bufImgType = bufImg.getType(); |
| } |
| |
| // scale original image with new size |
| Image newImg = bufImg.getScaledInstance((int) (imgWidth * scaleFactor), (int) (imgHeight * scaleFactor), Image.SCALE_SMOOTH); |
| |
| bufNewImg = ImageTransform.toBufferedImage(newImg, bufImgType); |
| |
| result.put("bufferedImage", bufNewImg); |
| result.put("scaleFactor", scaleFactor); |
| return result; |
| } |
| |
| public static Map<String, Object> createNewImageThumbnail(DispatchContext dctx, Map<String, ? extends Object> context) { |
| LocalDispatcher dispatcher = dctx.getDispatcher(); |
| Delegator delegator = dispatcher.getDelegator(); |
| GenericValue userLogin = (GenericValue) context.get("userLogin"); |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| String imageServerUrl = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.url", delegator), context); |
| String productId = (String) context.get("productId"); |
| String contentId = (String) context.get("contentId"); |
| String dataResourceName = (String) context.get("dataResourceName"); |
| String width = (String) context.get("sizeWidth"); |
| String imageType = ".jpg"; |
| int resizeWidth = Integer.parseInt(width); |
| int resizeHeight = resizeWidth; |
| |
| try { |
| BufferedImage bufImg = ImageIO.read(new File(imageServerPath + "/" + productId + "/" + dataResourceName)); |
| double imgHeight = bufImg.getHeight(); |
| double imgWidth = bufImg.getWidth(); |
| if (dataResourceName.lastIndexOf(".") > 0 && dataResourceName.lastIndexOf(".") < dataResourceName.length()) { |
| imageType = dataResourceName.substring(dataResourceName.lastIndexOf(".")); |
| } |
| |
| String filenameToUse = dataResourceName.substring(0, dataResourceName.length() - 4) + "-" + resizeWidth + imageType; |
| |
| if (dataResourceName.length() > 3) { |
| String mimeType = dataResourceName.substring(dataResourceName.length() - 3, dataResourceName.length()); |
| Map<String, Object> resultResize = ImageManagementServices.resizeImage(bufImg, imgHeight, imgWidth, resizeHeight, resizeWidth); |
| ImageIO.write((RenderedImage) resultResize.get("bufferedImage"), mimeType, new File(imageServerPath + "/" + productId + "/" + filenameToUse)); |
| |
| Map<String, Object> contentThumb = FastMap.newInstance(); |
| contentThumb.put("contentTypeId", "DOCUMENT"); |
| contentThumb.put("userLogin", userLogin); |
| Map<String, Object> contentThumbResult = FastMap.newInstance(); |
| try { |
| contentThumbResult = dispatcher.runSync("createContent", contentThumb); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| String contentIdThumb = (String) contentThumbResult.get("contentId"); |
| String imageUrlThumb = imageServerUrl + "/" + productId + "/" + filenameToUse; |
| ImageManagementServices.createContentAndDataResource(dctx, userLogin, filenameToUse, imageUrlThumb, contentIdThumb, "image/jpeg"); |
| |
| Map<String, Object> createContentAssocMap = FastMap.newInstance(); |
| createContentAssocMap.put("contentAssocTypeId", "IMAGE_THUMBNAIL"); |
| createContentAssocMap.put("contentId", contentId); |
| createContentAssocMap.put("contentIdTo", contentIdThumb); |
| createContentAssocMap.put("userLogin", userLogin); |
| createContentAssocMap.put("mapKey", width); |
| try { |
| dispatcher.runSync("createContentAssoc", createContentAssocMap); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| } |
| } catch (Exception e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| String successMsg = "Create new thumbnail size successful"; |
| return ServiceUtil.returnSuccess(successMsg); |
| } |
| |
| public static Map<String, Object> resizeImageOfProduct(DispatchContext dctx, Map<String, ? extends Object> context) { |
| Delegator delegator = dctx.getDelegator(); |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| String productId = (String) context.get("productId"); |
| String dataResourceName = (String) context.get("dataResourceName"); |
| String width = (String) context.get("resizeWidth"); |
| int resizeWidth = Integer.parseInt(width); |
| int resizeHeight = resizeWidth; |
| |
| try { |
| BufferedImage bufImg = ImageIO.read(new File(imageServerPath + "/" + productId + "/" + dataResourceName)); |
| double imgHeight = bufImg.getHeight(); |
| double imgWidth = bufImg.getWidth(); |
| String filenameToUse = dataResourceName; |
| String mimeType = dataResourceName.substring(dataResourceName.length() - 3, dataResourceName.length()); |
| Map<String, Object> resultResize = ImageManagementServices.resizeImage(bufImg, imgHeight, imgWidth, resizeHeight, resizeWidth); |
| ImageIO.write((RenderedImage) resultResize.get("bufferedImage"), mimeType, new File(imageServerPath + "/" + productId + "/" + filenameToUse)); |
| } catch (Exception e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| String successMsg = "Resize images successful"; |
| return ServiceUtil.returnSuccess(successMsg); |
| } |
| |
| public static Map<String, Object> renameImage(DispatchContext dctx, Map<String, ? extends Object> context) { |
| LocalDispatcher dispatcher = dctx.getDispatcher(); |
| Delegator delegator = dctx.getDelegator(); |
| GenericValue userLogin = (GenericValue) context.get("userLogin"); |
| String imageServerPath = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.path", delegator), context); |
| String imageServerUrl = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.url", delegator), context); |
| String productId = (String) context.get("productId"); |
| String contentId = (String) context.get("contentId"); |
| String filenameToUse = (String) context.get("drDataResourceName"); |
| String imageType = filenameToUse.substring(filenameToUse.lastIndexOf(".")); |
| String imgExtension = filenameToUse.substring(filenameToUse.length() - 3, filenameToUse.length()); |
| String imageUrl = imageServerUrl + "/" + productId + "/" + filenameToUse; |
| |
| try { |
| GenericValue productContent = EntityQuery.use(delegator).from("ProductContentAndInfo").where("productId", productId, "contentId", contentId, "productContentTypeId", "IMAGE").queryFirst(); |
| String dataResourceName = (String) productContent.get("drDataResourceName"); |
| String mimeType = filenameToUse.substring(filenameToUse.lastIndexOf(".")); |
| |
| if (imageType.equals(mimeType)) { |
| BufferedImage bufImg = ImageIO.read(new File(imageServerPath + "/" + productId + "/" + dataResourceName)); |
| ImageIO.write(bufImg, imgExtension, new File(imageServerPath + "/" + productId + "/" + filenameToUse)); |
| |
| File file = new File(imageServerPath + "/" + productId + "/" + dataResourceName); |
| file.delete(); |
| |
| Map<String, Object> contentUp = FastMap.newInstance(); |
| contentUp.put("contentId", contentId); |
| contentUp.put("contentName", filenameToUse); |
| contentUp.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("updateContent", contentUp); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| GenericValue content = null; |
| try { |
| content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| if (content != null) { |
| GenericValue dataResource = null; |
| try { |
| dataResource = content.getRelatedOne("DataResource", false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| if (dataResource != null) { |
| Map<String, Object> dataResourceCtx = FastMap.newInstance(); |
| dataResourceCtx.put("dataResourceId", dataResource.getString("dataResourceId")); |
| dataResourceCtx.put("objectInfo", imageUrl); |
| dataResourceCtx.put("dataResourceName", filenameToUse); |
| dataResourceCtx.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("updateDataResource", dataResourceCtx); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| } |
| } |
| |
| List<GenericValue> contentAssocList = EntityQuery.use(delegator).from("ContentAssoc").where("contentId", contentId, "contentAssocTypeId", "IMAGE_THUMBNAIL").queryList(); |
| if (contentAssocList.size() > 0) { |
| for (int i = 0; i < contentAssocList.size(); i++) { |
| GenericValue contentAssoc = contentAssocList.get(i); |
| |
| List<GenericValue> dataResourceAssocList = EntityQuery.use(delegator).from("ContentDataResourceView").where("contentId", contentAssoc.get("contentIdTo")).queryList(); |
| GenericValue dataResourceAssoc = EntityUtil.getFirst(dataResourceAssocList); |
| |
| String drDataResourceNameAssoc = (String) dataResourceAssoc.get("drDataResourceName"); |
| String filenameToUseAssoc = filenameToUse.substring(0, filenameToUse.length() - 4) + "-" + contentAssoc.get("mapKey") + imageType; |
| String imageUrlAssoc = imageServerUrl + "/" + productId + "/" + filenameToUseAssoc; |
| |
| BufferedImage bufImgAssoc = ImageIO.read(new File(imageServerPath + "/" + productId + "/" + drDataResourceNameAssoc)); |
| ImageIO.write(bufImgAssoc, imgExtension, new File(imageServerPath + "/" + productId + "/" + filenameToUseAssoc)); |
| |
| File fileAssoc = new File(imageServerPath + "/" + productId + "/" + drDataResourceNameAssoc); |
| fileAssoc.delete(); |
| |
| Map<String, Object> contentAssocMap = FastMap.newInstance(); |
| contentAssocMap.put("contentId", contentAssoc.get("contentIdTo")); |
| contentAssocMap.put("contentName", filenameToUseAssoc); |
| contentAssocMap.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("updateContent", contentAssocMap); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| GenericValue contentAssocUp = null; |
| try { |
| contentAssocUp = EntityQuery.use(delegator).from("Content").where("contentId", contentAssoc.get("contentIdTo")).queryOne(); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| if (contentAssocUp != null) { |
| GenericValue dataResourceAssocUp = null; |
| try { |
| dataResourceAssocUp = contentAssocUp.getRelatedOne("DataResource", false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| if (dataResourceAssocUp != null) { |
| Map<String, Object> dataResourceAssocMap = FastMap.newInstance(); |
| dataResourceAssocMap.put("dataResourceId", dataResourceAssocUp.getString("dataResourceId")); |
| dataResourceAssocMap.put("objectInfo", imageUrlAssoc); |
| dataResourceAssocMap.put("dataResourceName", filenameToUseAssoc); |
| dataResourceAssocMap.put("userLogin", userLogin); |
| try { |
| dispatcher.runSync("updateDataResource", dataResourceAssocMap); |
| } catch (GenericServiceException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| } |
| } |
| } |
| } |
| } |
| } catch (Exception e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| String successMsg = "Rename image successfully."; |
| return ServiceUtil.returnSuccess(successMsg); |
| } |
| } |