/*
 * Copyright (c) 2009, 2011, 2012 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
 */
package org.eclipse.net4j.util.concurrent;

import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.event.EventUtil;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.factory.Factory;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
import org.eclipse.net4j.util.lifecycle.LifecycleException;
import org.eclipse.net4j.util.lifecycle.LifecycleState;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * @author Eike Stepper
 * @since 2.0
 */
public class ExecutorServiceFactory extends Factory
{
  public static final String PRODUCT_GROUP = "org.eclipse.net4j.executorServices"; //$NON-NLS-1$

  public static final String TYPE = "default"; //$NON-NLS-1$

  public static final String DEFAULT_THREAD_GROUP_NAME = "net4j"; //$NON-NLS-1$

  public ExecutorServiceFactory()
  {
    super(PRODUCT_GROUP, TYPE);
  }

  public ExecutorService create(String threadGroupName)
  {
    if (threadGroupName == null)
    {
      threadGroupName = DEFAULT_THREAD_GROUP_NAME;
    }

    final ThreadGroup threadGroup = new ThreadGroup(threadGroupName);
    ThreadFactory threadFactory = new ThreadFactory()
    {
      private int num;

      public Thread newThread(Runnable r)
      {
        Thread thread = new Thread(threadGroup, r, threadGroup.getName() + "-Thread-" + ++num);
        thread.setDaemon(true);
        return thread;
      }
    };

    final ExecutorService executorService = Executors.newCachedThreadPool(threadFactory);
    return LifecycleUtil.delegateLifecycle(getClass().getClassLoader(), executorService, ExecutorService.class,
        new ILifecycle()
    {
      private boolean active;

      public void activate() throws LifecycleException
      {
        active = true;
      }

      public Exception deactivate()
      {
        try
        {
          executorService.shutdown();
          active = false;
          return null;
        }
        catch (Exception ex)
        {
          return ex;
        }
      }

      public LifecycleState getLifecycleState()
      {
        return active ? LifecycleState.ACTIVE : LifecycleState.INACTIVE;
      }

      public boolean isActive()
      {
        return active;
      }

      public void addListener(IListener listener)
      {
        // Do nothing
      }

      public void removeListener(IListener listener)
      {
        // Do nothing
      }

      public IListener[] getListeners()
      {
        return EventUtil.NO_LISTENERS;
      }

      public boolean hasListeners()
      {
        return false;
      }

      @Override
      public String toString()
      {
        return "CachedThreadPool";
      }
    });
  }

  public static ExecutorService get(IManagedContainer container)
  {
    return (ExecutorService)container.getElement(PRODUCT_GROUP, TYPE, null);
  }
}
