/*
 * Copyright 2000-2013 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 com.intellij.openapi.vfs.impl.win32;

import com.intellij.openapi.util.io.FileAttributes;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.win32.FileInfo;
import com.intellij.openapi.util.io.win32.IdeaWin32;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author Dmitry Avdeev
 */
class Win32FsCache {
  private final IdeaWin32 myKernel = IdeaWin32.getInstance();
  private Reference<Map<String, FileAttributes>> myCache;

  void clearCache() {
    myCache = null;
  }

  @NotNull
  private Map<String, FileAttributes> getMap() {
    Map<String, FileAttributes> map = com.intellij.reference.SoftReference.dereference(myCache);
    if (map == null) {
      map = new THashMap<String, FileAttributes>(FileUtil.PATH_HASHING_STRATEGY);
      myCache = new SoftReference<Map<String, FileAttributes>>(map);
    }
    return map;
  }

  @NotNull
  String[] list(@NotNull String path) {
    FileInfo[] fileInfo = myKernel.listChildren(path);
    if (fileInfo == null || fileInfo.length == 0) {
      return ArrayUtil.EMPTY_STRING_ARRAY;
    }

    if (!path.endsWith("/")) path += "/";
    List<String> names = new ArrayList<String>(fileInfo.length);
    Map<String, FileAttributes> map = getMap();
    for (FileInfo info : fileInfo) {
      String name = info.getName();
      map.put(path + name, info.toFileAttributes());
      names.add(name);
    }

    return ArrayUtil.toStringArray(names);
  }

  @Nullable
  FileAttributes getAttributes(@NotNull VirtualFile file) {
    String path = file.getPath();
    Map<String, FileAttributes> map = getMap();
    FileAttributes attributes = map.get(path);
    if (attributes == null) {
      FileInfo info = myKernel.getInfo(path);
      if (info == null) {
        return null;
      }
      attributes = info.toFileAttributes();
      map.put(path, attributes);
    }
    return attributes;
  }
}
