/**
* Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy
+ * European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
- *
+ *
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
+import java.util.EnumSet;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;
+
+import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteConfiguration;
+import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.config.ICdmSource;
import eu.etaxonomy.cdm.database.DbSchemaValidation;
-import eu.etaxonomy.cdm.database.ICdmDataSource;
import eu.etaxonomy.cdm.ext.geo.IEditGeoService;
+import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.common.Language;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator;
+import eu.etaxonomy.cdm.persistence.hibernate.permission.Role;
import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
import eu.etaxonomy.taxeditor.io.ExportManager;
import eu.etaxonomy.taxeditor.io.ImportManager;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
+
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
+import eu.etaxonomy.taxeditor.session.mock.MockCdmEntitySessionManager;
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
import eu.etaxonomy.taxeditor.view.datasource.CdmDataSourceViewPart;
* This implementation of ICdmDataRepository depends on hibernate sessions to
* store the data correctly for the current session. No state is held in this
* class.
- *
+ *
* Only methods that either get or manipulate data are exposed here. So this
* class acts as a facade for the methods in cdmlib-service.
- *
+ *
* @author n.hoffmann
* @created 17.03.2009
* @version 1.0
private Language language;
- private ICdmDataSource cdmDatasource;
+ private ICdmSource cdmSource;
private boolean isConnected;
+
+
/**
* <p>
* getDefault
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.taxeditor.store.CdmStore} object.
*/
protected static CdmStore getDefault() {
if (instance != null && instance.isConnected) {
return instance;
- } else if (instance == null || !instance.isConnected) {
-
- StoreUtil
- .warningDialog(
- "Application is not connected to a datastore",
- instance,
- "The requested operation is only available when "
- + "connected to a datasource. You may choose a datasource to connect to or create a new one in the datasource view.");
+ } else{// if (instance == null || !instance.isConnected) {
- StoreUtil.showView(CdmDataSourceViewPart.ID);
+ MessagingUtils.noDataSourceWarningDialog(instance);
+ AbstractUtility.showView(CdmDataSourceViewPart.ID);
+ return null;
}
-
- throw new RuntimeException();
}
/**
*/
public static void connect() {
- ICdmDataSource datasource = CdmDataSourceRepository
- .getCurrentDataSource();
+ ICdmSource cdmSource;
+ try {
+ cdmSource = CdmDataSourceRepository.getCurrentCdmSource();
+ connect(cdmSource);
+ } catch (Exception e) {
+ MessagingUtils.messageDialog("Connection to CDM Source Failed", CdmStore.class, "Could not connect to target CDM Source", e);
+ }
+
- connect(datasource);
}
/**
* Initialize with a specific datasource
- *
+ *
* @param datasource
* a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
*/
- public static void connect(ICdmDataSource datasource) {
- connect(datasource, DEFAULT_DB_SCHEMA_VALIDATION,
+ public static void connect(ICdmSource cdmSource) {
+ connect(cdmSource, DEFAULT_DB_SCHEMA_VALIDATION,
DEFAULT_APPLICATION_CONTEXT);
}
/**
* Initialize and provide
- *
+ *
* @param datasource
* @param dbSchemaValidation
* @param applicationContextBean
*/
- private static void connect(final ICdmDataSource datasource,
+ private static void connect(final ICdmSource cdmSource,
final DbSchemaValidation dbSchemaValidation,
final Resource applicationContextBean) {
- StoreUtil.info("Connecting to datasource: " + datasource);
+ MessagingUtils.info("Connecting to datasource: " + cdmSource);
- job = new CdmStoreConnector(Display.getDefault(), datasource,
+ job = new CdmStoreConnector(Display.getDefault(), cdmSource,
dbSchemaValidation, applicationContextBean);
job.setUser(true);
job.setPriority(Job.BUILD);
/**
* Closes the current application context
- *
+ *
* @param monitor
* a {@link org.eclipse.core.runtime.IProgressMonitor} object.
*/
Display.getDefault().asyncExec(new Runnable() {
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Runnable#run()
*/
@Override
private void close() {
isConnected = false;
- cdmDatasource = null;
+ cdmSource = null;
}
- static void setInstance(CdmApplicationController applicationController,
- ICdmDataSource dataSource) {
- instance = new CdmStore(applicationController, dataSource);
+ static void setInstance(ICdmApplicationConfiguration applicationController,
+ ICdmSource cdmSource) {
+ instance = new CdmStore(applicationController, cdmSource);
}
- private CdmStore(CdmApplicationController applicationController,
- ICdmDataSource dataSource) {
+ private CdmStore(ICdmApplicationConfiguration applicationController,
+ ICdmSource cdmSource) {
this.applicationConfiguration = applicationController;
- this.cdmDatasource = dataSource;
+ this.cdmSource = cdmSource;
isConnected = true;
}
/**
* All calls to the datastore require
- *
+ *
* @return
*/
private ICdmApplicationConfiguration getApplicationConfiguration() {
try {
return applicationConfiguration;
} catch (Exception e) {
- StoreUtil.error(CdmStore.class, e);
+ MessagingUtils.error(CdmStore.class, e);
}
return null;
}
* <p>
* getCurrentApplicationController
* </p>
- *
+ *
* @return a
- * {@link eu.etaxonomy.cdm.api.application.CdmApplicationController}
+ * {@link eu.etaxonomy.cdm.remote.api.application.CdmApplicationController}
* object.
*/
public static ICdmApplicationConfiguration getCurrentApplicationConfiguration() {
/**
* Creates a new conversation, binds resources to the conversation and start
* a transaction for this conversation.
- *
+ *
* @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
* object.
*/
public static ConversationHolder createConversation() {
ConversationHolder conversation = getCurrentApplicationConfiguration()
.NewConversation();
- try{
+ try {
conversation.startTransaction();
}catch(Exception e){
- StoreUtil.errorDialog("No database connection", CdmStore.class, "No database connection available", e);
+ MessagingUtils.messageDialog("No database connection", CdmStore.class, "No database connection available", e);
}
return conversation;
}
+
+ //FIXME:Remoting should be removed after moving completely to remoting
+ private MockCdmEntitySessionManager mockCdmEntitySessionManager;
+
+ private ICdmEntitySessionManager getSessionManager() {
+ //FIXME:Remoting we should only have CdmApplicationRemoteConfiguration after move to remoting
+ // bad hack which should be finally removed
+ if(getCurrentApplicationConfiguration() instanceof CdmApplicationRemoteController) {
+ return ((CdmApplicationRemoteController)getCurrentApplicationConfiguration()).getCdmEntitySessionManager();
+ } else {
+ if(mockCdmEntitySessionManager == null) {
+ mockCdmEntitySessionManager = new MockCdmEntitySessionManager();
+ }
+ return mockCdmEntitySessionManager;
+ }
+ }
+
+ public static ICdmEntitySessionManager getCurrentSessionManager() {
+ if (getDefault() != null) {
+ return getDefault().getSessionManager();
+ }
+ return null;
+
+ }
/**
- * Generic method that will return an implementation of the given service
- * interface or <code>null</code> if the
- *
+ * Generic method that will scan the getters of {@link ICdmApplicationConfiguration} for the given service
+ * interface. If a matching getter is found the according service implementation is returned by
+ * invoking the getter otherwise the method returns <code>null</code>.
+ *
* @param <T>
* @param serviceClass
- * @return
+ * @return the configured implementation of <code>serviceClass</code> or <code>null</code>
*/
public static <T extends IService> T getService(Class<T> serviceClass) {
ICdmApplicationConfiguration configuration = getCurrentApplicationConfiguration();
- Method[] methods = ICdmApplicationConfiguration.class
- .getDeclaredMethods();
+ Method[] methods = ICdmApplicationConfiguration.class.getDeclaredMethods();
T service = null;
service = (T) method.invoke(configuration, null);
break;
} catch (IllegalArgumentException e) {
- StoreUtil.error(CdmStore.class, e);
+ MessagingUtils.error(CdmStore.class, e);
} catch (IllegalAccessException e) {
- StoreUtil.error(CdmStore.class, e);
+ MessagingUtils.error(CdmStore.class, e);
} catch (InvocationTargetException e) {
- StoreUtil.error(CdmStore.class, e);
+ MessagingUtils.error(CdmStore.class, e);
}
}
}
* <p>
* getAuthenticationManager
* </p>
- *
+ *
* @return a
* {@link org.springframework.security.authentication.ProviderManager}
* object.
return getCurrentApplicationConfiguration().getAuthenticationManager();
}
+ /**
+ * <p>
+ * getAuthenticationManager
+ * </p>
+ *
+ * @return a
+ * {@link ICdmPermissionEvaluator} object.
+ */
+ public static ICdmPermissionEvaluator getPermissionEvaluator() {
+ return getCurrentApplicationConfiguration().getPermissionEvaluator();
+ }
+
/**
* <p>
* getGeoService
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.cdm.ext.geo.IEditGeoService} object.
*/
public static IEditGeoService getGeoService() {
"editGeoService");
}
+ /*
+ * SECURITY RELATED CONVENIENCE METHODS
+ */
+
+ /**
+ * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
+ *
+ * @param targetDomainObject
+ * @param permission
+ * @return
+ */
+ public static boolean currentAuthentiationHasPermission(CdmBase targetDomainObject, EnumSet<CRUD> permission){
+ //TODO use getCurrentApplicationConfiguration().currentAuthentiationHasPermission(CdmBase targetDomainObject, Operation permission) instead
+ SecurityContext context = SecurityContextHolder.getContext();
+ PermissionEvaluator pe = getPermissionEvaluator();
+ boolean hasPermission = false;
+ try {
+ hasPermission = getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject,
+ permission);
+ } catch (org.springframework.security.access.AccessDeniedException e) {
+ /* IGNORE */
+ }
+ return hasPermission;
+ }
+
+ /**
+ * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication, java.lang.Object, java.lang.Object)
+ *
+ * @param targetDomainObject
+ * @param permission
+ * @return
+ */
+ public static boolean currentAuthentiationHasPermission(Class<? extends CdmBase> targetType, EnumSet<CRUD> permission){
+ boolean hasPermission = false;
+ try {
+ hasPermission = getPermissionEvaluator().hasPermission(getCurrentAuthentiation(), null, targetType.getName(), permission);
+ } catch (org.springframework.security.access.AccessDeniedException e) {
+ /* IGNORE */
+ }
+ return hasPermission;
+ }
+
+ public static boolean currentAuthentiationHasOneOfRoles(Role ... roles){
+ boolean hasPermission = false;
+ try {
+ hasPermission = getPermissionEvaluator().hasOneOfRoles(getCurrentAuthentiation(), roles);
+ } catch (org.springframework.security.access.AccessDeniedException e) {
+ /* IGNORE */
+ }
+ return hasPermission;
+ }
+
+ public static Authentication getCurrentAuthentiation() {
+ SecurityContext context = SecurityContextHolder.getContext();
+ return context.getAuthentication();
+ }
+
/*
* LANGUAGE
*/
/**
- * <p>
- * getDefaultLanguage
- * </p>
- *
+ * Provides access to the global default language set in the application preferences.
+ *
* @return a {@link eu.etaxonomy.cdm.model.common.Language} object.
*/
public static Language getDefaultLanguage() {
* <p>
* setDefaultLanguage
* </p>
- *
+ *
* @param language
* a {@link eu.etaxonomy.cdm.model.common.Language} object.
*/
* <p>
* Getter for the field <code>loginManager</code>.
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.taxeditor.store.LoginManager} object.
*/
public static LoginManager getLoginManager() {
* <p>
* Getter for the field <code>contextManager</code>.
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.taxeditor.store.ContextManager} object.
*/
public static ContextManager getContextManager() {
* <p>
* Getter for the field <code>importHandler</code>.
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.taxeditor.io.ImportManager} object.
*/
public static ImportManager getImportManager() {
* <p>
* Getter for the field <code>exportHandler</code>.
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.taxeditor.io.ExportManager} object.
*/
public static ExportManager getExportManager() {
/**
* Whether this CdmStore is currently connected to a datasource
- *
+ *
* @return a boolean.
*/
public static boolean isActive() {
return instance != null && instance.isConnected;
}
+ public static ICdmSource getActiveCdmSource() {
+ if (isActive()) {
+ return instance.getCdmSource();
+ }
+ return null;
+ }
+
/**
* <p>
* getDataSource
* </p>
- *
+ *
* @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
+ * @deprecated currently retained for backward compatibility - use {@link getActiveCdmSource()} instead
*/
- public static ICdmDataSource getDataSource() {
- if (isActive()) {
- return instance.getDatasource();
- }
- return null;
- }
+// public static ICdmDataSource getDataSource() {
+// if (isActive()) {
+// return (ICdmDataSource)instance.getCdmSource();
+// }
+// return null;
+// }
/**
* @return
*/
- private ICdmDataSource getDatasource() {
- return cdmDatasource;
+ private ICdmSource getCdmSource() {
+ return cdmSource;
}
}