including changes from cdmlib-print
[taxeditor.git] / taxeditor-store / src / main / java / eu / etaxonomy / taxeditor / datasource / view / 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.datasource.view;
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.datasource.view.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 view.getService().schedule(job);
107 }
108
109 /**
110 * <p>Getter for the field <code>dataSource</code>.</p>
111 *
112 * @return the dataSource
113 */
114 public ICdmDataSource getDataSource() {
115 return dataSource;
116 }
117
118 private void getMetaDataFromDataSource(ICdmDataSource dataSource){
119 try {
120 if(isRunning()){
121
122 try {
123 for(MetaDataPropertyName metaDataPropertyName : MetaDataPropertyName.values()){
124 Object result = dataSource.getSingleValue(metaDataPropertyName.getSqlQuery());
125 if(result != null){
126 metaDataMap.put(metaDataPropertyName, (String) result);
127 }
128 }
129 dataSource.closeOpenConnections();
130 } catch (SQLException e) {
131 StoreUtil.warn(this.getClass(), "SQLException when trying to access: " + dataSource.getName() + ". " + e.getMessage());
132 }
133 }
134 } catch (Exception e) {
135 StoreUtil.error(this.getClass(), e);
136 }
137 }
138
139 private Map<MetaDataPropertyName, String> getDefaultMetaDataMap(){
140 Map<MetaDataPropertyName, String> resultMap = new HashMap<MetaDataPropertyName, String>(MetaDataPropertyName.values().length);
141
142 for(MetaDataPropertyName metaDataPropertyName : MetaDataPropertyName.values()){
143 resultMap.put(metaDataPropertyName, null);
144 }
145
146 return resultMap;
147 }
148
149 /**
150 * <p>Getter for the field <code>metaDataMap</code>.</p>
151 *
152 * @return the metaDataMap
153 */
154 public Map<MetaDataPropertyName, String> getMetaDataMap() {
155 return metaDataMap;
156 }
157
158 /**
159 * <p>isDataSourceCompatible</p>
160 *
161 * @return a boolean.
162 */
163 public boolean isDataSourceCompatible(){
164 String version = metaDataMap.get(MetaDataPropertyName.DB_SCHEMA_VERSION);
165 return version == null ? false : CdmMetaData.isDbSchemaVersionCompatible(version);
166 }
167
168 /**
169 * <p>getMetaData</p>
170 *
171 * @param metaDataPropertyName a {@link eu.etaxonomy.cdm.model.common.CdmMetaData.MetaDataPropertyName} object.
172 * @return a {@link java.lang.String} object.
173 */
174 public String getMetaData(MetaDataPropertyName metaDataPropertyName){
175 String property = metaDataMap.get(metaDataPropertyName);
176 return property != null ? property : DEFAULT_ENTRY;
177 }
178
179 /**
180 * <p>isRunning</p>
181 *
182 * @return the running
183 */
184 public boolean isRunning() {
185 return running;
186 }
187
188 /* (non-Javadoc)
189 * @see java.lang.Object#toString()
190 */
191 /** {@inheritDoc} */
192 @Override
193 public String toString() {
194 return dataSource.getName();
195 }
196
197 /**
198 * <p>dispose</p>
199 */
200 public void dispose(){
201 job.cancel();
202 }
203 }