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
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
;
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
;
60 * This class is to the properties of a database.
61 * Users can check the current value of each property.
64 * - Setting the value on the screen without directly throwing a query to the database.
69 public class PropertyComposite
extends DBInfosComposite
{
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
;
81 /* Download service handler */
82 private Composite composite
;
83 private DownloadServiceHandler downloadServiceHandler
;
84 private List listTableInform
= new ArrayList
<>();
91 public PropertyComposite(Composite parent
, int style
, UserDBDAO userDB
) {
93 setLayout(new GridLayout(1, false));
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() {
117 public void widgetSelected(SelectionEvent e
) {
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));
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() {
144 public void widgetSelected(SelectionEvent e
) {
148 btnCsvExport
.setBounds(0, 0, 94, 28);
149 btnCsvExport
.setText(Messages
.get().TablesComposite_btnCsvExport_text
);
152 registerServiceHandler();
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.
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
) {
186 listTableInform
.clear();
188 if(listTableInform
.size() != 0) return;
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$
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;
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$
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();
255 * Database label provider
259 class PropertyInformLabelProvider
extends LabelProvider
implements ITableLabelProvider
{
260 private UserDBDAO userDB
;
262 public PropertyInformLabelProvider(UserDBDAO userDB
) {
263 this.userDB
= userDB
;
267 public Image
getColumnImage(Object element
, int columnIndex
) {
272 public String
getColumnText(Object element
, int columnIndex
) {
273 Map resultMap
= (HashMap
)element
;
276 switch( columnIndex
) {
278 result
= "" + resultMap
.get("PROPERTY_NAME");
282 result
= "" + resultMap
.get("VALUE");
286 result
= "Invalid column index";
288 } /* end of switch */
301 class PropertyFilter
extends ViewerFilter
{
304 public void setSearchString(String str
) {
305 this.searchString
= ".*" + str
+ ".*"; //$NON-NLS-1$ //$NON-NLS-2$
309 public boolean select(Viewer viewer
, Object parentElement
, Object element
) {
310 if(searchString
== null || searchString
.length() == 0) {
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$
319 propertyName
= ""+resultMap
.get("name"); //$NON-NLS-1$ //$NON-NLS-2$
321 if(propertyName
.matches(searchString
)) return true;