Modified: ofbiz/branches/release14.12/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java?rev=1801746&r1=1801745&r2=1801746&view=diff ============================================================================== --- ofbiz/branches/release14.12/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java (original) +++ ofbiz/branches/release14.12/applications/product/src/org/ofbiz/product/imagemanagement/ImageManagementServices.java Wed Jul 12 15:28:17 2017 @@ -1,923 +1,923 @@ -/******************************************************************************* - * 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 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; - -import javolution.util.FastList; -import javolution.util.FastMap; - -/** - * 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", dctx.getDelegator()), context); - String imageServerUrl = FlexibleStringExpander.expandString(EntityUtilProperties.getPropertyValue("catalog", "image.management.url", dctx.getDelegator()), 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); - } -} +/******************************************************************************* + * 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()); [... 188 lines stripped ...] |
Free forum by Nabble | Edit this page |