Project

General

Profile

Download (5.15 KB) Statistics
| Branch: | Tag: | Revision:
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

    
23
import eu.etaxonomy.cdm.database.ICdmDataSource;
24
import eu.etaxonomy.cdm.model.common.CdmMetaData;
25
import eu.etaxonomy.cdm.model.common.CdmMetaData.MetaDataPropertyName;
26
import eu.etaxonomy.taxeditor.store.StoreUtil;
27
import eu.etaxonomy.taxeditor.store.singlesource.widget.DisplayProxy;
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
				DisplayProxy.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
}
(5-5/5)