/* * Copyright 2016 the original author or authors. * * 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 org.gradle.api.internal.changedetection.state; import org.gradle.api.internal.cache.StringInterner; import org.gradle.api.tasks.PathSensitivity; import org.gradle.internal.nativeintegration.filesystem.FileType; public enum TaskFilePropertySnapshotNormalizationStrategy implements SnapshotNormalizationStrategy { /** * Use the absolute path of the files. */ ABSOLUTE { @Override public boolean isPathAbsolute() { return true; } @Override public NormalizedFileSnapshot getNormalizedSnapshot(FileSnapshot fileSnapshot, StringInterner stringInterner) { return new NonNormalizedFileSnapshot(fileSnapshot.getPath(), fileSnapshot.getContent()); } }, /** * Use the location of the file related to a hierarchy. */ RELATIVE { @Override public boolean isPathAbsolute() { return false; } @Override public NormalizedFileSnapshot getNormalizedSnapshot(FileSnapshot fileSnapshot, StringInterner stringInterner) { // Ignore path of root directories, use base name of root files if (fileSnapshot.isRoot() && fileSnapshot.getType() == FileType.Directory) { return new IgnoredPathFileSnapshot(fileSnapshot.getContent()); } return getRelativeSnapshot(fileSnapshot, fileSnapshot.getContent(), stringInterner); } }, /** * Use the file name only. */ NAME_ONLY { @Override public boolean isPathAbsolute() { return false; } @Override public NormalizedFileSnapshot getNormalizedSnapshot(FileSnapshot fileSnapshot, StringInterner stringInterner) { // Ignore path of root directories if (fileSnapshot.isRoot() && fileSnapshot.getType() == FileType.Directory) { return new IgnoredPathFileSnapshot(fileSnapshot.getContent()); } return getRelativeSnapshot(fileSnapshot, fileSnapshot.getName(), fileSnapshot.getContent(), stringInterner); } }, /** * Ignore the file path completely. */ NONE { @Override public boolean isPathAbsolute() { return false; } @Override public NormalizedFileSnapshot getNormalizedSnapshot(FileSnapshot fileSnapshot, StringInterner stringInterner) { if (fileSnapshot.getType() == FileType.Directory) { return null; } return new IgnoredPathFileSnapshot(fileSnapshot.getContent()); } }; public static TaskFilePropertySnapshotNormalizationStrategy valueOf(PathSensitivity pathSensitivity) { switch (pathSensitivity) { case ABSOLUTE: return ABSOLUTE; case RELATIVE: return RELATIVE; case NAME_ONLY: return NAME_ONLY; case NONE: return NONE; default: throw new IllegalArgumentException("Unknown path usage: " + pathSensitivity); } } public static NormalizedFileSnapshot getRelativeSnapshot(FileSnapshot fileSnapshot, FileContentSnapshot snapshot, StringInterner stringInterner) { String[] segments = fileSnapshot.getRelativePath().getSegments(); StringBuilder builder = new StringBuilder(); for (int i = 0, len = segments.length; i < len; i++) { if (i != 0) { builder.append('/'); } builder.append(segments[i]); } return getRelativeSnapshot(fileSnapshot, builder.toString(), snapshot, stringInterner); } public static NormalizedFileSnapshot getRelativeSnapshot(FileSnapshot fileSnapshot, String normalizedPath, FileContentSnapshot snapshot, StringInterner stringInterner) { String absolutePath = fileSnapshot.getPath(); if (absolutePath.endsWith(normalizedPath)) { return new IndexedNormalizedFileSnapshot(absolutePath, absolutePath.length() - normalizedPath.length(), snapshot); } else { return new DefaultNormalizedFileSnapshot(stringInterner.intern(normalizedPath), snapshot); } } }