- 코드 리팩토링 (csv 익스포트 관련 코드 정리)
[Tadpole.git] / com.hangum.tadpole.rdb.core / src / com / hangum / tadpole / rdb / core / editors / dbinfos / composites / PropertyComposite.java
blob6c4d70f570ad582bae4e97ce0ae673ddbbf0dca5
1 /*******************************************************************************
2 * Copyright (c) 2013 hangum.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Lesser Public License v2.1
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
7 *
8 * Contributors:
9 * hangum - initial API and implementation
10 ******************************************************************************/
11 package com.hangum.tadpole.rdb.core.editors.dbinfos.composites;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
18 import org.apache.log4j.Logger;
19 import org.eclipse.core.runtime.IStatus;
20 import org.eclipse.core.runtime.Status;
21 import org.eclipse.jface.dialogs.MessageDialog;
22 import org.eclipse.jface.viewers.ArrayContentProvider;
23 import org.eclipse.jface.viewers.ITableLabelProvider;
24 import org.eclipse.jface.viewers.LabelProvider;
25 import org.eclipse.jface.viewers.TableViewer;
26 import org.eclipse.jface.viewers.TableViewerColumn;
27 import org.eclipse.jface.viewers.Viewer;
28 import org.eclipse.jface.viewers.ViewerFilter;
29 import org.eclipse.rap.rwt.RWT;
30 import org.eclipse.swt.SWT;
31 import org.eclipse.swt.events.KeyAdapter;
32 import org.eclipse.swt.events.KeyEvent;
33 import org.eclipse.swt.events.SelectionAdapter;
34 import org.eclipse.swt.events.SelectionEvent;
35 import org.eclipse.swt.graphics.Image;
36 import org.eclipse.swt.layout.GridData;
37 import org.eclipse.swt.layout.GridLayout;
38 import org.eclipse.swt.widgets.Button;
39 import org.eclipse.swt.widgets.Composite;
40 import org.eclipse.swt.widgets.Label;
41 import org.eclipse.swt.widgets.Table;
42 import org.eclipse.swt.widgets.Text;
44 import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog;
45 import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
46 import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
47 import com.hangum.tadpole.commons.util.CSVUtils;
48 import com.hangum.tadpole.commons.util.download.DownloadServiceHandler;
49 import com.hangum.tadpole.commons.util.download.DownloadUtils;
50 import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
51 import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
52 import com.hangum.tadpole.rdb.core.Activator;
53 import com.hangum.tadpole.rdb.core.Messages;
54 import com.hangum.tadpole.rdb.core.editors.dbinfos.RDBDBInfosEditor;
55 import com.ibatis.sqlmap.client.SqlMapClient;
57 /**
58 * Property Composite
60 * This class is to the properties of a database.
61 * Users can check the current value of each property.
63 * @TODO
64 * - Setting the value on the screen without directly throwing a query to the database.
66 * @author sun.han
69 public class PropertyComposite extends DBInfosComposite {
70 /**
71 * Logger for this class
73 private static final Logger logger = Logger.getLogger(PropertyComposite.class);
75 private UserDBDAO userDB;
76 private TableViewer propertyViewer;
78 private PropertyFilter propertyFilter;
79 private Text text;
81 /* Download service handler */
82 private Composite composite;
83 private DownloadServiceHandler downloadServiceHandler;
84 private List listTableInform = new ArrayList<>();
86 /**
87 * Create a composite.
88 * @param parent
89 * @param style
91 public PropertyComposite(Composite parent, int style, UserDBDAO userDB) {
92 super(parent, style);
93 setLayout(new GridLayout(1, false));
95 this.userDB = userDB;
97 Composite compositeHead = new Composite(this, SWT.NONE);
98 compositeHead.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
99 compositeHead.setLayout(new GridLayout(3, false));
101 Label lblNewLabel = new Label(compositeHead, SWT.NONE);
102 lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
103 lblNewLabel.setText(CommonMessages.get().Filter);
105 text = new Text(compositeHead, SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
106 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
107 text.addKeyListener(new KeyAdapter() {
108 public void keyReleased(KeyEvent e) {
109 propertyFilter.setSearchString(text.getText());
110 propertyViewer.refresh();
114 Button btnRefresh = new Button(compositeHead, SWT.NONE);
115 btnRefresh.addSelectionListener(new SelectionAdapter() {
116 @Override
117 public void widgetSelected(SelectionEvent e) {
118 initUI(true);
121 btnRefresh.setText(CommonMessages.get().Refresh);
123 propertyViewer = new TableViewer(this, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION);
124 Table table = propertyViewer.getTable();
125 table.setHeaderVisible(true);
126 table.setLinesVisible(true);
127 table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
129 createColumn();
131 propertyViewer.setContentProvider(new ArrayContentProvider());
132 propertyViewer.setLabelProvider(new PropertyInformLabelProvider(userDB));
134 propertyFilter = new PropertyFilter();
135 propertyViewer.addFilter(propertyFilter);
137 composite = new Composite(this, SWT.NONE);
138 composite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
139 composite.setLayout(new GridLayout(1, false));
141 Button btnCsvExport = new Button(composite, SWT.NONE);
142 btnCsvExport.addSelectionListener(new SelectionAdapter() {
143 @Override
144 public void widgetSelected(SelectionEvent e) {
145 downloadCSVFile();
148 btnCsvExport.setBounds(0, 0, 94, 28);
149 btnCsvExport.setText(Messages.get().TablesComposite_btnCsvExport_text);
151 // initUI();
152 registerServiceHandler();
156 * Create columns.
158 private void createColumn() {
160 String[] columnName = { Messages.get().PropertyComposite_Name, Messages.get().PropertyComposite_Value };
161 int[] columnSize = { 300, 600 };
162 int[] columnAlign = { SWT.LEFT, SWT.LEFT };
164 createColumn( columnName, columnSize, columnAlign );
168 * Build real columns with attributes.
170 * @param name
171 * @param size
173 private void createColumn(String[] name, int[] size, int[] align) {
174 for (int i=0; i<name.length; i++) {
175 TableViewerColumn tableColumn = new TableViewerColumn(propertyViewer, align[i]);
176 tableColumn.getColumn().setText(name[i]);
177 tableColumn.getColumn().setWidth(size[i]);
182 * Initialize User Interface.
184 public void initUI(boolean isRefresh) {
185 if(isRefresh) {
186 listTableInform.clear();
187 } else {
188 if(listTableInform.size() != 0) return;
191 try {
192 SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
193 listTableInform = sqlClient.queryForList("getProperties", userDB.getDb()); //$NON-NLS-1$
195 propertyViewer.setInput(listTableInform);
196 propertyViewer.refresh();
197 } catch (Exception e) {
198 logger.error("An error occurred while getting the propery list from " + userDB.getDisplay_name() + ".", e); //$NON-NLS-1$
200 Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
201 ExceptionDetailsErrorDialog.openError(null, "Error", Messages.get().MainEditor_19, errStatus); //$NON-NLS-1$
204 // google analytic
205 AnalyticCaller.track(RDBDBInfosEditor.ID, "PropertyComposite"); //$NON-NLS-1$
209 * Download a CSV file.
211 private void downloadCSVFile() {
212 if(propertyViewer.getTable().getItemCount() == 0) return;
213 if(!MessageDialog.openConfirm(null, CommonMessages.get().Confirm, Messages.get().TablesComposite_3)) return;
215 try {
216 byte[] strCVSContent = CSVUtils.tableToCSV(propertyViewer.getTable());//makeData(propertyViewer.getTable());
217 downloadExtFile(userDB.getDisplay_name() + "_Properties.csv", strCVSContent); //$NON-NLS-1$
219 MessageDialog.openInformation(null, CommonMessages.get().Information, Messages.get().TablesComposite_5);
220 } catch (Exception e) {
221 logger.error("An exception occurred while writing into a csv file.", e); //$NON-NLS-1$
226 * Download a file.
228 * @param fileName
229 * @param newContents
231 public void downloadExtFile(String fileName, byte[] newContents) {
232 downloadServiceHandler.setName(fileName);
233 downloadServiceHandler.setByteContent(newContents);
235 DownloadUtils.provideDownload(composite, downloadServiceHandler.getId());
238 private void registerServiceHandler() {
239 downloadServiceHandler = new DownloadServiceHandler();
240 RWT.getServiceManager().registerServiceHandler(downloadServiceHandler.getId(), downloadServiceHandler);
243 private void unregisterServiceHandler() {
244 RWT.getServiceManager().unregisterServiceHandler(downloadServiceHandler.getId());
245 downloadServiceHandler = null;
248 public void dispose() {
249 unregisterServiceHandler();
250 super.dispose();
255 * Database label provider
256 * @author sun.han
259 class PropertyInformLabelProvider extends LabelProvider implements ITableLabelProvider {
260 private UserDBDAO userDB;
262 public PropertyInformLabelProvider(UserDBDAO userDB) {
263 this.userDB = userDB;
266 @Override
267 public Image getColumnImage(Object element, int columnIndex) {
268 return null;
271 @Override
272 public String getColumnText(Object element, int columnIndex) {
273 Map resultMap = (HashMap)element;
274 String result;
276 switch( columnIndex ) {
277 case 0:
278 result = "" + resultMap.get("PROPERTY_NAME");
279 break;
281 case 1:
282 result = "" + resultMap.get("VALUE");
283 break;
285 default:
286 result = "Invalid column index";
287 break;
288 } /* end of switch */
290 return result;
296 * Name filter
298 * @author sun.han
301 class PropertyFilter extends ViewerFilter {
302 String searchString;
304 public void setSearchString(String str) {
305 this.searchString = ".*" + str + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
308 @Override
309 public boolean select(Viewer viewer, Object parentElement, Object element) {
310 if(searchString == null || searchString.length() == 0) {
311 return true;
314 Map resultMap = (HashMap)element;
315 String propertyName = ""; //$NON-NLS-1$
316 if(resultMap.get("PROPERTY_NAME") != null)
317 propertyName = ""+resultMap.get("PROPERTY_NAME"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
318 else
319 propertyName = ""+resultMap.get("name"); //$NON-NLS-1$ //$NON-NLS-2$
321 if(propertyName.matches(searchString)) return true;
322 return false;