// Path: src/main/java/com/github/vbauer/jconditions/core/CheckerContext.java
// public class CheckerContext<T> {
// 
//     private final Object instance;
//     private final T annotation;
// 
// 
//     public CheckerContext(final Object instance, final T annotation) {
//         this.instance = instance;
//         this.annotation = annotation;
//     }
// 
// 
//     public Object getInstance() {
//         return instance;
//     }
// 
//     public T getAnnotation() {
//         return annotation;
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/core/ConditionChecker.java
// public interface ConditionChecker<T> {
// 
//     /**
//      * Checks if execution of test method should be continued or not.
//      *
//      * @param context input data for checker
//      * @return true if execution should be continued and false - otherwise
//      * @throws Exception on any error (it is the same as false in return value)
//      */
//     boolean isSatisfied(CheckerContext<T> context) throws Exception;
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/util/FSUtils.java
// public final class FSUtils {
// 
//     private FSUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static boolean exists(final String path) {
//         final File file = new File(path);
//         return file.exists();
//     }
// 
//     public static boolean fileExists(final String path) {
//         final File file = new File(path);
//         return file.exists() && file.isFile();
//     }
// 
//     public static boolean directoryExists(final String path) {
//         final File file = new File(path);
//         return file.exists() && file.isDirectory();
//     }
// 
//     public static boolean isSymlink(final String path) throws IOException {
//         final File file = new File(path);
//         final File fileInCanonicalDir;
// 
//         if (file.getParent() == null) {
//             fileInCanonicalDir = file;
//         } else {
//             fileInCanonicalDir = new File(file.getParentFile().getCanonicalFile(), file.getName());
//         }
// 
//         final File canonicalFile = fileInCanonicalDir.getCanonicalFile();
//         final File absoluteFile = fileInCanonicalDir.getAbsoluteFile();
//         return !canonicalFile.equals(absoluteFile);
//     }
// 
//     public static boolean deleteFile(final String path) {
//         final File file = new File(path);
//         return file.delete();
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/util/PropUtils.java
// public final class PropUtils {
// 
//     private static final String VAR_PREFIX = "${";
//     private static final String VAR_POSTFIX = "}";
// 
// 
//     private PropUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static String getSystemProperty(final String key) {
//         final Map<String, String> properties = getSystemProperties();
//         return properties.get(key);
//     }
// 
//     public static Map<String, String> getSystemProperties() {
//         final Map<String, String> result = new HashMap<>();
//         result.putAll(System.getenv());
//         result.putAll(convertPropertiesToMap(System.getProperties()));
//         return result;
//     }
// 
//     public static Map<String, String> convertPropertiesToMap(final Properties properties) {
//         final Map<String, String> result = new HashMap<>();
//         for (final String name : properties.stringPropertyNames()) {
//             result.put(name, properties.getProperty(name));
//         }
//         return result;
//     }
// 
//     public static String injectProperties(final String text) {
//         if (text != null && text.contains(VAR_PREFIX)) {
//             String result = text;
//             final Map<String, String> systemProperties = getSystemProperties();
//             for (final Map.Entry<String, String> entry : systemProperties.entrySet()) {
//                 final String key = entry.getKey();
//                 final String value = entry.getValue();
//                 result = result.replace(VAR_PREFIX + key + VAR_POSTFIX, value);
//             }
//             return result;
//         }
//         return text;
//     }
// 
//     public static boolean hasAnyWithProperties(final String value, final String... variants) {
//         for (final String operationSystem : variants) {
//             final String injected = injectProperties(operationSystem);
//             if (TextUtils.containsIgnoreCase(value, injected)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
// }


import com.github.vbauer.jconditions.annotation.ExistsOnFS;
import com.github.vbauer.jconditions.core.CheckerContext;
import com.github.vbauer.jconditions.core.ConditionChecker;
import com.github.vbauer.jconditions.util.FSUtils;
import com.github.vbauer.jconditions.util.PropUtils;


    private boolean isSatisfied(
        final String[] filePaths, final ExistsOnFS.Type... types
    ) throws Exception {
        for (final String filePath : filePaths) {
            if (isSatisfied(filePath, types)) {
                return false;
            }
        }
        return filePaths.length > 0;
    }

    private boolean isSatisfied(
        final String filePath, final ExistsOnFS.Type... types
    ) throws Exception {
        for (final ExistsOnFS.Type type : types) {
            if (!existsOnFS(filePath, type)) {
                return true;
            }
        }
        return false;
    }

    private boolean existsOnFS(
        final String filePath, final ExistsOnFS.Type type
    ) throws Exception {
        final String path = PropUtils.injectProperties(filePath);
        switch (type) {
            case FILE:
// Path: src/main/java/com/github/vbauer/jconditions/core/CheckerContext.java
// public class CheckerContext<T> {
// 
//     private final Object instance;
//     private final T annotation;
// 
// 
//     public CheckerContext(final Object instance, final T annotation) {
//         this.instance = instance;
//         this.annotation = annotation;
//     }
// 
// 
//     public Object getInstance() {
//         return instance;
//     }
// 
//     public T getAnnotation() {
//         return annotation;
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/core/ConditionChecker.java
// public interface ConditionChecker<T> {
// 
//     /**
//      * Checks if execution of test method should be continued or not.
//      *
//      * @param context input data for checker
//      * @return true if execution should be continued and false - otherwise
//      * @throws Exception on any error (it is the same as false in return value)
//      */
//     boolean isSatisfied(CheckerContext<T> context) throws Exception;
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/util/FSUtils.java
// public final class FSUtils {
// 
//     private FSUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static boolean exists(final String path) {
//         final File file = new File(path);
//         return file.exists();
//     }
// 
//     public static boolean fileExists(final String path) {
//         final File file = new File(path);
//         return file.exists() && file.isFile();
//     }
// 
//     public static boolean directoryExists(final String path) {
//         final File file = new File(path);
//         return file.exists() && file.isDirectory();
//     }
// 
//     public static boolean isSymlink(final String path) throws IOException {
//         final File file = new File(path);
//         final File fileInCanonicalDir;
// 
//         if (file.getParent() == null) {
//             fileInCanonicalDir = file;
//         } else {
//             fileInCanonicalDir = new File(file.getParentFile().getCanonicalFile(), file.getName());
//         }
// 
//         final File canonicalFile = fileInCanonicalDir.getCanonicalFile();
//         final File absoluteFile = fileInCanonicalDir.getAbsoluteFile();
//         return !canonicalFile.equals(absoluteFile);
//     }
// 
//     public static boolean deleteFile(final String path) {
//         final File file = new File(path);
//         return file.delete();
//     }
// 
// }
// 
// Path: src/main/java/com/github/vbauer/jconditions/util/PropUtils.java
// public final class PropUtils {
// 
//     private static final String VAR_PREFIX = "${";
//     private static final String VAR_POSTFIX = "}";
// 
// 
//     private PropUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static String getSystemProperty(final String key) {
//         final Map<String, String> properties = getSystemProperties();
//         return properties.get(key);
//     }
// 
//     public static Map<String, String> getSystemProperties() {
//         final Map<String, String> result = new HashMap<>();
//         result.putAll(System.getenv());
//         result.putAll(convertPropertiesToMap(System.getProperties()));
//         return result;
//     }
// 
//     public static Map<String, String> convertPropertiesToMap(final Properties properties) {
//         final Map<String, String> result = new HashMap<>();
//         for (final String name : properties.stringPropertyNames()) {
//             result.put(name, properties.getProperty(name));
//         }
//         return result;
//     }
// 
//     public static String injectProperties(final String text) {
//         if (text != null && text.contains(VAR_PREFIX)) {
//             String result = text;
//             final Map<String, String> systemProperties = getSystemProperties();
//             for (final Map.Entry<String, String> entry : systemProperties.entrySet()) {
//                 final String key = entry.getKey();
//                 final String value = entry.getValue();
//                 result = result.replace(VAR_PREFIX + key + VAR_POSTFIX, value);
//             }
//             return result;
//         }
//         return text;
//     }
// 
//     public static boolean hasAnyWithProperties(final String value, final String... variants) {
//         for (final String operationSystem : variants) {
//             final String injected = injectProperties(operationSystem);
//             if (TextUtils.containsIgnoreCase(value, injected)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
// }


// Path: src/main/java/com/github/vbauer/jconditions/checker/ExistsOnFSChecker.java
import com.github.vbauer.jconditions.annotation.ExistsOnFS;
import com.github.vbauer.jconditions.core.CheckerContext;
import com.github.vbauer.jconditions.core.ConditionChecker;
import com.github.vbauer.jconditions.util.FSUtils;
import com.github.vbauer.jconditions.util.PropUtils;



    private boolean isSatisfied(
        final String[] filePaths, final ExistsOnFS.Type... types
    ) throws Exception {
        for (final String filePath : filePaths) {
            if (isSatisfied(filePath, types)) {
                return false;
            }
        }
        return filePaths.length > 0;
    }

    private boolean isSatisfied(
        final String filePath, final ExistsOnFS.Type... types
    ) throws Exception {
        for (final ExistsOnFS.Type type : types) {
            if (!existsOnFS(filePath, type)) {
                return true;
            }
        }
        return false;
    }

    private boolean existsOnFS(
        final String filePath, final ExistsOnFS.Type type
    ) throws Exception {
        final String path = PropUtils.injectProperties(filePath);
        switch (type) {
            case FILE:
                return FSUtils.fileExists(path);