Merged refactoring from development branch.
[taxeditor.git] / taxeditor-store / src / main / java / eu / etaxonomy / taxeditor / view / datasource / CdmMetaDataAwareDataSourceContainer.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.view.datasource;
12
13 import java.sql.SQLException;
14 import java.util.HashMap;
15 import java.util.Map;
16
17 import org.eclipse.core.runtime.IProgressMonitor;
18 import org.eclipse.core.runtime.IStatus;
19 import org.eclipse.core.runtime.Status;
20 import org.eclipse.core.runtime.jobs.Job;
21 import org.eclipse.jface.viewers.StructuredViewer;
22 import org.eclipse.swt.widgets.Display;
23
24 import eu.etaxonomy.cdm.database.ICdmDataSource;
25 import eu.etaxonomy.cdm.model.common.CdmMetaData;
26 import eu.etaxonomy.cdm.model.common.CdmMetaData.MetaDataPropertyName;
27 import eu.etaxonomy.taxeditor.store.StoreUtil;
28
29 /**
30 * <p>CdmMetaDataAwareDataSourceContainer class.</p>
31 *
32 * @author n.hoffmann
33 * @created Sep 22, 2010
34 * @version 1.0
35 */
36 public class CdmMetaDataAwareDataSourceContainer {
37
38 private class MetaDataJob extends Job{
39
40 /**
41 * @param name
42 */
43 public MetaDataJob(String dataSourceName) {
44 super("Retrieving meta data for datasource: " + dataSourceName);
45 }
46
47 /* (non-Javadoc)
48 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
49 */
50 @Override
51 protected IStatus run(IProgressMonitor monitor) {
52 if(!monitor.isCanceled()){
53 try {
54 running = dataSource.testConnection();
55 } catch (Exception e) {
56 running = false;
57 }
58 }
59
60 if(!monitor.isCanceled()){
61 getMetaDataFromDataSource(dataSource);
62 }
63
64 if(!monitor.isCanceled()){
65 Display.getDefault().asyncExec(new Runnable(){
66
67 @Override
68 public void run() {
69 viewer.update(CdmMetaDataAwareDataSourceContainer.this, null);
70 }
71
72 });
73 }
74
75 return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
76 }
77
78 }
79
80 /** Constant <code>DEFAULT_ENTRY="-"</code> */
81 public static final String DEFAULT_ENTRY = "-";
82
83 private ICdmDataSource dataSource;
84
85 private boolean running;
86
87 private Map<MetaDataPropertyName, String> metaDataMap;
88
89 private StructuredViewer viewer;
90
91 private MetaDataJob job;
92
93 /**
94 * <p>Constructor for CdmMetaDataAwareDataSourceContainer.</p>
95 *
96 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
97 * @param view a {@link eu.etaxonomy.taxeditor.view.datasource.CdmDataSourceViewPart} object.
98 */
99 public CdmMetaDataAwareDataSourceContainer(ICdmDataSource dataSource, CdmDataSourceViewPart view){
100 this.dataSource = dataSource;
101 this.viewer = view.getViewer();
102
103 metaDataMap = getDefaultMetaDataMap();
104
105 job = new MetaDataJob(dataSource.getName());
106 job.setPriority(Job.DECORATE);
107 view.getService().schedule(job);
108 }
109
110 /**
111 * <p>Getter for the field <code>dataSource</code>.</p>
112 *
113 * @return the dataSource
114 */
115 public ICdmDataSource getDataSource() {
116 return dataSource;
117 }
118
119 private void getMetaDataFromDataSource(ICdmDataSource dataSource){
120 try {
121 if(isRunning()){
122
123 try {
124 for(MetaDataPropertyName metaDataPropertyName : MetaDataPropertyName.values()){
125 Object result = dataSource.getSingleValue(metaDataPropertyName.getSqlQuery());
126 if(result != null){
127 metaDataMap.put(metaDataPropertyName, (String) result);
128 }
129 }
130 dataSource.closeOpenConnections();
131 } catch (SQLException e) {
132 StoreUtil.warn(this.getClass(), "SQLException when trying to access: " + dataSource.getName() + ". " + e.getMessage());
133 }
134 }
135 } catch (Exception e) {
136 StoreUtil.error(this.getClass(), e);
137 }
138 }
139
140 private Map<MetaDataPropertyName, String> getDefaultMetaDataMap(){
141 Map<MetaDataPropertyName, String> resultMap = new HashMap<MetaDataPropertyName, String>(MetaDataPropertyName.values().length);
142
143 for(MetaDataPropertyName metaDataPropertyName : MetaDataPropertyName.values()){
144 resultMap.put(metaDataPropertyName, null);
145 }
146
147 return resultMap;
148 }
149
150 /**
151 * <p>Getter for the field <code>metaDataMap</code>.</p>
152 *
153 * @return the metaDataMap
154 */
155 public Map<MetaDataPropertyName, String> getMetaDataMap() {
156 return metaDataMap;
157 }
158
159 /**
160 * <p>isDataSourceCompatible</p>
161 *
162 * @return a boolean.
163 */
164 public boolean isDataSourceCompatible(){
165 String version = metaDataMap.get(MetaDataPropertyName.DB_SCHEMA_VERSION);
166 return version == null ? false : CdmMetaData.isDbSchemaVersionCompatible(version);
167 }
168
169 /**
170 * <p>getMetaData</p>
171 *
172 * @param metaDataPropertyName a {@link eu.etaxonomy.cdm.model.common.CdmMetaData.MetaDataPropertyName} object.
173 * @return a {@link java.lang.String} object.
174 */
175 public String getMetaData(MetaDataPropertyName metaDataPropertyName){
176 String property = metaDataMap.get(metaDataPropertyName);
177 return property != null ? property : DEFAULT_ENTRY;
178 }
179
180 /**
181 * <p>isRunning</p>
182 *
183 * @return the running
184 */
185 public boolean isRunning() {
186 return running;
187 }
188
189 /* (non-Javadoc)
190 * @see java.lang.Object#toString()
191 */
192 /** {@inheritDoc} */
193 @Override
194 public String toString() {
195 return dataSource.getName();
196 }
197
198 /**
199 * <p>dispose</p>
200 */
201 public void dispose(){
202 job.cancel();
203 }
204 }