/*
 * Copyright (c) 2011, 2012 Eike Stepper (Loehne, 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:
 *    Victor Roldan Betancort - initial API and implementation
 */

package org.eclipse.emf.cdo.tests.db4o;

import org.eclipse.emf.cdo.server.internal.db4o.DB4OStore;

import com.db4o.ObjectContainer;
import com.db4o.ext.ExtDb4o;
import com.db4o.ext.MemoryFile;

/**
 * In-memory based DB4OStore. Just meant to be used to accelerate DB4OStore test-cases.
 * 
 * @author Victor Roldan Betancort
 */
public final class MEMDB4OStore extends DB4OStore
{

  private static ObjectContainer objectContainer;

  public MEMDB4OStore()
  {
    super(null, 0);
  }

  @Override
  public ObjectContainer openClient()
  {
    if (objectContainer == null)
    {
      objectContainer = ExtDb4o.openMemoryFile(new MemoryFile());
    }
    return objectContainer;
  }

  @Override
  protected void initObjectServer()
  {
    // no server is defined. Objects are mantained in-memory in ObjectContainer instances
  }

  @Override
  protected void tearDownObjectServer()
  {
    // no server is defined. Objects are mantained in-memory in ObjectContainer instances
  }

  @Override
  protected void closeClient(ObjectContainer container)
  {
    // no server is defined. Objects are mantained in-memory in ObjectContainer instances
  }

  public static void clearContainer()
  {
    objectContainer = ExtDb4o.openMemoryFile(new MemoryFile());
  }
}
