blob: ae2c1ae8a84db2dc0c41e5dfb7d16a1d0f73ad94 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.nifi.minifi.c2.cache.filesystem;
import org.apache.nifi.minifi.c2.api.ConfigurationProviderException;
import org.apache.nifi.minifi.c2.api.InvalidParameterException;
import org.apache.nifi.minifi.c2.api.cache.ConfigurationCacheFileInfo;
import org.apache.nifi.minifi.c2.api.cache.WriteableConfiguration;
import org.apache.nifi.minifi.c2.api.util.Pair;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.Objects;
import java.util.stream.Stream;
public class FileSystemCacheFileInfoImpl implements ConfigurationCacheFileInfo {
private final FileSystemConfigurationCache cache;
private final Path dirPath;
private final String expectedFilename;
private final int expectedFilenameLength;
public FileSystemCacheFileInfoImpl(FileSystemConfigurationCache cache, Path dirPath, String expectedFilename) {
this.cache = cache;
this.dirPath = dirPath;
this.expectedFilename = expectedFilename;
this.expectedFilenameLength = expectedFilename.length();
}
@Override
public Integer getVersionIfMatch(String filename) {
if (!filename.startsWith(expectedFilename) || filename.length() == expectedFilenameLength) {
return null;
}
try {
return Integer.parseInt(filename.substring(expectedFilenameLength));
} catch (NumberFormatException e) {
return null;
}
}
@Override
public Stream<WriteableConfiguration> getCachedConfigurations() throws IOException {
return Files.list(dirPath).map(p -> {
Integer version = getVersionIfMatch(p.getFileName().toString());
if (version == null) {
return null;
}
return new Pair<>(version, p);
}).filter(Objects::nonNull)
.sorted(Comparator.comparing(pair -> ((Pair<Integer, Path>) pair).getFirst())
.reversed()).map(pair -> new FileSystemWritableConfiguration(cache, pair.getSecond(), Integer.toString(pair.getFirst())));
}
@Override
public WriteableConfiguration getConfiguration(Integer version) throws ConfigurationProviderException {
if (version == null) {
try {
return getCachedConfigurations().findFirst().orElseThrow(() -> new ConfigurationProviderException("No configurations found for " + dirPath + "/" + expectedFilename + "[0-9]+"));
} catch (IOException e) {
throw new ConfigurationProviderException("Unable to get cached configurations.", e);
}
}
try {
return new FileSystemWritableConfiguration(cache, cache.resolveChildAndVerifyParent(dirPath, expectedFilename + version), Integer.toString(version));
} catch (NumberFormatException e) {
throw new InvalidParameterException("Expected numeric version.", e);
}
}
}