Move Layout into adapter class

pr comments, mv package, make work locally.

revert pom change to parent

Rm provided scope - this is problematic for spring-boot-maven plugin to build jar

Detach sample from spring-cloud-function-parent

Update readmes

cleanup

Add comment

fix javadoc
Resolves #518
This commit is contained in:
dzou
2020-05-07 19:55:28 -04:00
committed by Oleg Zhurakousky
parent 8ca1b45c81
commit 17c3f185bc
8 changed files with 211 additions and 89 deletions

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2018-2020 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.adapter.gcp;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import org.springframework.boot.loader.JarLauncher;
import org.springframework.boot.loader.jar.JarFile;
/**
* The launcher class written at the top-level of the output JAR to be deployed to
* Google Cloud Functions. This is the entry point to the function when run from JAR.
*
* @author Ray Tsang
* @author Daniel Zou
*/
public class GcfJarLauncher extends JarLauncher implements HttpFunction {
private final ClassLoader loader;
private final HttpFunction delegate;
public GcfJarLauncher() throws Exception {
JarFile.registerUrlProtocolHandler();
this.loader = createClassLoader(getClassPathArchivesIterator());
Class<?> clazz = this.loader
.loadClass("org.springframework.cloud.function.adapter.gcp.FunctionInvoker");
this.delegate = (HttpFunction) clazz.getConstructor().newInstance();
}
@Override
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws Exception {
Thread.currentThread().setContextClassLoader(this.loader);
delegate.service(httpRequest, httpResponse);
}
}

View File

@@ -0,0 +1,55 @@
/*
* Copyright 2018-2020 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.adapter.gcp.layout;
import java.io.IOException;
import org.springframework.boot.loader.tools.CustomLoaderLayout;
import org.springframework.boot.loader.tools.Layouts;
import org.springframework.boot.loader.tools.LoaderClassesWriter;
import org.springframework.cloud.function.adapter.gcp.GcfJarLauncher;
/**
* A custom JAR Layout that writes GCF adapter classes to the top-level of the output JAR
* for deploying to GCF.
*
* @author Ray Tsang
* @author Daniel Zou
*/
public class GcfJarLayout extends Layouts.Jar implements CustomLoaderLayout {
private static final String LAUNCHER_NAME = GcfJarLauncher.class.getCanonicalName();
@Override
public String getLauncherClassName() {
return LAUNCHER_NAME;
}
@Override
public boolean isExecutable() {
return false;
}
@Override
public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException {
writer.writeLoaderClasses();
String jarName = LAUNCHER_NAME.replaceAll("\\.", "/") + ".class";
writer.writeEntry(
jarName, GcfJarLauncher.class.getResourceAsStream("/" + jarName));
}
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright 2018-2020 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.adapter.gcp.layout;
import java.io.File;
import org.springframework.boot.loader.tools.Layout;
import org.springframework.boot.loader.tools.LayoutFactory;
/**
* Factory boilerplate class that constructs {@link GcfJarLayout}.
*
* @author Ray Tsang
* @author Daniel Zou
*/
public class GcfJarLayoutFactory implements LayoutFactory {
@Override
public Layout getLayout(File source) {
return new GcfJarLayout();
}
}

View File

@@ -0,0 +1,2 @@
org.springframework.boot.loader.tools.LayoutFactory=\
org.springframework.cloud.function.adapter.gcp.layout.GcfJarLayoutFactory