diff --git a/spring-cloud-function-deployer-old/.jdk8 b/spring-cloud-function-deployer-old/.jdk8 deleted file mode 100644 index e69de29bb..000000000 diff --git a/spring-cloud-function-deployer-old/README.md b/spring-cloud-function-deployer-old/README.md deleted file mode 100644 index a2e4b0201..000000000 --- a/spring-cloud-function-deployer-old/README.md +++ /dev/null @@ -1,21 +0,0 @@ -Spring Cloud Function Deployer is an library for building apps that can deploy functions packaged as jars. It can deploy a basic Spring Cloud Function app from a jar with locally cached dependencies in about 500ms (compared to 1500ms for the same application launched from cold). It can be used in a pool as a "warm" JVM to deploy functions quicker than they could be started from scratch. Example usage: - -```java -@SpringBootApplication -@EnableFunctionDeployer -public class FunctionApplication { - - public static void main(String[] args) throws IOException { - new ApplicationBootstrap().run(FunctionApplication.class, args); - } - -} -``` - -There is a main class in the jar that alread looks like this. You can use it like that or you can create your own copy if you want to customize it. The `ApplicationBootstrap` is a utility that replaces `SpringApplication`, creating a class loader hierarchy that works with the function configuration. It needs to be launched with configuration for the `FunctionProperties`: - -| Option | Description | -|--------|----------------------| -| `function.location` | Mandatory archive location(s) for building the classpath of the function. | -| `function.bean` | Mandatory bean class or name (if `function.main` is provided) to create the function. If multi-valued, the function is composed (outputs piped to inputs) | -| `function.main` | The main `@SpringBootApplication` to launch (optional). | diff --git a/spring-cloud-function-deployer-old/pom.xml b/spring-cloud-function-deployer-old/pom.xml deleted file mode 100644 index 692c5bb01..000000000 --- a/spring-cloud-function-deployer-old/pom.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - 4.0.0 - - spring-cloud-function-deployer-old - jar - spring-cloud-function-deployer - Spring Cloud Function Web Support - - - org.springframework.cloud - spring-cloud-function-parent - 3.0.0.BUILD-SNAPSHOT - - - - 1.0.10.RELEASE - 2.0.2.BUILD-SNAPSHOT - - - - - org.springframework.cloud - spring-cloud-function-context - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-loader - - - org.springframework.cloud - spring-cloud-deployer-resource-maven - ${spring.cloud.deployer.version} - - - org.springframework.cloud - spring-cloud-deployer-resource-support - ${spring.cloud.deployer.version} - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-logging - test - - - - javax.annotation - javax.annotation-api - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.springframework.boot.experimental - spring-boot-thin-layout - ${wrapper.version} - - - - - org.apache.maven.plugins - maven-invoker-plugin - 3.0.1 - - ${project.build.directory}/local-repo - - - - - prepare-test - test-compile - - run - - - ${project.build.directory}/it - - src/it/settings.xml - true - true - - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.apache.maven.plugins - - - maven-invoker-plugin - - - [1.10,) - - - run - - - - - - - - - - - - - - - - - invoke - - - target/it/flux/pom.xml - - - - false - - - - - diff --git a/spring-cloud-function-deployer-old/src/it/flux/pom.xml b/spring-cloud-function-deployer-old/src/it/flux/pom.xml deleted file mode 100644 index 3dd76d36b..000000000 --- a/spring-cloud-function-deployer-old/src/it/flux/pom.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - 4.0.0 - - com.example - flux-sample - 1.0.0.RC1 - jar - - - org.springframework.boot - spring-boot-starter-parent - 2.2.0.M5 - - - - - 1.8 - 3.0.0.BUILD-SNAPSHOT - 1.0.17.RELEASE - - - - - org.springframework.cloud - spring-cloud-function-context - ${spring-cloud-function.version} - - - org.springframework.boot - spring-boot-starter - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - exec - - - - maven-deploy-plugin - - true - - - - org.apache.maven.plugins - maven-dependency-plugin - - - unpack - package - - unpack - - - - - ${project.groupId} - ${project.artifactId} - ${project.version} - exec - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-cloud-function-deployer-old/src/it/flux/src/main/java/com/example/functions/FunctionApp.java b/spring-cloud-function-deployer-old/src/it/flux/src/main/java/com/example/functions/FunctionApp.java deleted file mode 100644 index 62e59bdd9..000000000 --- a/spring-cloud-function-deployer-old/src/it/flux/src/main/java/com/example/functions/FunctionApp.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 - * - * 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 com.example.functions; - -import java.util.function.Function; - -import reactor.core.publisher.Flux; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -/** - * @author Dave Syer - */ -@SpringBootApplication -public class FunctionApp { - - public static void main(String[] args) throws Exception { - SpringApplication.run(FunctionApp.class, args); - } - - @Bean - public Function, Flux> foos() { - return flux -> flux.map(value -> new Foo(value.getValue().toUpperCase())); - } - -} - -class Foo { - - private String value; - - public Foo() { - } - - public Foo(String value) { - this.value = value; - } - - public String getValue() { - return this.value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "Foo [value=" + this.value + "]"; - } - -} diff --git a/spring-cloud-function-deployer-old/src/it/settings.xml b/spring-cloud-function-deployer-old/src/it/settings.xml deleted file mode 100644 index e1e0ace34..000000000 --- a/spring-cloud-function-deployer-old/src/it/settings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - it-repo - - true - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - diff --git a/spring-cloud-function-deployer-old/src/it/support/pom.xml b/spring-cloud-function-deployer-old/src/it/support/pom.xml deleted file mode 100644 index 51eeea328..000000000 --- a/spring-cloud-function-deployer-old/src/it/support/pom.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - 4.0.0 - - com.example - function-sample - 1.0.0.M1 - jar - - - org.springframework.boot - spring-boot-starter-parent - 2.2.0.M5 - - - - - 1.8 - 3.0.0.BUILD-SNAPSHOT - 1.0.17.RELEASE - - - - - org.springframework.cloud - spring-cloud-function-context - ${spring-cloud-function.version} - - - org.springframework.boot - spring-boot-starter - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - exec - - - - org.apache.maven.plugins - maven-dependency-plugin - - - unpack - package - - unpack - - - - - ${project.groupId} - ${project.artifactId} - ${project.version} - exec - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/DoubleLogger.java b/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/DoubleLogger.java deleted file mode 100644 index f376cc306..000000000 --- a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/DoubleLogger.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - * - * 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 com.example.functions; - -import java.util.function.Consumer; - -public class DoubleLogger implements Consumer { - - @Override - public void accept(Integer i) { - System.out.println(2 * i); - } - -} diff --git a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/Emitter.java b/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/Emitter.java deleted file mode 100644 index 28f070981..000000000 --- a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/Emitter.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 - * - * 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 com.example.functions; - -import java.util.function.Supplier; - -/** - * @author Eric Bottard - */ -public class Emitter implements Supplier { - - private int i = 0; - - private String[] values = {"one", "two", "three", "four"}; - - @Override - public String get() { - return values[i++ % values.length]; - } - -} diff --git a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/FunctionApp.java b/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/FunctionApp.java deleted file mode 100644 index 2b618826c..000000000 --- a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/FunctionApp.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 - * - * 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 com.example.functions; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -/** - * @author Dave Syer - */ -@SpringBootApplication -public class FunctionApp { - - public static void main(String[] args) throws Exception { - SpringApplication.run(FunctionApp.class, args); - } - - @Bean - public DoubleLogger myDoubler() { - return new DoubleLogger(); - } - - @Bean - public Emitter myEmitter() { - return new Emitter(); - } - - @Bean - public LengthCounter myCounter() { - return new LengthCounter(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/LengthCounter.java b/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/LengthCounter.java deleted file mode 100644 index f3e325324..000000000 --- a/spring-cloud-function-deployer-old/src/it/support/src/main/java/com/example/functions/LengthCounter.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 - * - * 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 com.example.functions; - -import java.util.function.Function; - -/** - * @author Eric Bottard - */ -public class LengthCounter implements Function { - - @Override - public Integer apply(String string) { - return string.length(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationBootstrap.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationBootstrap.java deleted file mode 100644 index f3cdeb0e2..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationBootstrap.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.jar.JarFile; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.SpringApplication; -import org.springframework.util.StringUtils; - -/** - * Utility class to launch a Spring Boot application (optionally) in an isolated class - * loader. The class loader is created in such a way that it is mostly a copy of the - * current class loader (i.e. the one that loaded this class), but has a parent containing - * reactor-core (if present). It can then share the reactor dependency with other class - * loaders that the app itself creates, without any other classes being shared, other than - * the core JDK. - * - * @author Mark Fisher - * @author Dave Syer - */ -public class ApplicationBootstrap { - - private static Log logger = LogFactory.getLog(ApplicationBootstrap.class); - - private ApplicationRunner runner; - - private URLClassLoader classLoader; - - private static boolean isolated(String[] args) { - for (String arg : args) { - if (arg.equals("--function.runner.isolated=false")) { - return false; - } - } - return true; - } - - /** - * Run the provided main class as a Spring Boot application with the provided command - * line arguments. - * @param mainClass the main class - * @param args the command line arguments - */ - public void run(Class mainClass, String... args) { - if (ApplicationBootstrap.isolated(args)) { - runner(mainClass).run(args); - } - else { - SpringApplication.run(mainClass, args); - } - } - - /** - * Clean up the resources used by this instance, if any. Called automatically on a - * runtime shutdown hook. - */ - public void close() { - if (this.runner != null) { - this.runner.close(); - this.runner = null; - } - if (this.classLoader != null) { - try { - this.classLoader.close(); - } - catch (IOException e) { - throw new IllegalStateException("Cannot close ClassLoader", e); - } - finally { - this.classLoader = null; - } - } - } - - public ApplicationRunner getRunner() { - return this.runner; - } - - private ApplicationRunner runner(Class mainClass) { - if (this.runner == null) { - synchronized (this) { - if (this.runner == null) { - this.classLoader = createClassLoader(mainClass); - this.runner = new ApplicationRunner(this.classLoader, - mainClass.getName()); - Runtime.getRuntime().addShutdownHook(new Thread(this::close)); - } - } - } - return this.runner; - } - - private URLClassLoader createClassLoader(Class mainClass) { - URL[] urls = findClassPath(mainClass); - if (urls.length == 1) { - URL[] classpath = extractClasspath(urls[0]); - if (classpath != null) { - urls = classpath; - } - } - List child = new ArrayList<>(); - List parent = new ArrayList<>(); - for (URL url : urls) { - child.add(url); - } - for (URL url : urls) { - if (isRoot(StringUtils.getFilename(clean(url.toString())))) { - parent.add(url); - child.remove(url); - } - } - logger.debug("Parent: " + parent); - logger.debug("Child: " + child); - ClassLoader base = getClass().getClassLoader(); - if (!parent.isEmpty()) { - base = new URLClassLoader(parent.toArray(new URL[0]), base.getParent()); - } - return new URLClassLoader(child.toArray(new URL[0]), base); - } - - private URL[] findClassPath(Class mainClass) { - ClassLoader base = mainClass.getClassLoader(); - if (!(base instanceof URLClassLoader)) { - try { - // Guess the classpath, based on where we can resolve existing resources - List list = Collections - .list(mainClass.getClassLoader().getResources("META-INF")); - List result = new ArrayList<>(); - result.add(mainClass.getProtectionDomain().getCodeSource().getLocation()); - for (URL url : list) { - String path = url.toString(); - path = path.substring(0, path.length() - "/META-INF".length()) + "/"; - result.add(new URL(path)); - } - return result.toArray(new URL[result.size()]); - } - catch (IOException e) { - throw new IllegalStateException("Cannot find class path", e); - } - } - else { - @SuppressWarnings("resource") - URLClassLoader urlClassLoader = (URLClassLoader) base; - return urlClassLoader.getURLs(); - } - } - - private boolean isRoot(String file) { - return file.startsWith("reactor-core") || file.startsWith("reactive-streams"); - } - - private String clean(String jar) { - // This works with fat jars like Spring Boot where the path elements look like - // jar:file:...something.jar!/. - return jar.endsWith("!/") ? jar.substring(0, jar.length() - 2) : jar; - } - - private URL[] extractClasspath(URL url) { - // This works for a jar indirection like in surefire and IntelliJ - if (url.toString().endsWith(".jar")) { - JarFile jar; - try { - jar = new JarFile(new File(url.toURI())); - String path = jar.getManifest().getMainAttributes() - .getValue("Class-Path"); - if (path != null) { - List result = new ArrayList<>(); - for (String element : path.split(" ")) { - result.add(new URL(element)); - } - return result.toArray(new URL[0]); - } - } - catch (Exception e) { - } - } - return null; - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java deleted file mode 100644 index f3efeaff9..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import javax.annotation.PreDestroy; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.context.support.LiveBeansView; -import org.springframework.expression.Expression; -import org.springframework.expression.spel.SpelParserConfiguration; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.expression.spel.support.StandardTypeLocator; -import org.springframework.util.ClassUtils; - -/** - * Driver class for running a Spring Boot application via an isolated classpath. - * Initialize an instance of this class with the class loader to be used and the name of - * the main class (usually a @SpringBootApplication), and then - * {@link #run(String...)} it, cleaning up with a call to {@link #close()}. - * - * @author Dave Syer - * @author Oleg Zhurakousky - */ -public class ApplicationRunner { - - private static Log logger = LogFactory.getLog(ApplicationRunner.class); - - private final ClassLoader classLoader; - - private final String source; - - private final SpelParserConfiguration config; - - private final StandardTypeLocator typeLocator; - - private StandardEvaluationContext app; - - public ApplicationRunner(ClassLoader classLoader, String source) { - this.classLoader = classLoader; - this.source = source; - this.config = new SpelParserConfiguration(null, this.classLoader); - this.typeLocator = new StandardTypeLocator(this.classLoader); - } - - public void run(String... args) { - ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); - try { - ClassUtils.overrideThreadContextClassLoader(this.classLoader); - Class cls = this.classLoader.loadClass(ContextRunner.class.getName()); - this.app = new StandardEvaluationContext( - cls.getDeclaredConstructor().newInstance()); - this.app.setTypeLocator(new StandardTypeLocator(this.classLoader)); - runContext(this.source, defaultProperties(UUID.randomUUID().toString()), - args); - } - catch (Exception e) { - logger.error("Cannot deploy", e); - } - finally { - ClassUtils.overrideThreadContextClassLoader(contextLoader); - } - RuntimeException e = getError(); - if (e != null) { - throw e; - } - } - - private Map defaultProperties(String id) { - Map map = new HashMap<>(); - map.put(LiveBeansView.MBEAN_DOMAIN_PROPERTY_NAME, "function-deployer-" + id); - map.put("spring.jmx.default-domain", "function-deployer-" + id); - map.put("spring.jmx.enabled", "false"); - return map; - } - - public Object getBean(String name) { - if (this.app != null) { - if (containsBeanByName(name)) { - return getBeanByName(name); - } - try { - return getBeanByType(name); - } - catch (Exception e) { - // not there - } - } - return null; - } - - private boolean containsBeanByName(String name) { - Expression parsed = new SpelExpressionParser() - .parseExpression("context.containsBean(\"" + name + "\")"); - return parsed.getValue(this.app, Boolean.class); - } - - private Object getBeanByName(String name) { - Expression parsed = new SpelExpressionParser() - .parseExpression("context.getBean(\"" + name + "\")"); - return parsed.getValue(this.app); - } - - private Object getBeanByType(String name) { - Expression parsed = new SpelExpressionParser() - .parseExpression("context.getBean(T(" + name + "))"); - return parsed.getValue(this.app); - } - - public boolean containsBean(String name) { - if (this.app != null) { - if (containsBeanByName(name)) { - return true; - } - Expression parsed = new SpelExpressionParser() - .parseExpression("context.getBeansOfType(T(" + name + "))"); - try { - @SuppressWarnings("unchecked") - Map beans = (Map) parsed - .getValue(this.app); - return !beans.isEmpty(); - } - catch (Exception e) { - } - } - return false; - } - - /** - * List the bean names in the application context for a given type (by its fully - * qualified name). - * @param type the name of the type (Class) - * @return the bean names of that type - */ - public Set getBeanNames(String type) { - if (this.app != null) { - Expression parsed = new SpelExpressionParser() - .parseExpression("context.getBeansOfType(T(" + type + "))"); - try { - @SuppressWarnings("unchecked") - Map beans = (Map) parsed - .getValue(this.app); - return beans.keySet(); - } - catch (Exception e) { - } - } - return Collections.emptySet(); - } - - public Object evaluate(String expression, Object root, Object... attrs) { - Expression parsed = new SpelExpressionParser(this.config) - .parseExpression(expression); - StandardEvaluationContext context = new StandardEvaluationContext(root); - context.setTypeLocator(this.typeLocator); - if (attrs.length % 2 != 0) { - throw new IllegalArgumentException( - "Context attributes must be name, value pairs"); - } - for (int i = 0; i < attrs.length / 2; i++) { - String name = (String) attrs[2 * i]; - Object value = attrs[2 * i + 1]; - context.setVariable(name, value); - } - return parsed.getValue(context); - } - - public boolean isRunning() { - if (this.app == null) { - return false; - } - Expression parsed = new SpelExpressionParser() - .parseExpression("context.isRunning()"); - return parsed.getValue(this.app, Boolean.class); - } - - @PreDestroy - public void close() { - closeContext(); - } - - private RuntimeException getError() { - if (this.app == null) { - return null; - } - Expression parsed = new SpelExpressionParser().parseExpression("error"); - Throwable e = parsed.getValue(this.app, Throwable.class); - if (e == null) { - return null; - } - if (e instanceof RuntimeException) { - return (RuntimeException) e; - } - return new IllegalStateException("Cannot launch", e); - } - - private void runContext(String mainClass, Map properties, - String... args) { - Expression parsed = new SpelExpressionParser() - .parseExpression("run(#main,#properties,#args)"); - StandardEvaluationContext context = this.app; - context.setVariable("main", mainClass); - context.setVariable("properties", properties); - context.setVariable("args", args); - parsed.getValue(context); - } - - private void closeContext() { - if (this.app != null) { - Expression parsed = new SpelExpressionParser().parseExpression("close()"); - parsed.getValue(this.app); - this.app = null; - } - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ContextRunner.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ContextRunner.java deleted file mode 100644 index 0ba7280cd..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/ContextRunner.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.lang.reflect.Field; -import java.net.URL; -import java.util.Map; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.function.context.FunctionalSpringApplication; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.SimpleCommandLinePropertySource; -import org.springframework.core.env.StandardEnvironment; -import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; - -/** - * Utility class for starting a Spring Boot application in a separate thread. Best used - * from an isolated class loader, e.g. through {@link ApplicationRunner}. - * - * @author Dave Syer - */ -public class ContextRunner { - - private ConfigurableApplicationContext context; - - private Thread runThread; - - private volatile boolean running = false; - - private Throwable error; - - private long timeout = 120000; - - private static boolean isFunctional(StandardEnvironment environment) { - if (!ClassUtils.isPresent( - "org.springframework.cloud.function.context.FunctionalSpringApplication", - null)) { - return false; - } - return environment.resolvePlaceholders("${spring.functional.enabled:true}") - .equals("true"); - } - - public void run(final String source, final Map properties, - final String... args) { - // Run in new thread to ensure that the context classloader is setup - this.runThread = new Thread(new Runnable() { - @Override - public void run() { - try { - resetUrlHandler(); - StandardEnvironment environment = new StandardEnvironment(); - environment.getPropertySources().addAfter( - StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, - new MapPropertySource("appDeployer", properties)); - if (args != null && args.length > 0) { - environment.getPropertySources().addFirst( - new SimpleCommandLinePropertySource("args", args)); - } - ContextRunner.this.running = true; - Class sourceClass = ClassUtils.resolveClassName(source, null); - SpringApplication builder = builder(sourceClass, environment); - ContextRunner.this.context = builder.run(args); - } - catch (Throwable ex) { - ContextRunner.this.error = ex; - } - - } - }); - this.runThread.start(); - try { - this.runThread.join(this.timeout); - this.running = this.context != null && this.context.isRunning(); - } - catch (InterruptedException e) { - this.running = false; - Thread.currentThread().interrupt(); - } - - } - - public void close() { - if (this.context != null) { - this.context.close(); - resetUrlHandler(); - } - // TODO: JDBC leak protection? - this.running = false; - this.runThread.setContextClassLoader(null); - this.runThread = null; - } - - public ConfigurableApplicationContext getContext() { - return this.context; - } - - private void resetUrlHandler() { - if (ClassUtils.isPresent( - "org.apache.catalina.webresources.TomcatURLStreamHandlerFactory", null)) { - setField(ClassUtils.resolveClassName( - "org.apache.catalina.webresources.TomcatURLStreamHandlerFactory", - null), "instance", null); - setField(URL.class, "factory", null); - } - } - - private void setField(Class type, String name, Object value) { - Field field = ReflectionUtils.findField(type, name); - ReflectionUtils.makeAccessible(field); - ReflectionUtils.setField(field, null, value); - } - - public boolean isRunning() { - return this.running; - } - - public Throwable getError() { - return this.error; - } - - private SpringApplication builder(Class type, StandardEnvironment environment) { - SpringApplication application; - if (!isFunctional(environment)) { - application = new SpringApplication(type); - } - else { - application = FunctionalSpringApplicationCreator.create(type); - } - application.setEnvironment(environment); - application.setRegisterShutdownHook(false); - return application; - } - - private static class FunctionalSpringApplicationCreator { - - public static SpringApplication create(Class type) { - return new FunctionalSpringApplication(type); - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/EnableFunctionDeployer.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/EnableFunctionDeployer.java deleted file mode 100644 index b711069a0..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/EnableFunctionDeployer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import org.springframework.context.annotation.Import; - -/** - * Annotation to be used on a Spring Boot application if it wants to deploy a jar file - * containing a function definition. - * @author Dave Syer - * - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Import(FunctionDeployerConfiguration.class) -public @interface EnableFunctionDeployer { - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionApplication.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionApplication.java deleted file mode 100644 index f20b86df2..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionApplication.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.io.IOException; - -import org.springframework.boot.autoconfigure.SpringBootApplication; - -// @checkstyle:off - -/** - * @author Mark Fisher - * @author Dave Syer - */ -@SpringBootApplication -@EnableFunctionDeployer -public class FunctionApplication { - - public static void main(String[] args) throws IOException { - new ApplicationBootstrap().run(FunctionApplication.class, args); - } - -} -// @checkstyle:on diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java deleted file mode 100644 index a6a56db4c..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionCreatorConfiguration.java +++ /dev/null @@ -1,658 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.lang.reflect.Constructor; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.jar.JarFile; -import java.util.jar.Manifest; -import java.util.stream.Stream; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.loader.JarLauncher; -import org.springframework.boot.loader.archive.Archive; -import org.springframework.boot.loader.archive.ExplodedArchive; -import org.springframework.boot.loader.archive.JarFileArchive; -import org.springframework.boot.system.JavaVersion; -import org.springframework.cloud.deployer.resource.support.DelegatingResourceLoader; -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.context.FunctionRegistry; -import org.springframework.cloud.function.context.FunctionType; -import org.springframework.cloud.function.context.catalog.FunctionInspector; -import org.springframework.cloud.function.core.FluxFunction; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.util.ClassUtils; -import org.springframework.util.ObjectUtils; -import org.springframework.util.ResourceUtils; -import org.springframework.util.StreamUtils; -import org.springframework.util.StringUtils; - -/** - * - * Registers beans that will be picked up by spring-cloud-function-context magic. Sets up - * infrastructure capable of instantiating a "functional" bean (whether Supplier, Function - * or Consumer) loaded dynamically according to {@link FunctionProperties}. - * - *

- * Resolves jar location provided by the user using a flexible ResourceLoader. - *

- * - * @author Eric Bottard - * @author Mark Fisher - * @author Dave Syer - * @author Oleg Zhurakousky - */ -@Configuration -class FunctionCreatorConfiguration { - - private static Log logger = LogFactory.getLog(FunctionCreatorConfiguration.class); - - @Autowired - private FunctionRegistry registry; - - @Autowired - private FunctionProperties properties; - - @Autowired - private DelegatingResourceLoader delegatingResourceLoader; - - @Autowired - private ConfigurableApplicationContext context; - - private BeanCreatorClassLoader functionClassLoader; - - private BeanCreator creator; - - /** - * Registers a function for each of the function classes passed into the - * {@link FunctionProperties}. They are named sequentially "function0", "function1", - * etc. The instances are created in an isolated class loader, so the jar they are - * packed in has to define all the dependencies (except core JDK). - */ - @PostConstruct - public void init() { - URL[] urls = Arrays.stream(this.properties.getLocation()) - .flatMap(toResourceURL(this.delegatingResourceLoader)) - .toArray(URL[]::new); - URL[] roots = Arrays.stream(this.properties.getLocation()).map(this::toUrl) - .toArray(URL[]::new); - - try { - logger.info("Locating function from " - + Arrays.asList(this.properties.getLocation())); - this.creator = new BeanCreator(roots, urls); - this.creator.run(this.properties.getMain()); - Arrays.stream(functionNames()).map(this.creator::create).sequential() - .forEach(this.creator::register); - if (this.properties.getName().contains("|")) { - // A composite function has to be explicitly registered before it is - // looked up because we are using the SingleEntryFunctionRegistry -// Object o = this.registry.lookup(Consumer.class, this.properties.getName()); -// o = this.registry.lookup(Function.class, this.properties.getName()); -// o = this.registry.lookup(Supplier.class, this.properties.getName()); -// System.out.println(); - } - } - catch (Exception e) { - throw new IllegalStateException("Cannot create functions", e); - } - } - - private URL toUrl(String url) { - if (url.equals("app:classpath")) { - return urls()[0]; - } - try { - return new URL(url); - } - catch (MalformedURLException e) { - throw new UncheckedIOException(e); - } - } - - private String[] functionNames() { - if (this.properties.getBean() != null && this.properties.getBean().length > 0) { - return this.properties.getBean(); - } - return this.creator.getFunctionNames(); - } - - @PreDestroy - public void close() { - if (this.creator != null) { - this.creator.close(); - } - if (this.functionClassLoader != null) { - try { - this.functionClassLoader.close(); - this.functionClassLoader = null; - Runtime.getRuntime().gc(); - } - catch (IOException e) { - throw new IllegalStateException("Cannot close function class loader", e); - } - } - } - - private Function> toResourceURL( - DelegatingResourceLoader resourceLoader) { - return l -> { - if (l.equals("app:classpath")) { - return Stream.of(urls()); - } - try { - return Stream.of(resourceLoader.getResource(l).getFile().toURI().toURL()); - } - catch (IOException e) { - throw new UncheckedIOException(e); - } - }; - } - - private URL[] urls() { - if (getClass().getClassLoader() instanceof URLClassLoader) { - return ((URLClassLoader) getClass().getClassLoader()).getURLs(); - } - // Want to load these the test types in a disposable classloader: - List urls = new ArrayList<>(); - String jcp = System.getProperty("java.class.path"); - StringTokenizer jcpEntries = new StringTokenizer(jcp, File.pathSeparator); - while (jcpEntries.hasMoreTokens()) { - String pathEntry = jcpEntries.nextToken(); - try { - urls.add(new File(pathEntry).toURI().toURL()); - } - catch (MalformedURLException e) { - } - } - return urls.toArray(new URL[urls.size()]); - } - - private static final class BeanCreatorClassLoader extends URLClassLoader { - - private BeanCreatorClassLoader(URL[] urls, ClassLoader parent) { - super(urls, parent); - } - - @Override - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - try { - if (name.startsWith("javax.") && JavaVersion.getJavaVersion() - .isEqualOrNewerThan(JavaVersion.NINE)) { - return getClass().getClassLoader().loadClass(name); - } - return super.loadClass(name, resolve); - } - catch (ClassNotFoundException e) { - if (name.contains(ContextRunner.class.getName()) - || name.contains(PostConstruct.class.getName())) { - // Special case for the ContextRunner. We can re-use the bytes for it, - // and the function jar doesn't have to include them since it is only - // used here. - byte[] bytes; - try { - bytes = StreamUtils.copyToByteArray( - getClass().getClassLoader().getResourceAsStream( - ClassUtils.convertClassNameToResourcePath(name) - + ".class")); - return defineClass(name, bytes, 0, bytes.length); - } - catch (IOException ex) { - throw new ClassNotFoundException( - "Cannot find runner class: " + name, ex); - } - } - throw e; - } - } - - } - - @Configuration - protected static class SingleEntryConfiguration implements BeanPostProcessor { - - @Autowired - private Environment env; - - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) - throws BeansException { - return bean; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) - throws BeansException { - if (bean instanceof FunctionRegistry) { - String name = FunctionProperties - .functionName(this.env.getProperty("function.bean", "")); - if (name.contains("|")) { - // A single composite function with an empty name - bean = new SingleEntryFunctionRegistry((FunctionRegistry) bean, name); - } - } - return bean; - } - - } - - private class ComputeLauncher extends JarLauncher { - - ComputeLauncher(Archive archive) { - super(archive); - } - - @Override - public String getMainClass() throws Exception { - Manifest manifest = getArchive().getManifest(); - String mainClass = null; - if (manifest != null) { - String functionClass = manifest.getMainAttributes() - .getValue("Function-Class"); - if (StringUtils.hasText(functionClass) && ObjectUtils.isEmpty( - FunctionCreatorConfiguration.this.properties.getBean())) { - FunctionCreatorConfiguration.this.properties - .setBean(new String[] { functionClass }); - } - mainClass = manifest.getMainAttributes().getValue("Start-Class"); - if (mainClass == null - // Not surefire or IntelliJ - && !getArchive().getUrl().toString().endsWith(".jar!/")) { - // Not a Spring Boot jar but it might have a "main" class - mainClass = manifest.getMainAttributes().getValue("Main-Class"); - } - } - return mainClass; - } - - public URL[] getClassLoaderUrls() throws Exception { - List archives = getClassPathArchives(); - if (archives.isEmpty()) { - URL url = getArchive().getUrl(); - if (url.toString().contains(".jar")) { // Surefire or IntelliJ? - URL[] classpath = extractClasspath(url.toString()); - if (classpath != null) { - return classpath; - } - } - return new URL[] { getArchive().getUrl() }; - } - return archives.stream().map(archive -> { - try { - return archive.getUrl(); - } - catch (MalformedURLException e) { - throw new IllegalStateException("Bad URL: " + archive, e); - } - }).toArray(URL[]::new); - } - - private URL[] extractClasspath(String url) { - // This works for a jar indirection like in surefire and IntelliJ - if (url.endsWith(".jar!/")) { - url = url.substring(0, url.length() - "!/".length()); - if (url.startsWith("jar:")) { - url = url.substring("jar:".length()); - } - if (url.startsWith("file:")) { - url = url.substring("file:".length()); - } - } - if (url.endsWith(".jar")) { - JarFile jar; - try { - jar = new JarFile(new File(url)); - String path = jar.getManifest().getMainAttributes() - .getValue("Class-Path"); - if (path != null) { - List result = new ArrayList<>(); - for (String element : path.split(" ")) { - result.add(new URL(element)); - } - return result.toArray(new URL[0]); - } - } - catch (Exception e) { - } - } - return null; - } - - } - - /** - * Encapsulates the bean and spring application context creation concerns for - * functions. Creates a single application context if run() is called - * with a non-null main class, and then uses it to lookup a function (by name and then - * by type). - */ - private class BeanCreator { - - private AtomicInteger counter = new AtomicInteger(0); - - private ApplicationRunner runner; - - private String defaultMain; - - BeanCreator(URL[] roots, URL[] urls) { - FunctionCreatorConfiguration.this.functionClassLoader = new BeanCreatorClassLoader( - expand(urls), getParent()); - this.defaultMain = findMain(roots); - } - - private ClassLoader getParent() { - ClassLoader loader = getClass().getClassLoader(); - loader = loader.getParent(); - ClassLoader parent = loader; - while (loader.getParent() != null) { - // If launched from a fat jar with spring.factories skip this parent level - // (which was added by the JarLauncher). - if (loader.getResource("META-INF/spring.factories") != null) { - parent = loader.getParent(); - } - loader = loader.getParent(); - } - return parent; - } - - private String findMain(URL[] urls) { - for (URL url : urls) { - try { - File file = ResourceUtils.getFile(url); - if (file.exists()) { - Archive archive = file.getName().endsWith(".jar") - ? new JarFileArchive(file) : new ExplodedArchive(file); - String main = new ComputeLauncher(archive).getMainClass(); - if (main != null) { - return main; - } - } - } - catch (Exception e) { - // ignore - } - } - return null; - } - - private URL[] expand(URL[] urls) { - List result = new ArrayList<>(); - for (URL url : urls) { - result.addAll(expand(url)); - } - return result.toArray(new URL[0]); - } - - private List expand(URL url) { - if (!"file".equals(url.getProtocol())) { - return Collections.singletonList(url); - } - try { - File file = new File(url.toURI()); - if (file.exists()) { - Archive archive; - if (!url.toString().endsWith(".jar")) { - if (!new File(file, "BOOT-INF").exists()) { - return Collections.singletonList(url); - } - archive = new ExplodedArchive(file); - } - else { - archive = new JarFileArchive(file); - } - return Arrays - .asList(new ComputeLauncher(archive).getClassLoaderUrls()); - } - return Collections.singletonList(url); - } - catch (Exception e) { - throw new IllegalStateException("Cannot create class loader for " + url, - e); - } - } - - public void run(String main) { - if (main == null) { - main = this.defaultMain; - } - if (main == null) { - return; - } - if (ClassUtils.isPresent(SpringApplication.class.getName(), - FunctionCreatorConfiguration.this.functionClassLoader)) { - logger.info("SpringApplication available. Bootstrapping: " + main); - ClassLoader contextClassLoader = ClassUtils - .overrideThreadContextClassLoader( - FunctionCreatorConfiguration.this.functionClassLoader); - try { - ApplicationRunner runner = new ApplicationRunner( - FunctionCreatorConfiguration.this.functionClassLoader, main); - // TODO: make the runtime properties configurable - runner.run("--spring.main.webEnvironment=false", - "--spring.cloud.stream.enabled=false", - "--spring.main.bannerMode=OFF", - "--spring.main.webApplicationType=none", - "--function.deployer.enabled=false"); - this.runner = runner; - } - finally { - ClassUtils.overrideThreadContextClassLoader(contextClassLoader); - } - } - else { - throw new IllegalStateException( - "SpringApplication not available and main class requested: " - + main); - } - } - - public String[] getFunctionNames() { - Set list = new LinkedHashSet<>(); - ClassLoader contextClassLoader = ClassUtils.overrideThreadContextClassLoader( - FunctionCreatorConfiguration.this.functionClassLoader); - try { - if (this.runner.containsBean(FunctionCatalog.class.getName())) { - Object catalog = this.runner.getBean(FunctionCatalog.class.getName()); - @SuppressWarnings("unchecked") - Set functions = (Set) this.runner - .evaluate("getNames(#type)", catalog, "type", Function.class); - list.addAll(functions); - @SuppressWarnings("unchecked") - Set consumers = (Set) this.runner - .evaluate("getNames(#type)", catalog, "type", Consumer.class); - list.addAll(consumers); - @SuppressWarnings("unchecked") - Set suppliers = (Set) this.runner - .evaluate("getNames(#type)", catalog, "type", Supplier.class); - list.addAll(suppliers); - } - if (list.isEmpty()) { - list.addAll(this.runner.getBeanNames(Function.class.getName())); - list.addAll(this.runner.getBeanNames(Consumer.class.getName())); - list.addAll(this.runner.getBeanNames(Supplier.class.getName())); - } - return list.toArray(new String[0]); - } - finally { - ClassUtils.overrideThreadContextClassLoader(contextClassLoader); - } - } - - public Object create(String type) { - ClassLoader contextClassLoader = ClassUtils.overrideThreadContextClassLoader( - FunctionCreatorConfiguration.this.functionClassLoader); - AutowireCapableBeanFactory factory = FunctionCreatorConfiguration.this.context - .getAutowireCapableBeanFactory(); - try { - Object result = null; - if (this.runner != null) { - result = this.runner.getBean(type); - if (result == null) { - if (this.runner.containsBean(FunctionCatalog.class.getName())) { - Object catalog = this.runner - .getBean(FunctionCatalog.class.getName()); - result = this.runner.evaluate("lookup(#function).getTarget()", - catalog, "function", type); - if (result != null) { - logger.info("Located registration: " + type + " of type " - + result.getClass()); - } - } - } - else { - logger.info("Located bean: " + type + " of type " - + result.getClass()); - if (result.getClass().getName() - .equals(FunctionRegistration.class.getName())) { - result = this.runner.evaluate("getTarget()", result); - } - } - if (result != null) { - if (result.getClass().getName() - .equals(FluxFunction.class.getName())) { - result = this.runner.evaluate("getTarget()", result); - } - } - } - if (result == null) { - logger.info("No bean found. Instantiating: " + type); - if (ClassUtils.isPresent(type, - FunctionCreatorConfiguration.this.functionClassLoader)) { - result = factory.createBean(ClassUtils.resolveClassName(type, - FunctionCreatorConfiguration.this.functionClassLoader)); - } - } - if (result != null) { - return result; - } - throw new IllegalStateException("Cannot create bean for: " + type); - } - finally { - ClassUtils.overrideThreadContextClassLoader(contextClassLoader); - } - } - - private FunctionType createFunctionType(Object functionCatalog) { - FunctionType functionType = null; - try { - @SuppressWarnings("unchecked") - String name = ((Set) this.runner.evaluate("getNames(#type)", functionCatalog, "type", null)) - .stream().findFirst().orElse(null); - if (name != null) { - Object ft = this.runner.evaluate("getFunctionType(#name)", functionCatalog, "name", name); - Constructor ftConstructor = FunctionType.class.getDeclaredConstructor(Object.class); - ftConstructor.setAccessible(true); - functionType = ftConstructor.newInstance(ft); - } - } - catch (Exception e) { - throw new IllegalStateException("Failed to extract and map FunctionType", e); - - } - return functionType; - } - - public void register(Object bean) { - if (bean == null) { - return; - } - FunctionRegistration registration = new FunctionRegistration( - bean, - FunctionProperties.functionName(this.counter.getAndIncrement())); - if (this.runner != null) { - if (this.runner.containsBean(FunctionInspector.class.getName())) { - Object functionCatalog = this.runner - .getBean(FunctionInspector.class.getName()); - - FunctionType type = this.createFunctionType(functionCatalog); - if (type == null) { - Class input = (Class) this.runner.evaluate( - "getInputType(#function)", functionCatalog, "function", bean); - type = FunctionType.from(input); - Class output = findType("getOutputType", functionCatalog, bean); - type = type.to(output); - if (((Boolean) this.runner.evaluate("isMessage(#function)", functionCatalog, - "function", bean))) { - type = type.message(); - } - Class inputWrapper = findType("getInputWrapper", functionCatalog, bean); - if (FunctionType.isWrapper(inputWrapper)) { - type = type.wrap(inputWrapper); - } - Class outputWrapper = findType("getOutputWrapper", functionCatalog, - bean); - if (FunctionType.isWrapper(outputWrapper)) { - type = type.wrap(outputWrapper); - } - } - registration.type(this.createFunctionType(functionCatalog)); - } - } - else { - registration.type(FunctionType.of(bean.getClass()).getType()); - } - registration.target(bean); - if (registration.getType() == null) { - registration.type(FunctionType.of(bean.getClass()).getType()); - } - FunctionCreatorConfiguration.this.registry.register(registration); - } - - private Class findType(String method, Object inspector, Object bean) { - return (Class) this.runner.evaluate(method + "(#function)", inspector, - "function", bean); - } - - public void close() { - if (this.runner != null) { - this.runner.close(); - } - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionDeployerConfiguration.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionDeployerConfiguration.java deleted file mode 100644 index e2712809b..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionDeployerConfiguration.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.deployer.resource.maven.MavenProperties; -import org.springframework.cloud.deployer.resource.maven.MavenResource; -import org.springframework.cloud.deployer.resource.maven.MavenResourceLoader; -import org.springframework.cloud.deployer.resource.support.DelegatingResourceLoader; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.io.ResourceLoader; - -/** - * @author Dave Syer - * - */ -@Configuration -@ConditionalOnProperty(prefix = "function.deployer", name = "enabled", matchIfMissing = true) -@EnableConfigurationProperties -@Import(FunctionCreatorConfiguration.class) -public class FunctionDeployerConfiguration { - - @Bean - @ConfigurationProperties("maven") - public MavenProperties mavenProperties() { - return new MavenProperties(); - } - - @Bean - @ConfigurationProperties("function") - public FunctionProperties functionProperties() { - return new FunctionProperties(); - } - - @Bean - @ConditionalOnMissingBean(DelegatingResourceLoader.class) - public DelegatingResourceLoader delegatingResourceLoader( - MavenProperties mavenProperties) { - Map loaders = new HashMap<>(); - loaders.put(MavenResource.URI_SCHEME, new MavenResourceLoader(mavenProperties)); - return new DelegatingResourceLoader(loaders); - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionProperties.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionProperties.java deleted file mode 100644 index 39b4e2fd3..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/FunctionProperties.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.PostConstruct; - -import org.springframework.util.StringUtils; - -/** - * Configuration properties for deciding how to locate the functional class to execute. - * - * @author Eric Bottard - */ -public class FunctionProperties { - - /** - * Location(s) of jar archives containing the supplier/function/consumer class to run. - */ - private String[] location = new String[0]; - - /** - * The bean name or fully qualified class name of the supplier/function/consumer to - * run. - */ - private String[] bean = new String[0]; - - /** - * Optional main class from which to build a Spring application context. - */ - private String main; - - public static String functionName(String name) { - if (!name.contains(",")) { - return "function0"; - } - List names = new ArrayList<>(); - for (int i = 0; i <= StringUtils.countOccurrencesOf(name, ","); i++) { - names.add("function" + i); - } - return StringUtils.collectionToDelimitedString(names, "|"); - } - - public static String functionName(int value) { - return "function" + value; - } - - public String getName() { - return functionName(StringUtils.arrayToDelimitedString(this.bean, ",")); - } - - public String[] getBean() { - return this.bean; - } - - public void setBean(String[] bean) { - this.bean = bean; - } - - public String[] getLocation() { - return this.location; - } - - public void setLocation(String[] location) { - this.location = location; - } - - public String getMain() { - return this.main; - } - - public void setMain(String main) { - this.main = main; - } - - @PostConstruct - public void init() { - if (this.location.length == 0) { - throw new IllegalStateException( - "No archive location provided, please configure function.location as a jar or directory."); - } - } - -} diff --git a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistry.java b/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistry.java deleted file mode 100644 index 50af41ca8..000000000 --- a/spring-cloud-function-deployer-old/src/main/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistry.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.Collections; -import java.util.Set; - -import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.context.FunctionRegistry; -import org.springframework.util.StringUtils; - -/** - * @author Dave Syer - * - */ -public class SingleEntryFunctionRegistry implements FunctionRegistry { - - private final FunctionRegistry delegate; - - private final String name; - - public SingleEntryFunctionRegistry(FunctionRegistry delegate, String name) { - this.delegate = delegate; - this.name = name; - } - - @Override - public T lookup(Class type, String name) { - if (StringUtils.isEmpty(name)) { - if (this.delegate.getNames(type).size() == 1) { - return this.delegate.lookup(type, - this.delegate.getNames(type).iterator().next()); - } - name = this.name; - } - return name.equals(this.name) ? this.delegate.lookup(type, name) : null; - } - - @Override - public Set getNames(Class type) { - return Collections.singleton(this.name); - } - - @Override - public void register(FunctionRegistration registration) { - this.delegate.register(registration); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/AdhocTestSuite.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/AdhocTestSuite.java deleted file mode 100644 index 12a7aab6d..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/AdhocTestSuite.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import org.junit.Ignore; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -/** - * A test suite for probing weird ordering problems in the tests. - * - * @author Dave Syer - */ -@RunWith(Suite.class) -@SuiteClasses({ FunctionCreatorConfigurationTests.FunctionCompositionTests.class, - FunctionCreatorConfigurationTests.SingleFunctionTests.class, - FunctionCreatorConfigurationTests.ManualSpringFunctionTests.class, - ContextRunnerTests.class, - SpringFunctionAppConfigurationTests.ProcessorTests.class, - SpringFunctionAppConfigurationTests.SourceTests.class, - FunctionCreatorConfigurationTests.ConsumerCompositionTests.class, - SpringFunctionAppConfigurationTests.CompositeTests.class, - ApplicationRunnerTests.class, SpringFunctionAppConfigurationTests.SinkTests.class, - FunctionCreatorConfigurationTests.SupplierCompositionTests.class }) -@Ignore -public class AdhocTestSuite { - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ApplicationRunnerTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ApplicationRunnerTests.java deleted file mode 100644 index fc50dbd68..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ApplicationRunnerTests.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import org.junit.Test; - -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.test.Doubler; -import org.springframework.cloud.function.test.FunctionApp; -import org.springframework.cloud.function.test.FunctionRegistrar; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Dave Syer - */ - -public class ApplicationRunnerTests { - - @Test - public void startEvaluateAndStop() { - ApplicationRunner runner = new ApplicationRunner(getClass().getClassLoader(), - FunctionApp.class.getName()); - runner.run("--spring.main.webEnvironment=false"); - assertThat(runner.containsBean(Doubler.class.getName())).isTrue(); - assertThat(runner.getBean(Doubler.class.getName())).isNotNull(); - runner.close(); - } - - @Test - public void functional() { - ApplicationRunner runner = new ApplicationRunner(getClass().getClassLoader(), - FunctionRegistrar.class.getName()); - runner.run(); - assertThat(runner.containsBean(Doubler.class.getName())).isFalse(); - assertThat(runner.getBean(FunctionCatalog.class.getName())).isNotNull(); - assertThat(runner.getBeanNames(FunctionRegistration.class.getName())).hasSize(2); - runner.close(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ContextRunnerTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ContextRunnerTests.java deleted file mode 100644 index dad1b0c46..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/ContextRunnerTests.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.Collections; - -import org.junit.Test; - -import org.springframework.cloud.function.test.Doubler; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Dave Syer - */ -public class ContextRunnerTests { - - @Test - public void startEvaluateAndStop() { - ContextRunner runner = new ContextRunner(); - runner.run(Doubler.class.getName(), Collections.emptyMap(), - "--spring.main.webEnvironment=false"); - assertThat(runner.getContext()).isNotNull(); - runner.close(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/FunctionCreatorConfigurationTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/FunctionCreatorConfigurationTests.java deleted file mode 100644 index d1b7878f4..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/FunctionCreatorConfigurationTests.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.function.Function; -import java.util.function.Supplier; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.rule.OutputCapture; -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.containsString; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = { FunctionDeployerConfiguration.class }) -@DirtiesContext -public abstract class FunctionCreatorConfigurationTests { - - @Autowired - protected FunctionCatalog catalog; - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.location=file:target/test-classes", - "function.bean=org.springframework.cloud.function.test.Doubler" }) - public static class SingleFunctionTests extends FunctionCreatorConfigurationTests { - - @Test - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { - "function.location=app:classpath,file:target/test-classes,file:target/test-classes/app", - "function.bean=myDoubler" }) - public static class SingleFunctionWithAutoMainTests - extends FunctionCreatorConfigurationTests { - - @Test - @Ignore - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { - "function.location=app:classpath,file:target/test-classes,file:target/test-classes/app", - "function.bean=myDoubler", - "function.main=org.springframework.cloud.function.test.FunctionApp" }) - public static class SingleFunctionWithMainTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { - "function.location=app:classpath,file:target/test-classes,file:target/test-classes/app", - "function.bean=doubler", - "function.main=org.springframework.cloud.function.test.FunctionRegistrar" }) - public static class SingleFunctionWithRegistrarTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { - "function.location=app:classpath,file:target/test-classes,file:target/test-classes/app", - "function.bean=frenchizer", - "function.main=org.springframework.cloud.function.test.FunctionRegistrar" }) - public static class SingleFunctionWithRegistrarAndRegistrationTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testFrenchize() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo("deux"); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { - "function.location=app:classpath,file:target/test-classes,file:target/test-classes/app", - "function.bean=myDoubler", - "function.main=org.springframework.cloud.function.test.FunctionInitializer" }) - @Ignore - public static class SingleFunctionWithInitializerTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.location=app:classpath", - "function.bean=org.springframework.cloud.function.test.SpringDoubler" }) - public static class ManualSpringFunctionTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testDouble() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.location=file:target/test-classes", - "function.bean=org.springframework.cloud.function.test.NumberEmitter," - + "org.springframework.cloud.function.test.Frenchizer" }) - @Ignore - public static class SupplierCompositionTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testSupplier() { - Supplier function = this.catalog.lookup(Supplier.class, "function0"); - assertThat(function).isNull(); - } - - @Test - public void testFunction() { - Supplier function = this.catalog.lookup(Supplier.class, - "function0|function1"); - assertThat(function.get()).isEqualTo("un"); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.location=file:target/test-classes", - "function.bean=org.springframework.cloud.function.test.Doubler," - + "org.springframework.cloud.function.test.Frenchizer" }) - public static class FunctionCompositionTests - extends FunctionCreatorConfigurationTests { - - @Test - public void testFunction() { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0|function1"); - assertThat(function.apply(Flux.just(2)).blockFirst()).isEqualTo("quatre"); - } - - @Test - public void testThen() { - Function function = this.catalog.lookup(Function.class, - "function1"); - assertThat(function).isNull(); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.location=file:target/test-classes", - "function.bean=org.springframework.cloud.function.test.Frenchizer," - + "org.springframework.cloud.function.test.Printer" }) - public static class ConsumerCompositionTests - extends FunctionCreatorConfigurationTests { - - @Rule - public OutputCapture capture = new OutputCapture(); - - @Test - @Ignore - public void testConsumer() { - Function, Mono> function = this.catalog - .lookup(Function.class, "function0|function1"); - function.apply(Flux.just(2)).block(); - this.capture.expect(containsString("Seen deux")); - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistryTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistryTests.java deleted file mode 100644 index 1caa08f76..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SingleEntryFunctionRegistryTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.function.Function; - -import org.junit.Test; - -import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.context.catalog.InMemoryFunctionCatalog; -import org.springframework.cloud.function.core.FluxFunction; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Dave Syer - * - */ -public class SingleEntryFunctionRegistryTests { - - private InMemoryFunctionCatalog delegate = new InMemoryFunctionCatalog(); - - @Test - public void named() { - this.delegate.register(new FunctionRegistration(new Foos(), "foo")); - SingleEntryFunctionRegistry registry = new SingleEntryFunctionRegistry( - this.delegate, "foo"); - assertThat(((FluxFunction) registry.lookup("")).getTarget()).isInstanceOf(Foos.class); - } - - @Test - public void other() { - this.delegate.register(new FunctionRegistration(new Foos(), "foo")); - SingleEntryFunctionRegistry registry = new SingleEntryFunctionRegistry( - this.delegate, "foo"); - assertThat(((FluxFunction) registry.lookup("")).getTarget()).isInstanceOf(Foos.class); - } - - @Test - public void empty() { - this.delegate.register(new FunctionRegistration(new Foos(), "")); - SingleEntryFunctionRegistry registry = new SingleEntryFunctionRegistry( - this.delegate, ""); - assertThat(((FluxFunction) registry.lookup("")).getTarget()).isInstanceOf(Foos.class); - } - - @Test - public void anonymous() { - this.delegate.register(new FunctionRegistration(new Foos(), "bar")); - SingleEntryFunctionRegistry registry = new SingleEntryFunctionRegistry( - this.delegate, "foo"); - assertThat(((FluxFunction) registry.lookup("")).getTarget()).isInstanceOf(Foos.class); - } - - class Foos implements Function { - - @Override - public String apply(String t) { - return t.toUpperCase(); - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java deleted file mode 100644 index e4c834d41..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppConfigurationTests.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.function.Function; -import java.util.function.Supplier; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.rule.OutputCapture; -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.containsString; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = FunctionDeployerConfiguration.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -@TestPropertySource(properties = { - "function.location=file:target/it/support/target/function-sample-1.0.0.M1-exec.jar" }) -public abstract class SpringFunctionAppConfigurationTests { - - @Autowired - protected FunctionCatalog catalog; - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myEmitter", - "function.main=com.example.functions.FunctionApp" }) - public static class SourceTests extends SpringFunctionAppConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Supplier function = this.catalog.lookup(Supplier.class, - "function0"); - assertThat(function.get()).isEqualTo("one"); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myEmitter,myCounter" }) - public static class CompositeTests extends SpringFunctionAppConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Supplier function = this.catalog.lookup(Supplier.class, - "function0|function1"); - assertThat(function.get()).isEqualTo(3); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myCounter" }) - public static class ProcessorTests extends SpringFunctionAppConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just("spam")).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myDoubler" }) - public static class SinkTests extends SpringFunctionAppConfigurationTests { - - @Rule - public OutputCapture capture = new OutputCapture(); - - @Test - @Ignore - public void test() throws Exception { - // Can't assert side effects. - Function, Mono> function = this.catalog - .lookup(Function.class, "function0"); - function.apply(Flux.just(5)).block(); - this.capture.expect(containsString(String.format("10%n"))); - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppExplodedConfigurationTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppExplodedConfigurationTests.java deleted file mode 100644 index 4e3b946e4..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionAppExplodedConfigurationTests.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.util.function.Function; -import java.util.function.Supplier; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.rule.OutputCapture; -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.containsString; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = FunctionDeployerConfiguration.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -@TestPropertySource(properties = { - "function.location=file:target/it/support/target/dependency" }) -public abstract class SpringFunctionAppExplodedConfigurationTests { - - @Autowired - protected FunctionCatalog catalog; - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myEmitter", - "function.main=com.example.functions.FunctionApp" }) - public static class SourceTests extends SpringFunctionAppExplodedConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Supplier function = this.catalog.lookup(Supplier.class, - "function0"); - assertThat(function.get()).isEqualTo("one"); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myEmitter,myCounter" }) - public static class CompositeTests - extends SpringFunctionAppExplodedConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Supplier function = this.catalog.lookup(Supplier.class, - "function0|function1"); - assertThat(function.get()).isEqualTo(3); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myCounter" }) - public static class ProcessorTests - extends SpringFunctionAppExplodedConfigurationTests { - - @Test - @Ignore - public void test() throws Exception { - Function, Flux> function = this.catalog - .lookup(Function.class, "function0"); - assertThat(function.apply(Flux.just("spam")).blockFirst()).isEqualTo(4); - } - - } - - @EnableAutoConfiguration - @TestPropertySource(properties = { "function.bean=myDoubler" }) - @Ignore // @TestPropertySource is not taken into account nor it is visible - public static class SinkTests extends SpringFunctionAppExplodedConfigurationTests { - - @Rule - public OutputCapture capture = new OutputCapture(); - - @Test - public void test() throws Exception { - // Can't assert side effects. - Function, Mono> function = this.catalog - .lookup(Function.class, "function0"); - function.apply(Flux.just(5)).block(); - this.capture.expect(containsString(String.format("10%n"))); - } - - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionFluxConfigurationTests.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionFluxConfigurationTests.java deleted file mode 100644 index 5eb40a550..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/deployer/SpringFunctionFluxConfigurationTests.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.deployer; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.function.Function; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cloud.function.context.FunctionCatalog; -import org.springframework.cloud.function.context.catalog.FunctionInspector; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootConfiguration -@EnableAutoConfiguration -@EnableFunctionDeployer -public class SpringFunctionFluxConfigurationTests { - - private Object catalog; - - private Object inspector; - - private ApplicationBootstrap bootstrap; - - @Before - public void run() { - if (this.bootstrap == null) { - this.bootstrap = new ApplicationBootstrap(); - this.bootstrap.run(SpringFunctionFluxConfigurationTests.class, - "--function.location=file:target/it/flux/target/dependency", - "--function.bean=foos", - "--function.main=com.example.functions.FunctionApp"); - this.catalog = this.bootstrap.getRunner() - .getBean(FunctionCatalog.class.getName()); - this.inspector = this.bootstrap.getRunner() - .getBean(FunctionInspector.class.getName()); - } - } - - @After - public void close() { - if (this.bootstrap != null) { - this.bootstrap.close(); - } - } - - @Test - @Ignore - public void test() throws Exception { - @SuppressWarnings("unchecked") - Function function = (Function) this.bootstrap - .getRunner() - .evaluate("lookup(T(java.util.function.Function), 'function0')", - this.catalog); - assertThat(function).isNotNull(); - Class inputType = (Class) this.bootstrap.getRunner().evaluate( - "getInputType(#function)", this.inspector, "function", function); - assertThat(inputType.getName()).isEqualTo("com.example.functions.Foo"); - Object foo = create(inputType); - Class outputType = (Class) this.bootstrap.getRunner().evaluate( - "getOutputType(#function)", this.inspector, "function", function); - assertThat(outputType.getName()).isEqualTo("com.example.functions.Foo"); - String value = (String) this.bootstrap.getRunner().evaluate( - "apply(T(reactor.core.publisher.Flux).just(#foo)).blockFirst().getValue()", - function, "foo", foo); - assertThat(value).isEqualTo("FOO"); - } - - private Object create(Class inputType) throws InstantiationException, - IllegalAccessException, InvocationTargetException, NoSuchMethodException { - Constructor constructor = inputType.getConstructor(String.class); - constructor.setAccessible(true); - return constructor.newInstance("foo"); - } - -} - -class Foo { - - private String value; - - Foo() { - } - - Foo(String value) { - this.value = value; - } - - public String getValue() { - return this.value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "Foo [value=" + this.value + "]"; - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Doubler.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Doubler.java deleted file mode 100644 index a0f7b48fd..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Doubler.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import java.util.function.Function; - -public class Doubler implements Function { - - @Override - public Integer apply(Integer integer) { - return 2 * integer; - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Frenchizer.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Frenchizer.java deleted file mode 100644 index 919aaf0db..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Frenchizer.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import java.util.function.Function; - -import javax.annotation.PostConstruct; - -public class Frenchizer implements Function { - - private String[] numbers; - - @PostConstruct - public void init() { - this.numbers = new String[4]; - this.numbers[0] = "un"; - this.numbers[1] = "deux"; - this.numbers[2] = "trois"; - this.numbers[3] = "quatre"; - } - - @Override - public String apply(Integer integer) { - if (integer < this.numbers.length + 1) { - return this.numbers[integer - 1]; - } - throw new RuntimeException(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionApp.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionApp.java deleted file mode 100644 index ede44f2b5..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionApp.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.context.annotation.Bean; - -/** - * @author Dave Syer - */ -@SpringBootConfiguration -public class FunctionApp { - - public static void main(String[] args) throws Exception { - SpringApplication.run(FunctionApp.class, args); - } - - @Bean - public Doubler myDoubler() { - return new Doubler(); - } - - @Bean - public Frenchizer myFrenchizer() { - return new Frenchizer(); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionInitializer.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionInitializer.java deleted file mode 100644 index 17284665d..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionInitializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.function.context.FunctionalSpringApplication; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.support.GenericApplicationContext; - -/** - * @author Dave Syer - */ -public class FunctionInitializer - implements ApplicationContextInitializer { - - public static void main(String[] args) throws Exception { - SpringApplication application = new FunctionalSpringApplication( - FunctionInitializer.class); - application.run(args); - } - - @Bean - public Doubler myDoubler() { - return new Doubler(); - } - - @Bean - public Frenchizer myFrenchizer() { - return new Frenchizer(); - } - - @Override - public void initialize(GenericApplicationContext context) { - // TODO: support for FunctionRegistration - context.registerBean("myDoubler", Doubler.class, () -> myDoubler()); - context.registerBean("myFrenchizer", Frenchizer.class, () -> myFrenchizer()); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionRegistrar.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionRegistrar.java deleted file mode 100644 index f187efcfc..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/FunctionRegistrar.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import org.springframework.boot.SpringApplication; -import org.springframework.cloud.function.context.FunctionRegistration; -import org.springframework.cloud.function.context.FunctionType; -import org.springframework.cloud.function.context.FunctionalSpringApplication; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.support.GenericApplicationContext; - -/** - * @author Dave Syer - */ -public class FunctionRegistrar - implements ApplicationContextInitializer { - - public static void main(String[] args) throws Exception { - SpringApplication application = new FunctionalSpringApplication( - FunctionRegistrar.class); - application.run(args); - } - - @Bean - public Doubler myDoubler() { - return new Doubler(); - } - - @Bean - public Frenchizer myFrenchizer() { - return new Frenchizer(); - } - - @Override - public void initialize(GenericApplicationContext context) { - context.registerBean("theDoubler", FunctionRegistration.class, - () -> new FunctionRegistration<>(myDoubler(), "doubler") - .type(FunctionType.of((Doubler.class)))); - context.registerBean("frenchizer", FunctionRegistration.class, () -> { - Frenchizer function = myFrenchizer(); - function.init(); - return new FunctionRegistration<>(function, "theFrenchizer") - .type(FunctionType.of((Frenchizer.class))); - }); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/NumberEmitter.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/NumberEmitter.java deleted file mode 100644 index 5e118b70e..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/NumberEmitter.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import java.util.function.Supplier; - -public class NumberEmitter implements Supplier { - - @Override - public Integer get() { - return 1; - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Printer.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Printer.java deleted file mode 100644 index 31d6ab2cd..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/Printer.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import java.util.function.Consumer; - -public class Printer implements Consumer { - - @Override - public void accept(Object o) { - System.err.println("Seen " + o); - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/SpringDoubler.java b/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/SpringDoubler.java deleted file mode 100644 index 8e31a2135..000000000 --- a/spring-cloud-function-deployer-old/src/test/java/org/springframework/cloud/function/test/SpringDoubler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 - * - * 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.cloud.function.test; - -import java.util.function.Function; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.Banner.Mode; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.ConfigurableApplicationContext; - -public class SpringDoubler implements Function { - - @Autowired - private ConfigurableApplicationContext context; - - @PostConstruct - public void init() { - if (this.context == null) { - this.context = new SpringApplicationBuilder(FunctionApp.class) - .bannerMode(Mode.OFF).registerShutdownHook(false) - .web(WebApplicationType.NONE).run(); - } - } - - @PreDestroy - public void close() { - if (this.context != null) { - this.context.close(); - } - } - - @Override - public Integer apply(Integer integer) { - return 2 * integer; - } - -} diff --git a/spring-cloud-function-deployer-old/src/test/resources/app/META-INF/MANIFEST.MF b/spring-cloud-function-deployer-old/src/test/resources/app/META-INF/MANIFEST.MF deleted file mode 100644 index c4bd49cc7..000000000 --- a/spring-cloud-function-deployer-old/src/test/resources/app/META-INF/MANIFEST.MF +++ /dev/null @@ -1,14 +0,0 @@ -Manifest-Version: 1.0 -Implementation-Title: function-file-sample -Implementation-Version: 1.0.0.M1 -Archiver-Version: Plexus Archiver -Built-By: dsyer -Implementation-Vendor-Id: com.example -Spring-Boot-Version: 1.5.12.RELEASE -Implementation-Vendor: Pivotal Software, Inc. -Main-Class: org.springframework.boot.loader.JarLauncher -Start-Class: org.springframework.cloud.function.test.FunctionApp -Created-By: Apache Maven 3.5.0 -Build-Jdk: 1.8.0_131 -Implementation-URL: https://projects.spring.io/spring-boot/function-sam - ple/