blob: 8e40ef6a0f54ebb060f9c807dc8aaaedcbc88e70 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}