3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.store
;
13 import java
.sql
.SQLException
;
14 import java
.util
.concurrent
.CancellationException
;
16 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
17 import org
.eclipse
.core
.runtime
.IStatus
;
18 import org
.eclipse
.core
.runtime
.Status
;
19 import org
.eclipse
.core
.runtime
.jobs
.Job
;
20 import org
.eclipse
.swt
.widgets
.Display
;
21 import org
.hibernate
.collection
.internal
.AbstractPersistentCollection
;
22 import org
.hibernate
.proxy
.AbstractLazyInitializer
;
23 import org
.springframework
.core
.io
.Resource
;
25 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationController
;
26 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationRemoteController
;
27 import eu
.etaxonomy
.cdm
.api
.application
.ICdmApplicationConfiguration
;
28 import eu
.etaxonomy
.cdm
.config
.ICdmSource
;
29 import eu
.etaxonomy
.cdm
.remote
.ICdmRemoteSource
;
30 import eu
.etaxonomy
.cdm
.config
.CdmSourceException
;
31 import eu
.etaxonomy
.cdm
.database
.DatabaseTypeEnum
;
32 import eu
.etaxonomy
.cdm
.database
.DbSchemaValidation
;
33 import eu
.etaxonomy
.cdm
.database
.ICdmDataSource
;
34 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmMetaData
;
35 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmMetaData
.MetaDataPropertyName
;
36 import eu
.etaxonomy
.taxeditor
.model
.CdmProgressMonitorAdapter
;
37 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
38 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.LoginDialog
;
39 import eu
.etaxonomy
.taxeditor
.view
.datasource
.CdmDataSourceViewPart
;
43 * @created Dec 8, 2010
46 class CdmStoreConnector
extends Job
{
47 private final Display display
;
48 private final ICdmSource cdmSource
;
49 private DbSchemaValidation dbSchemaValidation
;
50 private final Resource applicationContextBean
;
54 * @param dbSchemaValidation
55 * @param applicationContextBean
57 public CdmStoreConnector(Display display
, ICdmSource cdmSource
,
58 DbSchemaValidation dbSchemaValidation
,
59 Resource applicationContextBean
) {
60 super("Connecting to datasource: " + cdmSource
);
61 this.display
= display
;
62 this.cdmSource
= cdmSource
;
63 this.dbSchemaValidation
= dbSchemaValidation
;
64 this.applicationContextBean
= applicationContextBean
;
68 public IStatus
run(final IProgressMonitor monitor
) {
70 monitor
.beginTask(getConnectionMessage(), 10);
72 // check if database is up and running
73 checkDatabaseReachable(monitor
);
75 if (!monitor
.isCanceled()) {
76 // check if the datasource actually holds data
77 checkIsNonEmptyCdmDatabase(monitor
);
80 if (dbSchemaValidation
!= DbSchemaValidation
.CREATE
81 && !monitor
.isCanceled()) {
82 // if we do not create the datasource, we want to check if the
83 // datasource is compatible with this editor
84 checkDbSchemaVersionCompatibility(monitor
);
87 // we are done with our low level checking and will free resources now
88 cdmSource
.closeOpenConnections();
90 if (!monitor
.isCanceled()) {
91 CdmStore
.close(monitor
);
94 ICdmApplicationConfiguration applicationController
= null;
96 if (!monitor
.isCanceled()) {
97 CdmProgressMonitorAdapter subprogressMonitor
= CdmProgressMonitorAdapter
98 .CreateSubMonitor(monitor
, 7);
99 // This is where we instantiate the application controller
102 applicationController
= getApplicationController(cdmSource
,subprogressMonitor
);
104 } catch (Exception e
) {
105 if(! causeIsCancelationExceptionRecursive(e
)){
106 return new Status(IStatus
.ERROR
, "Could not connect to CDM Store", "An error occurred while trying to connect to datasource: " + cdmSource
.getName(), e
);
115 if (!monitor
.isCanceled()) {
116 CdmStore
.setInstance(applicationController
, cdmSource
);
118 display
.asyncExec(new Runnable() {
122 * @see java.lang.Runnable#run()
132 MessagingUtils
.info("Application context initialized.");
133 return Status
.OK_STATUS
;
135 // Show datasource view if not shown yet
136 display
.asyncExec(new Runnable() {
140 * @see java.lang.Runnable#run()
144 StoreUtil
.showView(CdmDataSourceViewPart
.ID
);
147 return Status
.CANCEL_STATUS
;
152 private ICdmApplicationConfiguration
getApplicationController(ICdmSource cdmSource
, CdmProgressMonitorAdapter subprogressMonitor
) {
153 if(cdmSource
instanceof ICdmDataSource
) {
154 return CdmApplicationController
.NewInstance(applicationContextBean
,
155 (ICdmDataSource
)cdmSource
,
159 } else if(cdmSource
instanceof ICdmRemoteSource
) {
160 return CdmApplicationRemoteController
.NewInstance((ICdmRemoteSource
)cdmSource
,
165 throw new UnsupportedOperationException("Cannot create application controller for " + cdmSource
.getName());
168 private void authenticate() {
169 LoginDialog loginDialog
= new LoginDialog(StoreUtil
.getShell());
173 private void startContext() {
174 CdmStore
.getContextManager().notifyContextStart();
180 private String
getConnectionMessage() {
181 return cdmSource
.getConnectionMessage();
186 * @throws SQLException
188 private void checkDbSchemaVersionCompatibility(IProgressMonitor monitor
) {
189 monitor
.subTask("Checking if datasource is compatible with this editor.");
190 String dbSchemaVersion
;
191 boolean result
= false;
193 dbSchemaVersion
= cdmSource
.getDbSchemaVersion();
194 // we assume that empty dbSchemaVersion means an empty database and
195 // skip version checking
196 result
= dbSchemaVersion
== null ?
true : CdmMetaData
197 .isDbSchemaVersionCompatible(dbSchemaVersion
);
199 } catch (CdmSourceException e
) {
204 // Show an error message
207 "DatabaseCompatibilityCheck failed",
209 "The database schema for the chosen "
212 + "' \n is not valid for this version of the taxonomic editor. \n"
213 + "Please update the chosen datasource or choose a new data source to connect to in the Datasource View.",
216 monitor
.setCanceled(true);
221 private void checkIsNonEmptyCdmDatabase(IProgressMonitor monitor
) {
222 monitor
.subTask("Checking if datasource is a non empty CDM database.");
223 boolean isDbEmpty
= false;
225 isDbEmpty
= cdmSource
.isDbEmpty();
226 } catch (CdmSourceException e
) {
230 dbSchemaValidation
= DbSchemaValidation
.CREATE
;
234 private boolean causeIsCancelationExceptionRecursive(Throwable throwable
){
235 if(throwable
== null){
237 }else if(throwable
instanceof CancellationException
){
240 return causeIsCancelationExceptionRecursive(throwable
.getCause());
244 private void checkDatabaseReachable(IProgressMonitor monitor
) {
246 monitor
.subTask("Checking if datasource is reachable.");
247 cdmSource
.checkConnection();
249 } catch (CdmSourceException e
) {
250 MessagingUtils
.messageDialog("Could not connect to chosen datasource",
251 this, "Reason: " + e
.getMessage(), e
);
252 monitor
.setCanceled(true);