/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jetbrains.idea.svn;

import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.changes.VcsDirtyScope;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class SvnScopeZipper implements Runnable {

  @NotNull private final VcsDirtyScope myIn;
  @NotNull private final List<FilePath> myRecursiveDirs;
  // instead of set and heavy equals of file path
  @NotNull private final Map<String, MyDirNonRecursive> myNonRecursiveDirs;

  public SvnScopeZipper(@NotNull VcsDirtyScope in) {
    myIn = in;
    myRecursiveDirs = ContainerUtil.newArrayList(in.getRecursivelyDirtyDirectories());
    myNonRecursiveDirs = ContainerUtil.newHashMap();
  }

  public void run() {
    // if put directly into dirty scope, to access a copy will be created every time
    final Set<FilePath> files = myIn.getDirtyFilesNoExpand();

    for (FilePath file : files) {
      if (file.isDirectory()) {
        final VirtualFile vFile = file.getVirtualFile();
        // todo take care about this 'not valid' - right now keeping things as they used to be
        final MyDirNonRecursive me = createOrGet(file);
        if (vFile != null && vFile.isValid()) {
          for (VirtualFile child : vFile.getChildren()) {
            me.add(VcsUtil.getFilePath(child));
          }
        }
      }
      else {
        final FilePath parent = file.getParentPath();
        if (parent != null) {
          final MyDirNonRecursive item = createOrGet(parent);
          item.add(file);
        }
      }
    }
  }

  @NotNull
  private MyDirNonRecursive createOrGet(@NotNull FilePath parent) {
    String key = getKey(parent);
    MyDirNonRecursive result = myNonRecursiveDirs.get(key);

    if (result == null) {
      result = new MyDirNonRecursive(parent);
      myNonRecursiveDirs.put(key, result);
    }

    return result;
  }

  @NotNull
  public List<FilePath> getRecursiveDirs() {
    return myRecursiveDirs;
  }

  @NotNull
  public Map<String, MyDirNonRecursive> getNonRecursiveDirs() {
    return myNonRecursiveDirs;
  }

  public static String getKey(@NotNull FilePath path) {
    return path.getPresentableUrl();
  }

  static class MyDirNonRecursive {

    @NotNull private final FilePath myDir;
    // instead of set and heavy equals of file path
    @NotNull private final Map<String, FilePath> myChildren;

    private MyDirNonRecursive(@NotNull FilePath dir) {
      myDir = dir;
      myChildren = ContainerUtil.newHashMap();
    }

    public void add(@NotNull FilePath path) {
      myChildren.put(getKey(path), path);
    }

    @NotNull
    public Collection<FilePath> getChildrenList() {
      return myChildren.values();
    }

    @NotNull
    public FilePath getDir() {
      return myDir;
    }
  }
}

@@ -997,16 +997,86 @@
 l.Set;%0A%0A
+import static com.intellij.util.containers.ContainerUtil.newHashSet;%0A%0A
 public c
@@ -3054,17 +3054,16 @@
 rsive %7B%0A
-%0A
     @Not
@@ -3101,60 +3101,8 @@
 ir;%0A
-    // instead of set and heavy equals of file path%0A
     
@@ -3124,28 +3124,20 @@
 e final 
-Map%3CString, 
+Set%3C
 FilePath
@@ -3148,16 +3148,31 @@
 Children
+ = newHashSet()
 ;%0A%0A    p
@@ -3244,55 +3244,8 @@
 ir;%0A
-      myChildren = ContainerUtil.newHashMap();%0A
     
@@ -3314,26 +3314,12 @@
 ren.
-put(getKey(path), 
+add(
 path
@@ -3389,24 +3389,24 @@
 renList() %7B%0A
+
       return
@@ -3420,17 +3420,8 @@
 dren
-.values()
 ;%0A  

Simplify "SvnScopeZipper.MyDirNonRecursive"