diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/Packaging.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/Packaging.java new file mode 100644 index 00000000..1a44e548 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/Packaging.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging; + +import java.util.Objects; + +import org.springframework.core.io.support.SpringFactoriesLoader; + +/** + * Application packaging, such as a jar file or a war file. + * + * @author Andy Wilkinson + */ +public interface Packaging { + + String id(); + + static Packaging forId(String id) { + return SpringFactoriesLoader + .loadFactories(PackagingFactory.class, Packaging.class.getClassLoader()) + .stream().map((factory) -> factory.createPackaging(id)) + .filter(Objects::nonNull).findFirst() + .orElseThrow(() -> new IllegalStateException( + "Unrecognized packaging id '" + id + "'")); + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/PackagingFactory.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/PackagingFactory.java new file mode 100644 index 00000000..7b040451 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/PackagingFactory.java @@ -0,0 +1,34 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging; + +/** + * A factory for creating a {@link Packaging}. + * + * @author Andy Wilkinson + */ +public interface PackagingFactory { + + /** + * Creates and returns a {@link Packaging} for the given id. If the factory does not + * recognise the given {@code id}, {@code null} should be returned. + * @param id the id of the packaging + * @return the packaging or {@code null} + */ + Packaging createPackaging(String id); + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackaging.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackaging.java new file mode 100644 index 00000000..59c98649 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackaging.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging.jar; + +import io.spring.initializr.generator.packaging.Packaging; + +/** + * Jar {@link Packaging}. + * + * @author Andy Wilkinson + */ +public final class JarPackaging implements Packaging { + + /** + * Jar {@link Packaging} identifier. + */ + public static final String ID = "jar"; + + @Override + public String id() { + return ID; + } + + @Override + public String toString() { + return id(); + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackagingFactory.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackagingFactory.java new file mode 100644 index 00000000..65ffc2fe --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/JarPackagingFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging.jar; + +import io.spring.initializr.generator.packaging.Packaging; +import io.spring.initializr.generator.packaging.PackagingFactory; + +/** + * {@link PackagingFactory Factory} for {@link JarPackaging}. + * + * @author Andy Wilkinson + */ +class JarPackagingFactory implements PackagingFactory { + + @Override + public Packaging createPackaging(String id) { + if (JarPackaging.ID.equals(id)) { + return new JarPackaging(); + } + return null; + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/package-info.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/package-info.java new file mode 100644 index 00000000..873b5fc5 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/jar/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 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. + */ + +/** + * Java archive packaging. + */ +package io.spring.initializr.generator.packaging.jar; diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/package-info.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/package-info.java new file mode 100644 index 00000000..49989b0d --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 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. + */ + +/** + * Packaging abstraction. + */ +package io.spring.initializr.generator.packaging; diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackaging.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackaging.java new file mode 100644 index 00000000..b4fc0098 --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackaging.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging.war; + +import io.spring.initializr.generator.packaging.Packaging; + +/** + * War {@link Packaging}. + * + * @author Andy Wilkinson + */ +public final class WarPackaging implements Packaging { + + /** + * War {@link Packaging} identifier. + */ + public static final String ID = "war"; + + @Override + public String id() { + return ID; + } + + @Override + public String toString() { + return id(); + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackagingFactory.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackagingFactory.java new file mode 100644 index 00000000..46163e6f --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/WarPackagingFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging.war; + +import io.spring.initializr.generator.packaging.Packaging; +import io.spring.initializr.generator.packaging.PackagingFactory; + +/** + * {@link PackagingFactory Factory} for {@link WarPackaging}. + * + * @author Andy Wilkinson + */ +class WarPackagingFactory implements PackagingFactory { + + @Override + public Packaging createPackaging(String id) { + if (WarPackaging.ID.equals(id)) { + return new WarPackaging(); + } + return null; + } + +} diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/package-info.java b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/package-info.java new file mode 100644 index 00000000..8567a5fe --- /dev/null +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/packaging/war/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 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. + */ + +/** + * Web Application archive packaging. + */ +package io.spring.initializr.generator.packaging.war; diff --git a/initializr-generator/src/main/resources/META-INF/spring.factories b/initializr-generator/src/main/resources/META-INF/spring.factories index c036fbdc..fe8d1129 100644 --- a/initializr-generator/src/main/resources/META-INF/spring.factories +++ b/initializr-generator/src/main/resources/META-INF/spring.factories @@ -6,3 +6,7 @@ io.spring.initializr.generator.language.LanguageFactory=\ io.spring.initializr.generator.language.groovy.GroovyLanguageFactory,\ io.spring.initializr.generator.language.java.JavaLanguageFactory,\ io.spring.initializr.generator.language.kotlin.KotlinLanguageFactory + +io.spring.initializr.generator.packaging.PackagingFactory=\ +io.spring.initializr.generator.packaging.jar.JarPackagingFactory,\ +io.spring.initializr.generator.packaging.war.WarPackagingFactory diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/packaging/PackagingTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/packaging/PackagingTests.java new file mode 100644 index 00000000..c1d51f40 --- /dev/null +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/packaging/PackagingTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2019 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 io.spring.initializr.generator.packaging; + +import io.spring.initializr.generator.packaging.jar.JarPackaging; +import io.spring.initializr.generator.packaging.war.WarPackaging; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +/** + * Tests for {@link Packaging}. + * + * @author Stephane Nicoll + */ +class PackagingTests { + + @Test + void jarPackaging() { + Packaging jar = Packaging.forId("jar"); + assertThat(jar).isInstanceOf(JarPackaging.class); + assertThat(jar.id()).isEqualTo("jar"); + assertThat(jar.toString()).isEqualTo("jar"); + } + + @Test + void warPackaging() { + Packaging war = Packaging.forId("war"); + assertThat(war).isInstanceOf(WarPackaging.class); + assertThat(war.id()).isEqualTo("war"); + assertThat(war.toString()).isEqualTo("war"); + } + + @Test + void unknownPackaging() { + assertThatIllegalStateException().isThrownBy(() -> Packaging.forId("unknown")) + .withMessageContaining("Unrecognized packaging id 'unknown'"); + } + +}