/*
*
* Copyright 2003-2015 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 jetbrains.mps.vfs;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Utility to perform recursive refresh.
* Used to be part of ModulesMiner, but is not specific to it, hence was extracted.
* @author Artem Tikhomirov
*/
public final class FileRefresh implements Runnable {
private final static Logger LOG = LogManager.getLogger(FileRefresh.class);
@NotNull private final List<IFile> myFiles;
private final DefaultCachingContext myDefaultCachingContext = new DefaultCachingContext(true, false);
public FileRefresh(@NotNull IFile file) {
this(Collections.singletonList(file));
}
public FileRefresh(@NotNull List<IFile> list) {
myFiles = list;
}
@Override
public void run() {
LOG.info("Refreshing " + myFiles.size() + " file(s)");
refreshRecursivelyIntoJars(myFiles);
LOG.info("Refreshing is done");
}
// not allowing nulls
private void refreshRecursivelyIntoJars(List<IFile> files) {
List<CachingFile> cachingFiles = files.stream().
filter(file -> file != null && file instanceof CachingFile).
map(file -> (CachingFile) file).distinct().collect(Collectors.toList());
if (!cachingFiles.isEmpty()) {
CachingFile firstFile = cachingFiles.get(0);
CachingFileSystem fs = firstFile.getFileSystem();
while (!cachingFiles.isEmpty()) {
fs.refresh(myDefaultCachingContext, cachingFiles);
cachingFiles = cachingFiles.stream().flatMap(
file -> {
if (!file.isInArchive() && file.isDirectory()) {
List<IFile> children = file.getChildren();
return children != null ? children.stream().map(iFile -> (CachingFile) iFile) : Stream.empty();
} else if (IFileUtils.isJarFile(file)) {
return Stream.of(((CachingFile) IFileUtils.stepIntoJar(file)));
}
return Stream.empty();
}).distinct().collect(Collectors.toList());
}
}
}
}