/*
 * Copyright (c) 2004-2014 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.emf.cdo.explorer.ui.checkouts;

import org.eclipse.emf.cdo.CDOElement;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;

import org.eclipse.net4j.util.factory.ProductCreationException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * @author Eike Stepper
 */
public class ResourceGroupModifier implements CDOCheckoutContentModifier
{
  private static final Map<CDOResourceNode, ResourceGroup> RESOURCE_GROUPS = new WeakHashMap<CDOResourceNode, ResourceGroup>();

  private final String suffix;

  public ResourceGroupModifier(String extension)
  {
    suffix = "." + extension;
  }

  public final String getExtension()
  {
    return suffix.substring(1);
  }

  public Object[] modifyChildren(Object parent, Object[] children)
  {
    Map<String, ResourceGroup> resourceGroups = null;

    for (Object child : children)
    {
      if (child instanceof CDOResourceNode)
      {
        CDOResourceNode resourceNode = (CDOResourceNode)child;
        String name = resourceNode.getName();
        if (name != null && name.endsWith(suffix))
        {
          if (resourceGroups == null)
          {
            resourceGroups = new HashMap<String, ResourceGroup>();
          }

          String groupName = name.substring(0, name.length() - suffix.length());
          ResourceGroup resourceGroup = getResourceGroup(resourceNode);
          resourceGroups.put(groupName, resourceGroup);
        }
      }
    }

    if (resourceGroups != null)
    {
      List<Object> result = new ArrayList<Object>();
      for (Object child : children)
      {
        child = replacement(resourceGroups, child);
        if (child != null)
        {
          result.add(child);
        }
      }

      children = result.toArray();
    }

    return children;
  }

  protected ResourceGroup createResourceGroup(CDOResourceNode resourceNode)
  {
    return new ResourceGroup(resourceNode);
  }

  private ResourceGroup getResourceGroup(CDOResourceNode resourceNode)
  {
    synchronized (RESOURCE_GROUPS)
    {
      ResourceGroup resourceGroup = RESOURCE_GROUPS.get(resourceNode);
      if (resourceGroup == null)
      {
        resourceGroup = createResourceGroup(resourceNode);
        RESOURCE_GROUPS.put(resourceNode, resourceGroup);
      }
      else
      {
        resourceGroup.reset();
      }

      return resourceGroup;
    }
  }

  private Object replacement(Map<String, ResourceGroup> elements, Object child)
  {
    if (child instanceof CDOResourceNode)
    {
      CDOResourceNode resourceNode = (CDOResourceNode)child;
      String name = resourceNode.getName();
      if (name != null)
      {
        int lastDot = name.lastIndexOf('.');
        if (lastDot != -1)
        {
          String groupName = name.substring(0, lastDot);
          CDOElement element = elements.get(groupName);
          if (element != null)
          {
            element.addChild(resourceNode);

            if (name.endsWith(suffix))
            {
              return element;
            }

            return null;
          }
        }
      }
    }

    return child;
  }

  /**
   * @author Eike Stepper
   */
  public static abstract class Factory extends CDOCheckoutContentModifier.Factory
  {
    public static final String TYPE_PREFIX = "resource.group.";

    private final String extension;

    public Factory(String extension)
    {
      super(TYPE_PREFIX + extension);
      this.extension = extension;
    }

    @Override
    public final ResourceGroupModifier create(String description) throws ProductCreationException
    {
      return new ResourceGroupModifier(extension);
    }
  }
}
