/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *  Contributors:
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 */
package org.eclipse.osbp.authentication.account.datamarts;

import com.vaadin.ui.Notification;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import org.eclipse.osbp.bpm.api.BPMTaskSummary;
import org.eclipse.osbp.bpm.api.IBPMEngine;
import org.eclipse.osbp.bpm.api.IBPMTaskClient;
import org.eclipse.osbp.core.api.persistence.IPersistenceService;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.runtime.common.event.IDualData;
import org.eclipse.osbp.runtime.common.i18n.ITranslator;
import org.eclipse.osbp.ui.api.datamart.DatamartData;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
import org.eclipse.osbp.ui.api.datamart.IDataMart.EType;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
import org.eclipse.osbp.user.User;
import org.eclipse.osbp.utils.vaadin.SimpleDateFormatter;
import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedAxis;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedMember;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedPosition;
import org.eclipse.osbp.xtext.datamart.common.sql.SqlCellSet;
import org.olap4j.Axis;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.slf4j.Logger;

@SuppressWarnings("serial")
@Component
public class DatamartsServiceBinder {
  private static Logger log = org.slf4j.LoggerFactory.getLogger("servicebinder");
  
  private static IPersistenceService persistenceService;
  
  private static IBPMEngine bpmEngine;
  
  private static IUserAccessService userAccessService;
  
  private static IDSLMetadataService dslMetadataService;
  
  private static IBPMTaskClient taskClient;
  
  public static IPersistenceService getPersistenceService() {
    return persistenceService;
  }
  
  public static IBPMEngine getBpmEngine() {
    return bpmEngine;
  }
  
  public static IUserAccessService getUserAccessService() {
    return userAccessService;
  }
  
  public static IDSLMetadataService getDSLMetadataService() {
    return dslMetadataService;
  }
  
  public static IBPMTaskClient getTaskClient() {
    return taskClient;
  }
  
  @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
  public synchronized void bindPersistenceMethod(final IPersistenceService persistenceService) {
    DatamartsServiceBinder.persistenceService = persistenceService;
    log.debug("Datamart PersistenceService bound");
  }
  
  public synchronized void unbindPersistenceMethod(final IPersistenceService persistenceService) {
    DatamartsServiceBinder.persistenceService = null;
    log.debug("Datamart PersistenceService unbound");
  }
  
  @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
  public synchronized void bindBPMMethod(final IBPMEngine bpmEngine) {
    DatamartsServiceBinder.bpmEngine = bpmEngine;
    log.debug("Datamart BPMEngine bound");
  }
  
  public synchronized void unbindBPMMethod(final IBPMEngine bpmEngine) {
    DatamartsServiceBinder.bpmEngine = null;
    log.debug("Datamart BPMEngine unbound");
  }
  
  @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
  public synchronized void bindUserAccessMethod(final IUserAccessService userAccessService) {
    DatamartsServiceBinder.userAccessService = userAccessService;
    log.debug("Datamart UserAccessService bound");
  }
  
  public synchronized void unbindUserAccessMethod(final IUserAccessService userAccessService) {
    DatamartsServiceBinder.userAccessService = null;
    log.debug("Datamart UserAccessService unbound");
  }
  
  @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
  public synchronized void bindDSLMetadataService(final IDSLMetadataService dslMetadataService) {
    DatamartsServiceBinder.dslMetadataService = dslMetadataService;
    log.debug("Datamart DSLMetadataService bound");
  }
  
  public synchronized void unbindDSLMetadataService(final IDSLMetadataService dslMetadataService) {
    DatamartsServiceBinder.dslMetadataService = null;
    log.debug("Datamart DSLMetadataService unbound");
  }
  
  @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
  public synchronized void bindTaskClient(final IBPMTaskClient taskClient) {
    DatamartsServiceBinder.taskClient = taskClient;
    log.debug("Datamart BPMTaskClient bound");
  }
  
  public synchronized void unbindTaskClient(final IBPMTaskClient taskClient) {
    DatamartsServiceBinder.taskClient = null;
    log.debug("Datamart BPMTaskClient unbound");
  }
}
