/*******************************************************************************
* Copyright (c) 2016 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.rdb.core.dialog.export.sqlresult;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.GlobalImageUtils;
import com.hangum.tadpole.commons.util.TadpoleWidgetUtils;
import com.hangum.tadpole.commons.util.download.DownloadServiceHandler;
import com.hangum.tadpole.commons.util.download.DownloadUtils;
import com.hangum.tadpole.commons.utils.zip.util.ZipUtils;
import com.hangum.tadpole.engine.sql.util.export.AllDataExporter;
import com.hangum.tadpole.engine.sql.util.export.CSVExpoter;
import com.hangum.tadpole.engine.sql.util.export.HTMLExporter;
import com.hangum.tadpole.engine.sql.util.export.JsonExpoter;
import com.hangum.tadpole.engine.sql.util.export.SQLExporter;
import com.hangum.tadpole.engine.sql.util.export.XMLExporter;
import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO;
import com.hangum.tadpole.engine.utils.RequestQuery;
import com.hangum.tadpole.preference.define.GetAdminPreference;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.AbstractExportComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.ExportHTMLComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.ExportJSONComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.ExportSQLComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.ExportTextComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.composite.ExportXMLComposite;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.AbstractExportDAO;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.ExportHtmlDAO;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.ExportJsonDAO;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.ExportSqlDAO;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.ExportTextDAO;
import com.hangum.tadpole.rdb.core.dialog.export.sqlresult.dao.ExportXmlDAO;
import com.hangum.tadpole.rdb.core.util.FindEditorAndWriteQueryUtil;
import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite;
import com.hangum.tadpole.session.manager.SessionManager;
/**
* Resultset to download
*
* @author hangum
*/
public class ResultSetDownloadDialog extends Dialog {
private static final Logger logger = Logger.getLogger(ResultSetDownloadDialog.class);
/** null 기본값 */
private String strDefaultNullValue = "";//GetPreferenceGeneral.getResultNull();
// define max download limit
final int intMaxDownloadCnt = Integer.parseInt(GetAdminPreference.getQueryResultDownloadLimit());
/** button status */
public enum BTN_STATUS {PREVIEW, SENDEDITOR, DOWNLOAD};
public BTN_STATUS btnStatus = BTN_STATUS.PREVIEW;
// request query
private RequestQuery requestQuery;
/** 배열이 0부터 시작하므로 실제로는 5건. */
private final int PREVIEW_COUNT = 4;
private final int PREVIEW_ID = IDialogConstants.CLIENT_ID + 1;
private final int SENDEDITOR_ID = IDialogConstants.CLIENT_ID + 2;
private String defaultTargetName;
private QueryExecuteResultDTO queryExecuteResultDTO;
private CTabFolder tabFolder;
private AbstractExportComposite compositeText;
private AbstractExportComposite compositeHTML;
private AbstractExportComposite compositeJSON;
private AbstractExportComposite compositeXML;
private AbstractExportComposite compositeSQL;
// preview
private Text textPreview;
protected DownloadServiceHandler downloadServiceHandler;
/**
* Create the dialog.
* @param parentShell
* @param requestQuery
* @param requestQuery
* @param queryExecuteResultDTO
* @param strDefTableName
*/
public ResultSetDownloadDialog(Shell parentShell, RequestQuery requestQuery, String strDefTableName, QueryExecuteResultDTO queryExecuteResultDTO) {
super(parentShell);
setShellStyle(SWT.MAX | SWT.RESIZE | SWT.TITLE);
this.requestQuery = requestQuery;
this.defaultTargetName = strDefTableName;
this.queryExecuteResultDTO = queryExecuteResultDTO;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.get().ExportData);
newShell.setImage(GlobalImageUtils.getTadpoleIcon());
}
/**
* Create contents of the dialog.
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
GridLayout gridLayout = (GridLayout) container.getLayout();
gridLayout.verticalSpacing = 5;
gridLayout.horizontalSpacing = 5;
gridLayout.marginHeight = 5;
gridLayout.marginWidth = 5;
SashForm sashForm = new SashForm(container, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
tabFolder = new CTabFolder(sashForm, SWT.NONE);
tabFolder.setBorderVisible(false);
tabFolder.setSelectionBackground(TadpoleWidgetUtils.getTabFolderBackgroundColor(), TadpoleWidgetUtils.getTabFolderPercents());
compositeText = new ExportTextComposite(tabFolder, SWT.NONE, defaultTargetName);
compositeText.setLayout(new GridLayout(1, false));
compositeHTML = new ExportHTMLComposite(tabFolder, SWT.NONE, defaultTargetName);
compositeHTML.setLayout(new GridLayout(1, false));
compositeJSON = new ExportJSONComposite(tabFolder, SWT.NONE, defaultTargetName);
compositeJSON.setLayout(new GridLayout(1, false));
compositeXML = new ExportXMLComposite(tabFolder, SWT.NONE, defaultTargetName);
compositeXML.setLayout(new GridLayout(1, false));
compositeSQL = new ExportSQLComposite(tabFolder, SWT.NONE, defaultTargetName, queryExecuteResultDTO.getColumnLabelName());
compositeSQL.setLayout(new GridLayout(1, false));
//--[tail]----------------------------------------------------------------------------------------
Group groupPreview = new Group(sashForm, SWT.NONE);
groupPreview.setText(Messages.get().PreviewMsg);
groupPreview.setLayout(new GridLayout(1, false));
textPreview = new Text(groupPreview, SWT.BORDER | SWT.MULTI);
textPreview.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
//--[start]----------------------------------------------------------------------------------------
sashForm.setWeights(new int[] {7,3});
tabFolder.setSelection(0);
//--[end]----------------------------------------------------------------------------------------
registerServiceHandler();
initUIData();
return container;
}
private void initUIData() {
}
@Override
protected void buttonPressed(int buttonId) {
if(buttonId == IDialogConstants.CANCEL_ID) {
super.buttonPressed(buttonId);
} else {
if(buttonId == PREVIEW_ID) {
btnStatus = BTN_STATUS.PREVIEW;
this.textPreview.setText("");
}else if(buttonId == SENDEDITOR_ID) {
btnStatus = BTN_STATUS.SENDEDITOR;
} else if(buttonId == IDialogConstants.OK_ID) {
btnStatus = BTN_STATUS.DOWNLOAD;
}
executeButton();
}
}
/**
* Create contents of the button bar.
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, PREVIEW_ID, Messages.get().Preview, true);
createButton(parent, SENDEDITOR_ID, Messages.get().SendEditor, false);
createButton(parent, IDialogConstants.OK_ID, Messages.get().Download, false);
createButton(parent, IDialogConstants.CANCEL_ID, CommonMessages.get().Close, false);
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(500, 600);
}
@Override
public boolean close() {
unregisterServiceHandler();
return super.close();
}
/** execute button */
private void executeButton() {
final String selectionTab = ""+tabFolder.getSelection().getData();
AbstractExportDAO exportDAO = null;
// validation
if("text".equalsIgnoreCase(selectionTab)) {
if(!compositeText.isValidate()) return;
exportDAO = compositeText.getLastData();
}else if("html".equalsIgnoreCase(selectionTab)) {
if(!compositeHTML.isValidate()) return;
exportDAO = compositeHTML.getLastData();
}else if("json".equalsIgnoreCase(selectionTab)) {
if(!compositeJSON.isValidate()) return;
exportDAO = compositeJSON.getLastData();
}else if("xml".equalsIgnoreCase(selectionTab)) {
if(!compositeXML.isValidate()) return;
exportDAO = compositeXML.getLastData();
}else if("sql".equalsIgnoreCase(selectionTab)) {
if(!compositeSQL.isValidate()) return;
exportDAO = compositeSQL.getLastData();
}else{
if(logger.isDebugEnabled()) logger.debug("selection tab is " + selectionTab);
MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, Messages.get().ResultSetDownloadDialog_notSelect);
return;
}
// job
final AbstractExportDAO _dao = exportDAO;
Job job = new Job(Messages.get().MainEditor_45) {
@Override
public IStatus run(IProgressMonitor monitor) {
monitor.beginTask(AbstractObjectComposite.MSG_DataIsBeginAcquired, IProgressMonitor.UNKNOWN);
try {
if("text".equalsIgnoreCase(selectionTab)) {
ExportTextDAO dao = (ExportTextDAO)_dao;
exportResultCSVType(dao.isIsncludeHeader(), dao.getTargetName(), dao.getSeparatorType(), dao.getComboEncoding());
}else if("html".equalsIgnoreCase(selectionTab)) {
ExportHtmlDAO dao = (ExportHtmlDAO)_dao;
exportResultHtmlType(dao.getTargetName(), dao.getComboEncoding());
}else if("json".equalsIgnoreCase(selectionTab)) {
ExportJsonDAO dao = (ExportJsonDAO)_dao;
exportResultJSONType(dao.isIsncludeHeader(), dao.getTargetName(), dao.getSchemeKey(), dao.getRecordKey(), dao.getComboEncoding(), dao.isFormat());
}else if("xml".equalsIgnoreCase(selectionTab)) {
ExportXmlDAO dao = (ExportXmlDAO)_dao;
exportResultXmlType(dao.getTargetName(), dao.getComboEncoding());
}else if("sql".equalsIgnoreCase(selectionTab)) {
ExportSqlDAO dao = (ExportSqlDAO)_dao;
exportResultSqlType(dao.getTargetName(), dao.getComboEncoding(), dao.getListWhere(), dao.getStatementType(), dao.getCommit());
}
} catch(Exception e) {
logger.error(selectionTab + "type export error", e);
return new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage(), e);
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
// job의 event를 처리해 줍니다.
job.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
final IJobChangeEvent jobEvent = event;
final Display display = getShell().getDisplay();
display.asyncExec(new Runnable() {
public void run() {
if(jobEvent.getResult().isOK()) {
// MessageDialog.openInformation(getShell(), CommonMessages.get().OK, CommonMessages.get().DownloadIsComplete);
} else {
MessageDialog.openWarning(getShell(), CommonMessages.get().Warning, jobEvent.getResult().getMessage());
}
} // end run
}); // end display.asyncExec
} // end done
}); // end job
job.setName(Messages.get().DownloadQueryResult);
job.setUser(true);
job.schedule();
}
/**
* export csv type
*
* @param isAddHead
* @param targetName
* @param seprator
* @param encoding
*/
protected void exportResultCSVType(boolean isAddHead, String targetName, char seprator, String encoding) throws Exception {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, CSVExpoter.makeContent(isAddHead, targetName, queryExecuteResultDTO, seprator, PREVIEW_COUNT, strDefaultNullValue), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(CSVExpoter.makeContent(isAddHead, targetName, queryExecuteResultDTO, seprator, strDefaultNullValue));
}else{
String strFullPath = AllDataExporter.makeCSVAllResult(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), isAddHead, targetName, seprator, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}
/**
* export html type
*
* @param targetName
* @param encoding
*/
protected void exportResultHtmlType(String targetName, String encoding) throws Exception {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, HTMLExporter.makeContent(targetName, queryExecuteResultDTO, PREVIEW_COUNT, strDefaultNullValue), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(HTMLExporter.makeContent(targetName, queryExecuteResultDTO, strDefaultNullValue));
}else{
String strFullPath = AllDataExporter.makeHTMLAllResult(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}
/**
* export json type
*
* @param isAddHead
* @param targetName
* @param schemeKey
* @param recordKey
* @param encoding
* @param isFormat
*/
protected void exportResultJSONType(boolean isAddHead, String targetName, String schemeKey, String recordKey, String encoding, boolean isFormat) throws Exception {
if (isAddHead){
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, JsonExpoter.makeHeadContent(targetName, queryExecuteResultDTO, schemeKey, recordKey, isFormat, PREVIEW_COUNT), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(JsonExpoter.makeHeadContent(targetName, queryExecuteResultDTO, schemeKey, recordKey, isFormat, -1));
}else{
String strFullPath = AllDataExporter.makeJSONHeadAllResult(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, schemeKey, recordKey, isFormat, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}else{
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, JsonExpoter.makeContent(targetName, queryExecuteResultDTO, isFormat, PREVIEW_COUNT), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(JsonExpoter.makeContent(targetName, queryExecuteResultDTO, isFormat, -1));
}else{
String strFullPath = AllDataExporter.makeJSONAllResult(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, isFormat, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}
}
/**
* export xml type
*
* @param targetName
* @param encoding
*/
protected void exportResultXmlType(String targetName, String encoding) throws Exception {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, XMLExporter.makeContent(targetName, queryExecuteResultDTO, PREVIEW_COUNT), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(XMLExporter.makeContent(targetName, queryExecuteResultDTO));
}else{
String strFullPath = AllDataExporter.makeXMLResult(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}
/**
* export sql type
* @param targetName
* @param encoding
* @param listWhere
* @param stmtType
* @param commit
*/
protected void exportResultSqlType(String targetName, String encoding, List<String> listWhere, String stmtType, int commit) throws Exception {
if ("batch".equalsIgnoreCase(stmtType)) {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, SQLExporter.makeBatchInsertStatment(targetName, queryExecuteResultDTO, PREVIEW_COUNT, commit), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(SQLExporter.makeBatchInsertStatment(targetName, queryExecuteResultDTO, -1, commit));
}else{
String strFullPath = AllDataExporter.makeFileBatchInsertStatment(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, commit, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}else if ("insert".equalsIgnoreCase(stmtType)) {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, SQLExporter.makeInsertStatment(targetName, queryExecuteResultDTO, PREVIEW_COUNT, commit), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(SQLExporter.makeInsertStatment(targetName, queryExecuteResultDTO, -1, commit));
}else{
String strFullPath = AllDataExporter.makeFileInsertStatment(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, commit, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}else if ("update".equalsIgnoreCase(stmtType)) {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, SQLExporter.makeUpdateStatment(targetName, queryExecuteResultDTO, listWhere, PREVIEW_COUNT, commit), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(SQLExporter.makeUpdateStatment(targetName, queryExecuteResultDTO, listWhere, -1, commit));
}else{
String strFullPath = AllDataExporter.makeFileUpdateStatment(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, listWhere, commit, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}else if ("merge".equalsIgnoreCase(stmtType)) {
if (btnStatus == BTN_STATUS.PREVIEW) {
previewDataLoad(targetName, SQLExporter.makeMergeStatment(targetName, queryExecuteResultDTO, listWhere, PREVIEW_COUNT, commit), encoding);
}else if (btnStatus == BTN_STATUS.SENDEDITOR) {
targetEditor(SQLExporter.makeMergeStatment(targetName, queryExecuteResultDTO, listWhere, -1, commit));
}else{
String strFullPath = AllDataExporter.makeFileMergeStatment(queryExecuteResultDTO.getUserDB(), requestQuery.getSql(), targetName, listWhere, commit, encoding, strDefaultNullValue, intMaxDownloadCnt);
downloadFile(targetName, strFullPath, encoding);
}
}
}
/**
* 에디터 오픈
*
* @param strContetn
*/
private void targetEditor(final String strContetn) {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
FindEditorAndWriteQueryUtil.run(queryExecuteResultDTO.getUserDB(), strContetn, PublicTadpoleDefine.OBJECT_TYPE.TABLES);
}
});
}
/**
* get request query
*
* @return
*/
public RequestQuery getRequestQuery() {
return requestQuery;
}
/**
* preview data
* @param fileName
* @param previewData
* @param encoding
* @throws Exception
*/
protected void previewDataLoad(final String fileName, final String previewData, final String encoding) throws Exception {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
textPreview.setText(previewData);
}
});
}
/**
* download file
*
* @param fileName
* @param strFileLocation
* @param encoding
*
* @throws Exception
*/
protected void downloadFile(final String fileName, final String strFileLocation, final String encoding) throws Exception {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
try {
String strZipFile = ZipUtils.pack(strFileLocation);
byte[] bytesZip = FileUtils.readFileToByteArray(new File(strZipFile));
if(logger.isDebugEnabled()) logger.debug("zipFile is " + strZipFile + ", file name is " + fileName +".zip");
_downloadExtFile(fileName +".zip", bytesZip); //$NON-NLS-1$
// 사용후 파일을 삭제한다.
FileUtils.deleteDirectory(new File(new File(strFileLocation).getParent()));
FileUtils.forceDelete(new File(strZipFile));
} catch(Exception e) {
logger.error("download file", e);
}
}
});
}
/** registery service handler */
protected void registerServiceHandler() {
downloadServiceHandler = new DownloadServiceHandler();
RWT.getServiceManager().registerServiceHandler(downloadServiceHandler.getId(), downloadServiceHandler);
}
/** download service handler call */
protected void unregisterServiceHandler() {
RWT.getServiceManager().unregisterServiceHandler(downloadServiceHandler.getId());
downloadServiceHandler = null;
}
/**
* download external file
*
* @param fileName
* @param newContents
*/
protected void _downloadExtFile(String fileName, byte[] newContents) {
downloadServiceHandler.setName(fileName);
downloadServiceHandler.setByteContent(newContents);
DownloadUtils.provideDownload(getShell(), downloadServiceHandler.getId());
}
}