5 changed files with 263 additions and 11 deletions
@ -0,0 +1,147 @@
@@ -0,0 +1,147 @@
|
||||
/* |
||||
* Copyright 2019-2023 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 |
||||
* |
||||
* https://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.springframework.gradle.xsd; |
||||
|
||||
import org.gradle.api.DefaultTask; |
||||
import org.gradle.api.file.ConfigurableFileCollection; |
||||
import org.gradle.api.file.RegularFileProperty; |
||||
import org.gradle.api.tasks.*; |
||||
import org.gradle.work.DisableCachingByDefault; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Path; |
||||
import java.nio.file.StandardCopyOption; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
/** |
||||
* Creates the spring-security.xsd automatically |
||||
* |
||||
* @author Rob Winch |
||||
*/ |
||||
@DisableCachingByDefault(because = "not worth it") |
||||
public abstract class CreateVersionlessXsdTask extends DefaultTask { |
||||
|
||||
@InputFiles |
||||
public abstract ConfigurableFileCollection getInputFiles(); |
||||
|
||||
@OutputFile |
||||
abstract RegularFileProperty getVersionlessXsdFile(); |
||||
|
||||
@TaskAction |
||||
void createVersionlessXsd() throws IOException { |
||||
XsdFileMajorMinorVersion largest = null; |
||||
ConfigurableFileCollection inputFiles = getInputFiles(); |
||||
if (inputFiles.isEmpty()) { |
||||
throw new IllegalStateException("No Inputs configured"); |
||||
} |
||||
for (File file : inputFiles) { |
||||
XsdFileMajorMinorVersion current = XsdFileMajorMinorVersion.create(file); |
||||
if (current == null) { |
||||
continue; |
||||
} |
||||
if (largest == null) { |
||||
largest = current; |
||||
} |
||||
else if (current.getVersion().isGreaterThan(largest.getVersion())) { |
||||
largest = current; |
||||
} |
||||
} |
||||
if (largest == null) { |
||||
throw new IllegalStateException("Could not create versionless xsd file because no files matching spring-security-<digit>.xsd were found in " + inputFiles.getFiles()); |
||||
} |
||||
Path to = getVersionlessXsdFile().getAsFile().get().toPath(); |
||||
Path from = largest.getFile().toPath(); |
||||
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); |
||||
} |
||||
|
||||
static class XsdFileMajorMinorVersion { |
||||
private final File file; |
||||
|
||||
private final MajorMinorVersion version; |
||||
|
||||
private XsdFileMajorMinorVersion(File file, MajorMinorVersion version) { |
||||
this.file = file; |
||||
this.version = version; |
||||
} |
||||
|
||||
private static final Pattern FILE_MAJOR_MINOR_VERSION_PATTERN = Pattern.compile("^spring-security-(\\d+)\\.(\\d+)\\.xsd$"); |
||||
|
||||
/** |
||||
* If matches xsd with major minor version (e.g. spring-security-5.1.xsd returns it, otherwise null |
||||
* @param file |
||||
* @return |
||||
*/ |
||||
static XsdFileMajorMinorVersion create(File file) { |
||||
String fileName = file.getName(); |
||||
Matcher matcher = FILE_MAJOR_MINOR_VERSION_PATTERN.matcher(fileName); |
||||
if (!matcher.find()) { |
||||
return null; |
||||
} |
||||
int major = Integer.parseInt(matcher.group(1)); |
||||
int minor = Integer.parseInt(matcher.group(2)); |
||||
MajorMinorVersion version = new MajorMinorVersion(major, minor); |
||||
return new XsdFileMajorMinorVersion(file, version); |
||||
} |
||||
|
||||
public File getFile() { |
||||
return file; |
||||
} |
||||
|
||||
public MajorMinorVersion getVersion() { |
||||
return version; |
||||
} |
||||
} |
||||
|
||||
static class MajorMinorVersion { |
||||
private final int major; |
||||
|
||||
private final int minor; |
||||
|
||||
MajorMinorVersion(int major, int minor) { |
||||
this.major = major; |
||||
this.minor = minor; |
||||
} |
||||
|
||||
public int getMajor() { |
||||
return major; |
||||
} |
||||
|
||||
public int getMinor() { |
||||
return minor; |
||||
} |
||||
|
||||
public boolean isGreaterThan(MajorMinorVersion version) { |
||||
if (getMajor() > version.getMajor()) { |
||||
return true; |
||||
} |
||||
if (getMajor() < version.getMajor()) { |
||||
return false; |
||||
} |
||||
if (getMinor() > version.getMinor()) { |
||||
return true; |
||||
} |
||||
if (getMinor() < version.getMinor()) { |
||||
return false; |
||||
} |
||||
// they are equal
|
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,94 @@
@@ -0,0 +1,94 @@
|
||||
/* |
||||
* Copyright 2019-2023 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 |
||||
* |
||||
* https://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.springframework.gradle.xsd; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
import org.springframework.gradle.xsd.CreateVersionlessXsdTask.MajorMinorVersion; |
||||
import org.springframework.gradle.xsd.CreateVersionlessXsdTask.XsdFileMajorMinorVersion; |
||||
|
||||
import java.io.File; |
||||
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat; |
||||
|
||||
/** |
||||
* @author Rob Winch |
||||
*/ |
||||
class CreateVersionlessXsdTaskTests { |
||||
|
||||
@Test |
||||
void xsdCreateWhenValid() { |
||||
File file = new File("spring-security-2.0.xsd"); |
||||
XsdFileMajorMinorVersion xsdFile = XsdFileMajorMinorVersion.create(file); |
||||
assertThat(xsdFile).isNotNull(); |
||||
assertThat(xsdFile.getFile()).isEqualTo(file); |
||||
assertThat(xsdFile.getVersion().getMajor()).isEqualTo(2); |
||||
assertThat(xsdFile.getVersion().getMinor()).isEqualTo(0); |
||||
} |
||||
|
||||
@Test |
||||
void xsdCreateWhenPatchReleaseThenNull() { |
||||
File file = new File("spring-security-2.0.1.xsd"); |
||||
XsdFileMajorMinorVersion xsdFile = XsdFileMajorMinorVersion.create(file); |
||||
assertThat(xsdFile).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
void xsdCreateWhenNotXsdFileThenNull() { |
||||
File file = new File("spring-security-2.0.txt"); |
||||
XsdFileMajorMinorVersion xsdFile = XsdFileMajorMinorVersion.create(file); |
||||
assertThat(xsdFile).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
void xsdCreateWhenNotStartWithSpringSecurityThenNull() { |
||||
File file = new File("spring-securityNO-2.0.xsd"); |
||||
XsdFileMajorMinorVersion xsdFile = XsdFileMajorMinorVersion.create(file); |
||||
assertThat(xsdFile).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
void isGreaterWhenMajorLarger() { |
||||
MajorMinorVersion larger = new MajorMinorVersion(2,0); |
||||
MajorMinorVersion smaller = new MajorMinorVersion(1,0); |
||||
assertThat(larger.isGreaterThan(smaller)).isTrue(); |
||||
assertThat(smaller.isGreaterThan(larger)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
void isGreaterWhenMinorLarger() { |
||||
MajorMinorVersion larger = new MajorMinorVersion(1,1); |
||||
MajorMinorVersion smaller = new MajorMinorVersion(1,0); |
||||
assertThat(larger.isGreaterThan(smaller)).isTrue(); |
||||
assertThat(smaller.isGreaterThan(larger)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
void isGreaterWhenMajorAndMinorLarger() { |
||||
MajorMinorVersion larger = new MajorMinorVersion(2,1); |
||||
MajorMinorVersion smaller = new MajorMinorVersion(1,0); |
||||
assertThat(larger.isGreaterThan(smaller)).isTrue(); |
||||
assertThat(smaller.isGreaterThan(larger)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
void isGreaterWhenSame() { |
||||
MajorMinorVersion first = new MajorMinorVersion(1,0); |
||||
MajorMinorVersion second = new MajorMinorVersion(1,0); |
||||
assertThat(first.isGreaterThan(second)).isFalse(); |
||||
assertThat(second.isGreaterThan(first)).isFalse(); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue