IDEMPIERE-4566 Translation Import/Export - output message is not visible (#624)

* Fix problem with wrong management of parameters when changing from Import to Export
* Delete the deprecated class, this is unused (IDEMPIERE-4723)
This commit is contained in:
Carlos Ruiz 2021-03-12 10:45:39 +01:00 committed by GitHub
parent 1cab7864f5
commit 2e4daa8930
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 523 deletions

View File

@ -0,0 +1,11 @@
-- IDEMPIERE-4566 Translation Import/Export - output message is not visible
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Mar 11, 2021, 12:50:15 PM CET
UPDATE AD_Process_Para SET DisplayLogic='@FileName@='''' | @ImportOrExport@=''export''',Updated=TO_DATE('2021-03-11 12:50:15','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200332
;
SELECT register_migration_script('202103111305_IDEMPIERE-4566.sql') FROM dual
;

View File

@ -0,0 +1,8 @@
-- IDEMPIERE-4566 Translation Import/Export - output message is not visible
-- Mar 11, 2021, 12:50:15 PM CET
UPDATE AD_Process_Para SET DisplayLogic='@FileName@='''' | @ImportOrExport@=''export''',Updated=TO_TIMESTAMP('2021-03-11 12:50:15','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200332
;
SELECT register_migration_script('202103111305_IDEMPIERE-4566.sql') FROM dual
;

View File

@ -45,6 +45,7 @@ import org.compiere.model.MLanguage;
import org.compiere.model.MPInstance;
import org.compiere.model.MTable;
import org.compiere.model.PO;
import org.compiere.model.Query;
import org.compiere.process.ProcessCall;
import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger;
@ -397,41 +398,30 @@ public class Translation implements IApplication
return retValue;
} // getTrlColumns
/**************************************************************************
* Validate Language.
/**
* Validate Language.
* - Check if AD_Language record exists
* - Check Trl table records
* @param AD_Language language
* @return "" if validated - or error message
*/
public String validateLanguage (String AD_Language)
public String validateLanguage(String p_AD_Language) {
return validateLanguage(p_AD_Language, null);
}
/**************************************************************************
* Validate Language.
* - Check if AD_Language record exists
* - Check Trl table records
* @param AD_Language language
* @param get_TrxName transaction
* @return "" if validated - or error message
*/
public String validateLanguage (String AD_Language, String trxName)
{
String sql = "SELECT * "
+ "FROM AD_Language "
+ "WHERE AD_Language=?";
MLanguage language = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setString(1, AD_Language);
rs = pstmt.executeQuery();
if (rs.next())
language = new MLanguage (m_ctx, rs, null);
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
return e.toString();
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
MLanguage language = new Query(m_ctx, MLanguage.Table_Name, "AD_Language=?", trxName)
.setParameters(AD_Language)
.first();
// No AD_Language Record
if (language == null)

View File

@ -100,7 +100,7 @@ public class TranslationImpExp extends SvrProcess {
File tempFolder = null;
try {
if (! Util.isEmpty(p_FileName, true)) {
if (! Util.isEmpty(p_FileName, true) && "import".equals(p_ImportOrExport)) {
if (p_FileName.startsWith("http://") || p_FileName.startsWith("https://")) {
String tmpZip = null;
FileOutputStream fos = null;
@ -132,7 +132,7 @@ public class TranslationImpExp extends SvrProcess {
}
Translation translation = new Translation(Env.getCtx());
String msg = translation.validateLanguage(p_AD_Language);
String msg = translation.validateLanguage(p_AD_Language, get_TrxName());
if (msg.length() > 0)
throw new AdempiereSystemError(msg);

View File

@ -80,7 +80,6 @@ Export-Package: fi.jawsy.jawwa.zk.atmosphere,
org.adempiere.webui.factory,
org.adempiere.webui.grid,
org.adempiere.webui.info,
org.adempiere.webui.install,
org.adempiere.webui.panel,
org.adempiere.webui.panel.action,
org.adempiere.webui.part,

View File

@ -1,491 +0,0 @@
/******************************************************************************
* Copyright (C) 2009 Low Heng Sin *
* Copyright (C) 2009 Idalica Corporation *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.adempiere.webui.install;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.webui.AdempiereWebUI;
import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.FolderBrowser;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.ListboxFactory;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.event.DialogEvents;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.panel.CustomForm;
import org.adempiere.webui.panel.IFormController;
import org.adempiere.webui.panel.StatusBarPanel;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.util.ReaderInputStream;
import org.adempiere.webui.util.ZKUpdateUtil;
import org.adempiere.webui.window.FDialog;
import org.adempiere.webui.window.MultiFileDownloadDialog;
import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.taskdefs.Zip;
import org.compiere.install.Translation;
import org.compiere.install.TranslationController;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.compiere.util.ValueNamePair;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Center;
import org.zkoss.zul.Div;
import org.zkoss.zul.South;
/*
* Deprecated with IDEMPIERE-4566
* moved to org.idempiere.process.TranslationImpExp
*/
@Deprecated
public class WTranslationDialog extends TranslationController implements IFormController, EventListener<Event> {
private CustomForm form = new CustomForm();
public WTranslationDialog()
{
m_WindowNo = form.getWindowNo();
Env.setContext(Env.getCtx(), form.getWindowNo(), "IsSOTrx", "Y");
try
{
zkInit();
dynInit();
Borderlayout contentLayout = new Borderlayout();
ZKUpdateUtil.setWidth(contentLayout, "100%");
ZKUpdateUtil.setHeight(contentLayout, "100%");
form.appendChild(contentLayout);
Center center = new Center();
contentLayout.appendChild(center);
center.appendChild(centerPanel);
South south = new South();
south.setStyle("border: none");
contentLayout.appendChild(south);
south.appendChild(statusBar);
LayoutUtils.addSclass("status-border", statusBar);
ZKUpdateUtil.setHeight(south, "22px");
}
catch(Exception e)
{
log.log(Level.SEVERE, "", e);
}
}
private Panel centerPanel = new Panel();
private Grid centerLayout = GridFactory.newGridLayout();
private Button bExport = new Button();
private Button bImport = new Button();
private Button bExportZIP = new Button();
private Button bImportZIP = new Button();
private Label lClient = new Label();
private Listbox cbClient = ListboxFactory.newDropdownListbox();
private Label lLanguage = new Label();
private Listbox cbLanguage = ListboxFactory.newDropdownListbox();
private Label lTable = new Label();
private Listbox cbTable = ListboxFactory.newDropdownListbox();
private StatusBarPanel statusBar = new StatusBarPanel();
private ValueNamePair m_AD_Table;
private int m_AD_Client_ID;
private boolean m_imp;
private ValueNamePair m_AD_Language;
private Checkbox isOnlyCentralized = new Checkbox();
private void zkInit() throws Exception
{
centerPanel.appendChild(centerLayout);
lClient.setText(Msg.translate(Env.getCtx(), "AD_Client_ID"));
lLanguage.setText(Msg.translate(Env.getCtx(), "AD_Language"));
lLanguage.setTooltiptext(Msg.translate(Env.getCtx(), "IsSystemLanguage"));
lTable.setText(Msg.translate(Env.getCtx(), "AD_Table_ID"));
//
bExport.setLabel(Msg.getMsg(Env.getCtx(), "Export"));
bExport.addActionListener(this);
bExport.setStyle("text-align: right;");
bImport.setLabel(Msg.getMsg(Env.getCtx(), "Import"));
bImport.addActionListener(this);
bExportZIP.setLabel(Msg.getMsg(Env.getCtx(), "ExportZIP"));
bExportZIP.addActionListener(this);
bImportZIP.setLabel(Msg.getMsg(Env.getCtx(), "ImportZIP"));
bImportZIP.setUpload(AdempiereWebUI.getUploadSetting());
bImportZIP.addEventListener(Events.ON_UPLOAD, this);
isOnlyCentralized.setLabel(Msg.getMsg(Env.getCtx(), "OnlyCentralizedData"));
isOnlyCentralized.setChecked(true);
Rows rows = centerLayout.newRows();
Row row = rows.newRow();
row.appendChild(lClient.rightAlign());
row.appendChild(cbClient);
row = rows.newRow();
row.appendChild(lLanguage.rightAlign());
row.appendChild(cbLanguage);
row = rows.newRow();
row.appendChild(lTable.rightAlign());
row.appendChild(cbTable);
row = rows.newRow();
row.appendChild(new Label(""));
row.appendChild(isOnlyCentralized);
row = rows.newRow();
Div div = new Div();
div.setStyle("text-align: right;");
div.appendChild(bExport);
row.appendChild(div);
div = new Div();
div.setStyle("text-align: left;");
div.appendChild(bImport);
row.appendChild(div);
row = rows.newRow();
div = new Div();
div.setStyle("text-align: right;");
div.appendChild(bExportZIP);
row.appendChild(div);
div = new Div();
div.setStyle("text-align: left;");
div.appendChild(bImportZIP);
row.appendChild(div);
}
/**
* Dynamic Init.
* - fill Language & Table
*/
private void dynInit()
{
// Fill Client
ArrayList<KeyNamePair> clients = getClientList();
for(KeyNamePair client: clients)
cbClient.addItem(client);
// Fill Language
ArrayList<ValueNamePair> languages = getLanguageList();
for(ValueNamePair language: languages)
cbLanguage.addItem(language);
// Fill Table
ArrayList<ValueNamePair> tables = getTableList();
for(ValueNamePair table: tables)
cbTable.addItem(table);
// Info
setStatusBar(statusBar);
} // dynInit
/**
* Dispose
*/
public void dispose()
{
SessionManager.getAppDesktop().closeActiveWindow();
} // dispose
public ADForm getForm() {
return form;
}
/**************************************************************************
* Action Listener
* @param e event
*/
public void onEvent(Event e)
{
if (cbLanguage.getSelectedIndex() == -1)
{
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "LanguageSetupError"), true);
return;
}
m_AD_Language = (ValueNamePair)cbLanguage.getSelectedItem().toValueNamePair();
if (m_AD_Language == null)
{
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "LanguageSetupError"), true);
return;
}
if (cbTable.getSelectedIndex() == -1)
return;
m_AD_Table = (ValueNamePair)cbTable.getSelectedItem().toValueNamePair();
if (m_AD_Table == null)
return;
m_imp = (e.getTarget() == bImport || e.getTarget() == bImportZIP);
m_AD_Client_ID = -1;
KeyNamePair AD_Client = null;
if (cbTable.getSelectedIndex() != -1)
AD_Client = (KeyNamePair)cbClient.getSelectedItem().toKeyNamePair();
if (AD_Client != null)
m_AD_Client_ID = AD_Client.getKey();
if (e instanceof UploadEvent)
{
// upload and import zip
UploadEvent ue = (UploadEvent) e;
try {
processUploadMedia(ue.getMedia());
} catch (AdempiereException e1) {
throw new RuntimeException(e1);
}
return;
}
if ((e.getTarget() == bImport || e.getTarget() == bExport)) {
final FolderBrowser directoryDialog = new FolderBrowser(true);
directoryDialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception {
callImportProcess(directoryDialog.getPath());
}
});
} else if (e.getTarget() == bExportZIP) {
processExportZIP();
}
} // onEvent
private void callImportProcess(String directory) {
if(directory == null) return;
//
statusBar.setStatusLine(directory);
Translation t = new Translation(Env.getCtx());
StringBuilder msg = new StringBuilder(t.validateLanguage(m_AD_Language.getValue()));
if (msg.length() > 0)
{
FDialog.error(m_WindowNo, form, "LanguageSetupError", msg.toString());
return;
}
// All Tables
if (m_AD_Table.getValue().equals(""))
{
msg = new StringBuilder();
for (int i = 1; i < cbTable.getItemCount(); i++)
{
m_AD_Table = (ValueNamePair)cbTable.getItemAtIndex(i).toValueNamePair();
// Carlos Ruiz - globalqss - improve output message from translation import process
msg.append(m_AD_Table.getValue()).append(" ").append((m_imp
? t.importTrl (directory, m_AD_Client_ID, m_AD_Language.getValue(), m_AD_Table.getValue())
: t.exportTrl (directory, m_AD_Client_ID, m_AD_Language.getValue(), m_AD_Table.getValue(), isOnlyCentralized.isChecked()))).append(" ");
}
if(msg == null || msg.length() == 0)
msg = new StringBuilder((m_imp ? "Import" : "Export")).append(" Successful. [").append(directory).append("]");
statusBar.setStatusLine(msg.toString());
}
else // single table
{
msg = null;
msg = new StringBuilder(m_imp
? t.importTrl (directory, m_AD_Client_ID, m_AD_Language.getValue(), m_AD_Table.getValue())
: t.exportTrl (directory, m_AD_Client_ID, m_AD_Language.getValue(), m_AD_Table.getValue(), isOnlyCentralized.isChecked()));
if(msg == null || msg.length() == 0)
msg = new StringBuilder(m_imp ? "Import" : "Export").append(" Successful. [").append(directory).append("]");
statusBar.setStatusLine(msg.toString());
}
}
private void processUploadMedia(Media media) throws AdempiereException {
if (media == null)
return;
InputStream istream;
if (media.isBinary()) {
istream = media.getStreamData();
} else {
istream = new ReaderInputStream(media.getReaderData());
}
if (log.isLoggable(Level.CONFIG)) log.config(media.getName());
unZipAndProcess(istream);
}
private void unZipAndProcess(InputStream istream) throws AdempiereException {
FileOutputStream ostream = null;
File file = null;
try {
file = File.createTempFile("trlImport", ".zip");
ostream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int read;
while ((read = istream.read(buffer)) != -1) {
ostream.write(buffer, 0, read);
}
} catch (Throwable e) {
throw new AdempiereException("Copy zip failed", e);
} finally {
if (ostream != null) {
try {
ostream.close();
} catch (Exception e2) {}
}
}
// create temp folder
File tempfolder;
try {
tempfolder = File.createTempFile(m_AD_Language.getValue(), ".trl");
tempfolder.delete();
tempfolder.mkdir();
} catch (IOException e1) {
throw new AdempiereException("Problem creating temp folder", e1);
}
String suffix = "_" + m_AD_Language.getValue() + ".xml";
ZipFile zipFile = null;
boolean validfile = false;
try {
zipFile = new ZipFile(file);
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
if (entry.isDirectory()) {
// ignore folders
log.warning("Imported zip must not contain folders, ignored folder" + entry.getName());
continue;
}
if (! entry.getName().endsWith(suffix)) {
// not valid file
log.warning("Ignored file " + entry.getName());
continue;
}
File outFile = new File(tempfolder.getPath(), entry.getName());
if (!outFile.toPath().normalize().startsWith(tempfolder.toPath())) {
log.severe("Bad zip entry: " + entry.getName());
continue;
}
if (log.isLoggable(Level.INFO)) log.info("Extracting file: " + entry.getName());
copyInputStream(zipFile.getInputStream(entry), new BufferedOutputStream(new FileOutputStream(outFile)));
validfile = true;
}
} catch (Throwable e) {
throw new AdempiereException("Uncompress zip failed", e);
} finally {
if (zipFile != null)
try {
zipFile.close();
} catch (IOException e) {}
}
if (!validfile) {
throw new AdempiereException("ZIP file invalid, doesn't contain *" + suffix + " files");
}
callImportProcess(tempfolder.getPath());
file.delete();
try {
FileUtils.deleteDirectory(tempfolder);
} catch (IOException e) {}
}
public static final void copyInputStream(InputStream in, OutputStream out) throws IOException
{
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);
in.close();
out.close();
}
private void processExportZIP() {
File tempfolder;
try {
tempfolder = File.createTempFile(m_AD_Language.getValue(), ".trl");
tempfolder.delete();
tempfolder.mkdir();
} catch (IOException e1) {
throw new AdempiereException("Problem creating temp folder", e1);
}
// export to temp folder
callImportProcess(tempfolder.getPath());
// and now zip the exported files
File destZipFile = null;
try {
destZipFile = File.createTempFile(m_AD_Language.getValue() + "_trlExport_", ".zip");
} catch (Throwable e) {
throw new AdempiereException("Unable to create temp file", e);
}
destZipFile.delete();
Zip zipper = new Zip();
zipper.setDestFile(destZipFile);
zipper.setBasedir(tempfolder);
zipper.setUpdate(false);
zipper.setCompress(true);
zipper.setCaseSensitive(false);
zipper.setFilesonly(true);
zipper.setTaskName("zip");
zipper.setTaskType("zip");
zipper.setProject(new Project());
zipper.setOwningTarget(new Target());
zipper.execute();
try {
FileUtils.deleteDirectory(tempfolder);
} catch (IOException e) {}
MultiFileDownloadDialog downloadDialog = new MultiFileDownloadDialog(new File [] {destZipFile});
downloadDialog.setPage(getForm().getPage());
downloadDialog.setTitle(Msg.getMsg(Env.getCtx(), "ExportZIP"));
Events.postEvent(downloadDialog, new Event(MultiFileDownloadDialog.ON_SHOW));
}
}