Java tutorial
/******************************************************************************* * 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.pricat; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.Timestamp; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.ofbiz.htmlreport.AbstractReportThread; import org.apache.ofbiz.htmlreport.InterfaceReport; import org.apache.ofbiz.pricat.sample.SamplePricatParser; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.FileUtil; import org.apache.ofbiz.base.util.UtilDateTime; 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.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.EntityOperator; import org.apache.ofbiz.entity.util.EntityUtil; import org.apache.ofbiz.service.LocalDispatcher; /** * Thread for running pricat import excel html report. * */ public class PricatParseExcelHtmlThread extends AbstractReportThread { public static final String module = PricatParseExcelHtmlThread.class.getName(); public static final String PARSE_EXCEL = "parse_excel"; public static final String CONFIRM = "confirm_action"; public static final String[] messageLabels = new String[] { "FORMAT_DEFAULT", "FORMAT_WARNING", "FORMAT_HEADLINE", "FORMAT_NOTE", "FORMAT_OK", "FORMAT_ERROR", "FORMAT_THROWABLE" }; public static final List<String> messages = Collections.unmodifiableList(Arrays.asList(messageLabels)); public static final String FileDateTimePattern = "yyyyMMddHHmmss"; public static final String defaultColorName = "DefaultColor"; public static final String defaultDimensionName = "DefaultDimension"; public static final String defaultCategoryName = "DefaultCategory"; public static final String EXCEL_TEMPLATE_TYPE = "excelTemplateType"; public static final String FACILITY_ID = "facilityId"; private LocalDispatcher dispatcher; private Delegator delegator; private List<FileItem> fileItems; private File pricatFile; private String userLoginId; private GenericValue userLogin; private Map<String, String[]> facilities = new HashMap<String, String[]>(); public static final String resource = "PricatUiLabels"; private HttpSession session; public static final String PRICAT_FILE = "__PRICAT_FILE__"; public static final String DEFAULT_PRICAT_TYPE = "sample_pricat"; private String selectedPricatType = DEFAULT_PRICAT_TYPE; private String selectedFacilityId; public static final Map<String, String> PricatTypeLabels = UtilMisc.toMap("sample_pricat", "SamplePricatTemplate", "ofbiz_pricat", "OFBizPricatTemplate"); private InterfacePricatParser pricatParser; private String thruReasonId = "EXCEL_IMPORT_SUCCESS"; /** * Constructor, creates a new html thread. * * @param request * @param response * @param name */ public PricatParseExcelHtmlThread(HttpServletRequest request, HttpServletResponse response, String name) { super(request, response, name); dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); setDelegator(dispatcher.getDelegator()); userLogin = (GenericValue) request.getSession().getAttribute("userLogin"); if (UtilValidate.isEmpty(userLogin)) { initHtmlReport(request, response, true, true); getReport().println(UtilProperties.getMessage(resource, "PricatRequireUserLogin", getLocale()), InterfaceReport.FORMAT_ERROR); return; } else { userLoginId = userLogin.getString("userLoginId"); session = request.getSession(); } long sequenceNum = addExcelImportHistory(); File userFolder = FileUtil.getFile(InterfacePricatParser.tempFilesFolder + userLoginId + "/"); if (!userFolder.exists()) { userFolder.mkdirs(); } String logFileName = InterfacePricatParser.tempFilesFolder + userLoginId + "/" + sequenceNum + ".log"; initHtmlReport(request, response, true, true, logFileName); if (sequenceNum > 0) { getReport().setSequenceNum(sequenceNum); getReport().addLogFile(logFileName); } try { getReport().print(UtilProperties.getMessage(resource, "StartStoreExcel", getLocale()), InterfaceReport.FORMAT_HEADLINE); ServletFileUpload dfu = new ServletFileUpload(new DiskFileItemFactory(10240, userFolder)); fileItems = UtilGenerics.checkList(dfu.parseRequest(request)); } catch (FileUploadException e) { getReport().addError(e); } if (UtilValidate.isEmpty(fileItems)) { getReport().println(UtilProperties.getMessage(resource, "NoFileUploaded", getLocale()), InterfaceReport.FORMAT_ERROR); } else { getReport().println(UtilProperties.getMessage(resource, "ok", getLocale()), InterfaceReport.FORMAT_OK); } } public String getReportUpdate() { return getReport().getReportUpdate(); } /** * @see java.lang.Runnable#run() */ public void run() { try { if (getName().startsWith(PARSE_EXCEL) && UtilValidate.isNotEmpty(fileItems)) { getReport().println(); getReport().println(UtilProperties.getMessage(resource, "StartParsePricat", getLocale()), InterfaceReport.FORMAT_HEADLINE); if (prepareParse()) { if (selectedPricatType.equals(DEFAULT_PRICAT_TYPE)) { pricatParser = new SamplePricatParser(dispatcher, delegator, getLocale(), getReport(), facilities, pricatFile, userLogin); } if (UtilValidate.isEmpty(pricatParser)) { getReport().println(UtilProperties.getMessage(resource, "NoPricatParserFor", getLocale()), InterfaceReport.FORMAT_ERROR); } else { pricatParser.parsePricatExcel(); getReport().println( UtilProperties.getMessage(resource, "PricatParseCompleted", getLocale()), InterfaceReport.FORMAT_HEADLINE); } } } else { getReport().println(getName(), InterfaceReport.FORMAT_ERROR); Debug.logError(getName(), module); thruReasonId = "EXCEL_IMPORT_ERROR"; } } catch (Exception e) { getReport().println(e); Debug.logError(e, module); thruReasonId = "EXCEL_IMPORT_ERROR"; } finally { // wait 5 seconds to wait page output try { sleep(5000); } catch (InterruptedException e) { } // call report update to make sure all messages are output to file getReport().getReportUpdate(); String logFileName = getReport().closeLogFile(); if (UtilValidate.isNotEmpty(pricatParser)) { if (thruReasonId.equals("EXCEL_IMPORT_SUCCESS") && pricatParser.hasErrorMessages()) { thruReasonId = "EXCEL_IMPORT_QUEST"; } pricatParser.endExcelImportHistory(logFileName, thruReasonId); } } } private boolean prepareParse() throws IOException { // 1 get facilities belong to current userLogin facilities = getCurrentUserLoginFacilities(); if (UtilValidate.isEmpty(facilities)) { getReport().println(UtilProperties.getMessage(resource, "CurrentUserLoginNoFacility", new Object[] { userLoginId }, getLocale()), InterfaceReport.FORMAT_ERROR); return false; } else { getReport().println(" ... " + UtilProperties.getMessage(resource, "ok", getLocale()), InterfaceReport.FORMAT_OK); getReport().println(); } // 2. store the pricat excel file if (!storePricatFile()) { return false; } return true; } private boolean storePricatFile() throws IOException { FileItem fi = null; FileItem pricatFi = null; byte[] pricatBytes = {}; // check excelTemplateType for (int i = 0; i < fileItems.size(); i++) { fi = fileItems.get(i); String fieldName = fi.getFieldName(); if (fi.isFormField() && UtilValidate.isNotEmpty(fieldName)) { if (fieldName.equals(EXCEL_TEMPLATE_TYPE)) { selectedPricatType = fi.getString(); } } } getReport().print(UtilProperties.getMessage(resource, "ExcelTemplateTypeSelected", getLocale()), InterfaceReport.FORMAT_DEFAULT); if (PricatTypeLabels.containsKey(selectedPricatType)) { getReport().print( UtilProperties.getMessage(resource, PricatTypeLabels.get(selectedPricatType), getLocale()), InterfaceReport.FORMAT_DEFAULT); getReport().println(" ... " + UtilProperties.getMessage(resource, "ok", getLocale()), InterfaceReport.FORMAT_OK); } else { getReport().println( UtilProperties.getMessage(resource, PricatTypeLabels.get(selectedPricatType), getLocale()), InterfaceReport.FORMAT_ERROR); return false; } // store the file for (int i = 0; i < fileItems.size(); i++) { fi = fileItems.get(i); String fieldName = fi.getFieldName(); if (fieldName.equals("filename")) { pricatFi = fi; pricatBytes = pricatFi.get(); Path path = Paths.get(fi.getName()); pricatFile = new File( InterfacePricatParser.tempFilesFolder + userLoginId + "/" + path.getFileName().toString()); FileOutputStream fos = new FileOutputStream(pricatFile); fos.write(pricatBytes); fos.flush(); fos.close(); session.setAttribute(PRICAT_FILE, pricatFile.getAbsolutePath()); } } return true; } private Map<String, String[]> getCurrentUserLoginFacilities() { getReport().println(); getReport().println(UtilProperties.getMessage(resource, "GetCurrentUserLoginFacility", getLocale()), InterfaceReport.FORMAT_DEFAULT); Map<String, Object> context = new HashMap<String, Object>(); context.put("userLogin", userLogin); context.put("locale", getLocale()); try { List<EntityCondition> orgConditions = new LinkedList<EntityCondition>(); orgConditions.add(EntityCondition.makeCondition("onePartyIdFrom", EntityOperator.EQUALS, userLogin.getString("partyId"))); orgConditions.add(EntityCondition.makeCondition("twoRoleTypeIdFrom", EntityOperator.EQUALS, "INTERNAL_ORGANIZATIO")); orgConditions.add(EntityCondition.makeCondition("twoRoleTypeIdTo", EntityOperator.EQUALS, "EMPLOYEE")); orgConditions.add(EntityCondition.makeCondition("twoRoleTypeIdTo", EntityOperator.EQUALS, "EMPLOYEE")); List<GenericValue> organizations = delegator.findList("PartyRelationshipToFrom", EntityCondition.makeCondition(orgConditions), null, null, null, false); Timestamp now = UtilDateTime.nowTimestamp(); organizations = EntityUtil.filterByDate(organizations, now, "twoFromDate", "twoThruDate", true); organizations = EntityUtil.filterByDate(organizations, now, "oneFromDate", "oneThruDate", true); List<EntityCondition> ownerPartyConditions = new LinkedList<EntityCondition>(); Set<String> orgPartyIds = new HashSet<String>(); for (GenericValue organization : organizations) { String orgPartyId = organization.getString("onePartyIdTo"); if (!orgPartyIds.contains(orgPartyId)) { ownerPartyConditions .add(EntityCondition.makeCondition("ownerPartyId", EntityOperator.EQUALS, orgPartyId)); orgPartyIds.add(orgPartyId); } } if (UtilValidate.isEmpty(ownerPartyConditions)) { return facilities; } List<GenericValue> facilityValues = delegator.findList("Facility", EntityCondition.makeCondition(ownerPartyConditions, EntityOperator.OR), null, null, null, false); if (UtilValidate.isNotEmpty(facilityValues)) { int i = 1; for (GenericValue facilityValue : facilityValues) { if (UtilValidate.isNotEmpty(facilityValue)) { String facilityId = facilityValue.getString("facilityId"); if (!facilities.containsKey(facilityId)) { String facilityName = facilityValue.getString("facilityName"); facilities.put(facilityId, new String[] { facilityName, facilityValue.getString("ownerPartyId") }); getReport().println(UtilProperties.getMessage(resource, "FacilityFoundForCurrentUserLogin", new Object[] { String.valueOf(i), facilityName, facilityId }, getLocale()), InterfaceReport.FORMAT_NOTE); i++; } } } } } catch (GenericEntityException e) { Debug.logError(e.getMessage(), module); } return facilities; } public Delegator getDelegator() { return delegator; } public void setDelegator(Delegator delegator) { this.delegator = delegator; } public synchronized long addExcelImportHistory() { long latestId = 1; try { List<GenericValue> historyValues = delegator.findByAnd("ExcelImportHistory", UtilMisc.toMap("userLoginId", userLoginId), UtilMisc.toList("sequenceNum DESC"), false); GenericValue latestHistoryValue = EntityUtil.getFirst(historyValues); if (UtilValidate.isNotEmpty(latestHistoryValue)) { latestId = latestHistoryValue.getLong("sequenceNum") + 1; } GenericValue newHistoryValue = delegator.makeValue("ExcelImportHistory", UtilMisc.toMap("sequenceNum", latestId, "userLoginId", userLoginId, "fileName", pricatFile == null ? "" : pricatFile.getName(), "statusId", isAlive() ? "EXCEL_IMPORTING" : "EXCEL_IMPORTED", "fromDate", UtilDateTime.nowTimestamp(), "threadName", getName(), "logFileName", InterfacePricatParser.tempFilesFolder + userLoginId + "/" + latestId + ".log")); newHistoryValue.create(); } catch (GenericEntityException e) { Debug.logError(e, module); return -1; } return latestId; } }