/*
 * Copyright (c) 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * 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:
 *    Eike Stepper - initial API and implementation
 *    Victor Roldan Betancort - maintenance
 */
package org.eclipse.emf.cdo.internal.explorer.bundle;

import org.eclipse.emf.cdo.internal.explorer.checkouts.CDOCheckoutManagerImpl;
import org.eclipse.emf.cdo.internal.explorer.repositories.CDORepositoryManagerImpl;

import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.om.OMBundle;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.net4j.util.om.OSGiActivator;
import org.eclipse.net4j.util.om.log.OMLogger;
import org.eclipse.net4j.util.om.trace.OMTracer;

import java.io.File;

/**
 * The <em>Operations & Maintenance</em> class of this bundle.
 *
 * @author Eike Stepper
 */
public abstract class OM
{
  public static final String BUNDLE_ID = "org.eclipse.emf.cdo.explorer"; //$NON-NLS-1$

  public static final OMBundle BUNDLE = OMPlatform.INSTANCE.bundle(BUNDLE_ID, OM.class);

  public static final OMTracer DEBUG = BUNDLE.tracer("debug"); //$NON-NLS-1$

  public static final OMLogger LOG = BUNDLE.logger();

  private static final String STATE_LOCATION = System.getProperty("org.eclipse.emf.cdo.explorer.stateLocation");

  private static CDORepositoryManagerImpl repositoryManager;

  private static CDOCheckoutManagerImpl checkoutManager;

  public static void initializeManagers(File stateLocation)
  {
    disposeManagers();

    repositoryManager = new CDORepositoryManagerImpl(new File(stateLocation, "rp"));
    LifecycleUtil.activate(repositoryManager);

    checkoutManager = new CDOCheckoutManagerImpl(new File(stateLocation, "co"));
    LifecycleUtil.activate(checkoutManager);
  }

  public static void disposeManagers()
  {
    if (checkoutManager != null)
    {
      LifecycleUtil.deactivate(checkoutManager);
      checkoutManager = null;
    }

    if (repositoryManager != null)
    {
      LifecycleUtil.deactivate(repositoryManager);
      repositoryManager = null;
    }
  }

  public static CDORepositoryManagerImpl getRepositoryManager()
  {
    return repositoryManager;
  }

  public static CDOCheckoutManagerImpl getCheckoutManager()
  {
    return checkoutManager;
  }

  /**
   * @author Eike Stepper
   */
  public static final class Activator extends OSGiActivator
  {
    public Activator()
    {
      super(BUNDLE);
    }

    @Override
    protected void doStart() throws Exception
    {
      super.doStart();

      String stateLocation = STATE_LOCATION != null ? STATE_LOCATION : BUNDLE.getStateLocation();
      initializeManagers(new File(stateLocation));
    }

    @Override
    protected void doStop() throws Exception
    {
      disposeManagers();
      super.doStop();
    }
  }
}
