/*
 * Copyright 2000-2012 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.
 */

/*
 * User: anna
 * Date: 11-Nov-2008
 */
package org.jetbrains.idea.eclipse;

import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Processor;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;

public class EclipseProjectFinder implements EclipseXml {
  public static void findModuleRoots(final List<String> paths, final String rootPath, @Nullable Processor<String> progressUpdater) {
    if (progressUpdater != null) {
      progressUpdater.process(rootPath);
    }

    final String project = findProjectName(rootPath);
    if (project != null) {
      paths.add(rootPath);
    }

    final File root = new File(rootPath);
    if (root.isDirectory()) {
      final File[] files = root.listFiles();
      if (files != null) {
        for (File file : files) {
          findModuleRoots(paths, file.getPath(), progressUpdater);
        }
      }
    }
  }

  @Nullable
  public static String findProjectName(String rootPath) {
    String name = null;
    final File file = new File(rootPath, DOT_PROJECT_EXT);
    if (file.isFile()) {
      try {
        name = JDOMUtil.loadDocument(file).getRootElement().getChildText(NAME_TAG);
      }
      catch (JDOMException e) {
        return null;
      }
      catch (IOException e) {
        return null;
      }
    }
    return name;
  }

  @Nullable
  public static LinkedResource findLinkedResource(@NotNull String projectPath, @NotNull String relativePath) {
    String independentPath = FileUtil.toSystemIndependentName(relativePath);
    @NotNull String resourceName = independentPath;
    final int idx = independentPath.indexOf('/');
    if (idx != -1) {
      resourceName = independentPath.substring(0, idx);
    }
    final File file = new File(projectPath, DOT_PROJECT_EXT);
    if (file.isFile()) {
      try {
        for (Object o : JDOMUtil.loadDocument(file).getRootElement().getChildren(LINKED_RESOURCES)) {
          for (Object l : ((Element)o).getChildren(LINK)) {
            if (Comparing.strEqual(((Element)l).getChildText(NAME_TAG), resourceName)) {
              LinkedResource linkedResource = new LinkedResource();
              final String relativeToLinkedResourcePath =
                independentPath.length() > resourceName.length() ? independentPath.substring(resourceName.length()) : "";

              final Element locationURI = ((Element)l).getChild("locationURI");
              if (locationURI != null) {
                linkedResource.setURI(FileUtil.toSystemIndependentName(locationURI.getText()) + relativeToLinkedResourcePath);
              }

              final Element location = ((Element)l).getChild("location");
              if (location != null) {
                linkedResource.setLocation(FileUtil.toSystemIndependentName(location.getText()) + relativeToLinkedResourcePath);
              }
              return linkedResource;
            }
          }
        }
      }
      catch (Exception ignore) {
      }
    }
    return null;
  }

  public static void collectUnknownNatures(String path, Set<String> naturesNames) {
    final File projectfile = new File(path, DOT_PROJECT_EXT);
    try {
      final Element natures = JDOMUtil.loadDocument(projectfile).getRootElement().getChild("natures");
      if (natures != null) {
        final List naturesList = natures.getChildren("nature");
        for (Object nature : naturesList) {
          final String natureName = ((Element)nature).getText();
          if (!StringUtil.isEmptyOrSpaces(natureName)) {
            naturesNames.add(natureName);
          }
        }
      }
    }
    catch (Exception ignore) {
    }
    naturesNames.remove("org.eclipse.jdt.core.javanature");
  }

  public static class LinkedResource {
    private String myURI;
    private String myLocation;

    public String getVariableName() {
      final int idx = myURI.indexOf('/');
      return idx > -1 ? myURI.substring(0, idx) : myURI;
    }

    @Nullable
    public String getRelativeToVariablePath() {
      final int idx = myURI.indexOf('/');
      return idx > -1 && idx + 1 < myURI.length() ? myURI.substring(idx + 1) : null;
    }

    public boolean containsPathVariable() {
      return myURI != null;
    }

    public void setURI(String URI) {
      myURI = URI;
    }

    public String getLocation() {
      return myLocation;
    }

    public void setLocation(String location) {
      myLocation = location;
    }
  }
}
@@ -2067,16 +2067,144 @@
 E_TAG);%0A
+        if (StringUtil.isEmptyOrSpaces(name)) %7B%0A          return null;%0A        %7D%0A        name = name.replace(%22%5Cn%22, %22 %22).trim();%0A
       %7D%0A

trim names read from .project