| /******************************************************************************* |
| * 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.apache.ofbiz.birt.flexible; |
| |
| import java.io.OutputStream; |
| import java.io.StringWriter; |
| import java.sql.SQLException; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| import javax.servlet.ServletContext; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.servlet.http.HttpSession; |
| import org.apache.commons.collections4.MapUtils; |
| import org.apache.ofbiz.base.util.Debug; |
| import org.apache.ofbiz.base.util.GeneralException; |
| import org.apache.ofbiz.base.util.StringUtil; |
| import org.apache.ofbiz.base.util.UtilGenerics; |
| import org.apache.ofbiz.base.util.UtilMisc; |
| import org.apache.ofbiz.base.util.UtilProperties; |
| import org.apache.ofbiz.base.util.UtilValidate; |
| import org.apache.ofbiz.base.util.template.FreeMarkerWorker; |
| import org.apache.ofbiz.entity.Delegator; |
| import org.apache.ofbiz.entity.GenericEntityException; |
| import org.apache.ofbiz.entity.GenericValue; |
| import org.apache.ofbiz.entity.condition.EntityCondition; |
| import org.apache.ofbiz.entity.condition.EntityConditionList; |
| import org.apache.ofbiz.entity.condition.EntityExpr; |
| import org.apache.ofbiz.entity.util.EntityQuery; |
| import org.apache.ofbiz.entity.util.EntityUtil; |
| import org.apache.ofbiz.security.Security; |
| import org.apache.ofbiz.service.GenericServiceException; |
| import org.apache.ofbiz.service.LocalDispatcher; |
| import org.eclipse.birt.report.engine.api.EXCELRenderOption; |
| import org.eclipse.birt.report.engine.api.EngineException; |
| import org.eclipse.birt.report.engine.api.HTMLRenderOption; |
| import org.eclipse.birt.report.engine.api.HTMLServerImageHandler; |
| import org.eclipse.birt.report.engine.api.IPDFRenderOption; |
| import org.eclipse.birt.report.engine.api.IReportEngine; |
| import org.eclipse.birt.report.engine.api.IReportRunnable; |
| import org.eclipse.birt.report.engine.api.IRunAndRenderTask; |
| import org.eclipse.birt.report.engine.api.PDFRenderOption; |
| import org.eclipse.birt.report.engine.api.RenderOption; |
| import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants; |
| |
| public final class BirtUtil { |
| |
| public final static String module = BirtUtil.class.getName(); |
| |
| private final static HTMLServerImageHandler imageHandler = new HTMLServerImageHandler(); |
| private final static Map<String, String> entityFieldTypeBirtTypeMap = MapUtils.unmodifiableMap(UtilMisc.toMap( |
| "id", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "url", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "name", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "id-ne", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "value", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "email", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "comment", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "id-long",DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "id-vlong", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "very-long", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "indicator", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "very-short", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "tel-number", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "id-long-ne", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "id-vlong-ne", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "description", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "long-varchar", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "short-varchar", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "credit-card-date", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "credit-card-number", DesignChoiceConstants.COLUMN_DATA_TYPE_STRING, |
| "date-time", DesignChoiceConstants.COLUMN_DATA_TYPE_DATETIME, |
| "date", DesignChoiceConstants.COLUMN_DATA_TYPE_DATE, |
| "time", DesignChoiceConstants.COLUMN_DATA_TYPE_TIME, |
| "currency-amount", DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL, |
| "currency-precise", DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL, |
| "fixed-point", DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL, |
| "floating-point", DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL, |
| "numeric", DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER, |
| "object", DesignChoiceConstants.COLUMN_DATA_TYPE_JAVA_OBJECT, |
| "blob", DesignChoiceConstants.COLUMN_DATA_TYPE_BLOB)); |
| |
| private final static Map<String, String> entityFieldTypeBirtParameterTypeMap = MapUtils.unmodifiableMap(UtilMisc.toMap( |
| "id", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "url", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "name", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "id-ne", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "value", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "email", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "comment", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "id-long",DesignChoiceConstants.PARAM_TYPE_STRING, |
| "id-vlong", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "very-long", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "indicator", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "very-short", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "tel-number", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "id-long-ne", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "id-vlong-ne", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "description", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "long-varchar", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "short-varchar", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "credit-card-date", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "credit-card-number", DesignChoiceConstants.PARAM_TYPE_STRING, |
| "date-time", DesignChoiceConstants.PARAM_TYPE_DATETIME, |
| "date", DesignChoiceConstants.PARAM_TYPE_DATE, |
| "time", DesignChoiceConstants.PARAM_TYPE_TIME, |
| "currency-amount", DesignChoiceConstants.PARAM_TYPE_DECIMAL, |
| "currency-precise", DesignChoiceConstants.PARAM_TYPE_DECIMAL, |
| "fixed-point", DesignChoiceConstants.PARAM_TYPE_DECIMAL, |
| "floating-point", DesignChoiceConstants.PARAM_TYPE_DECIMAL, |
| "numeric", DesignChoiceConstants.PARAM_TYPE_INTEGER, |
| "object", DesignChoiceConstants.PARAM_TYPE_JAVA_OBJECT, |
| "blob", DesignChoiceConstants.PARAM_TYPE_JAVA_OBJECT)); |
| |
| private final static Map<String, String> mimeTypeOutputFormatMap = UtilMisc.toMap( |
| "text/html", RenderOption.OUTPUT_FORMAT_HTML, |
| "application/pdf", RenderOption.OUTPUT_FORMAT_PDF, |
| "application/postscript", "postscript", |
| "application/vnd.ms-word", "doc", |
| "application/vnd.ms-excel", "xls", |
| "application/vnd.ms-powerpoint", "ppt", |
| "application/vnd.oasis.opendocument.text", "odt", |
| "application/vnd.oasis.opendocument.spreadsheet", "ods", |
| "application/vnd.oasis.opendocument.presentation", "odp", |
| "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx", |
| "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx", |
| "application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx"); |
| |
| private BirtUtil() {} |
| |
| /** |
| * Return birt field type corresponding to given entity field type |
| * @param entityFieldType |
| * @return |
| * @throws GeneralException |
| */ |
| public static String convertFieldTypeToBirtType(String entityFieldType) { |
| if (UtilValidate.isEmpty(entityFieldType)) { |
| return null; |
| } |
| return entityFieldTypeBirtTypeMap.get(entityFieldType.toLowerCase()); |
| } |
| |
| /** |
| * Return birt parameter type corresponding to given entity field type |
| * @param entityFieldType |
| * @return |
| * @throws GeneralException |
| */ |
| public static String convertFieldTypeToBirtParameterType(String entityFieldType) { |
| if (UtilValidate.isEmpty(entityFieldType)) { |
| return null; |
| } |
| return entityFieldTypeBirtParameterTypeMap.get(entityFieldType.toLowerCase()); |
| } |
| |
| /** |
| * Return true if mime type related to a contentType is supported by Birt |
| * @param contentType |
| * @return |
| * @throws GeneralException |
| */ |
| public static boolean isSupportedMimeType(String contentType) { |
| return mimeTypeOutputFormatMap.containsKey(contentType); |
| } |
| |
| /** |
| * Return mime type related to a contentType supported by Birt |
| * @param contentType |
| * @return |
| * @throws GeneralException |
| */ |
| public static String getMimeTypeOutputFormat(String contentType) throws GeneralException { |
| if (isSupportedMimeType(contentType)) { |
| return mimeTypeOutputFormatMap.get(contentType); |
| } |
| throw new GeneralException("Unknown content type : " + contentType); |
| } |
| |
| /** |
| * return extension file related to a contentType supported by Birt |
| * @param contentType |
| * @return |
| * @throws GeneralException |
| */ |
| public static String getMimeTypeFileExtension(String contentType) throws GeneralException { |
| return ".".concat(getMimeTypeOutputFormat(contentType)); |
| } |
| |
| /** |
| * Resolve the template path location where rptDesign file are stored, |
| * first try the resolution from birt.properties with rptDesign.output.path |
| * second from content.properties content.upload.path.prefix |
| * and add birtReptDesign directory |
| * default OFBIZ_HOME/runtime/uploads/birtRptDesign/ |
| * @return |
| */ |
| public static String resolveTemplatePathLocation() { |
| String templatePathLocation = UtilProperties.getPropertyValue("birt", "rptDesign.output.path"); |
| if (UtilValidate.isEmpty(templatePathLocation)) { |
| templatePathLocation = UtilProperties.getPropertyValue("content", "content.upload.path.prefix", "runtime/uploads"); |
| } |
| if (! templatePathLocation.endsWith("/")) { |
| templatePathLocation = templatePathLocation.concat("/"); |
| } |
| if (! templatePathLocation.endsWith("/birtRptDesign/")) { |
| templatePathLocation = templatePathLocation.concat("birtRptDesign/"); |
| } |
| if (! templatePathLocation.startsWith("/")) templatePathLocation = System.getProperty("ofbiz.home").concat("/").concat(templatePathLocation); |
| return templatePathLocation; |
| } |
| |
| /** |
| * With the reporting contentId element resolve the path to rptDesign linked |
| * @param delegator |
| * @param contentId |
| * @return |
| * @throws GenericEntityException |
| */ |
| public static String resolveRptDesignFilePathFromContent(Delegator delegator, String contentId) throws GenericEntityException { |
| GenericValue contentRpt = EntityQuery.use(delegator).from("ContentAssoc").where("contentId", contentId).select("contentIdTo").cache().queryFirst(); |
| if (contentRpt != null) { |
| String contentIdRpt = contentRpt.getString("contentIdTo"); |
| List<EntityExpr> listConditions = UtilMisc.toList( |
| EntityCondition.makeCondition("contentTypeId", "RPTDESIGN"), |
| EntityCondition.makeCondition("contentId", contentIdRpt)); |
| EntityConditionList<EntityExpr> ecl = EntityCondition.makeCondition(listConditions); |
| GenericValue dataRessouceRptDesignFile = EntityQuery.use(delegator).from("ContentDataResourceView").where(ecl).select("drObjectInfo").cache().queryFirst(); |
| if (dataRessouceRptDesignFile != null) { |
| return dataRessouceRptDesignFile.getString("drObjectInfo"); |
| } |
| } |
| return ""; |
| } |
| |
| /** |
| * remove all non unicode alphanumeric and replace space by _ |
| * @param reportName |
| * @return |
| */ |
| public static String encodeReportName(String reportName) { |
| if (UtilValidate.isEmpty(reportName)) return ""; |
| return StringUtil.replaceString(StringUtil.removeRegex(reportName.trim(), "[^\\p{L}\\s]"), " ", "_"); |
| } |
| } |