mvn appengine:update
After deployment the app will be available under: PROJECTAME.appspot.com
mvn appengine:devserver
available under localhost:8080/SERVLET/PATH/FROM/WEB/XML
mvn appengine:devserver_stop
Use the HelloWorld project from here: https://cloud.google.com/appengine/docs/java/
Create a Project on the “Google App Engine” using the online console: https://console.cloud.google.com/project
Inherit from HttpServlet. Registered in webapp/WEB-INF/web.xml
<servlet>
<servlet-name>query</servlet-name>
<servlet-class>de.projectname.servlet.QueryDbExamplesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>query</servlet-name>
<url-pattern>/rest/query/*</url-pattern>
</servlet-mapping>
The documentation for the datastore can be found here: https://cloud.google.com/datastore/docs/how-to
The Codelabs tutorial about creation of a new Spring boot application for app engine https://codelabs.developers.google.com/codelabs/cloud-app-engine-springboot/#0
The maven dependencies are listed here
<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-datastore</artifactId> <version>1.28.0</version> </dependency>
https://cloud.google.com/datastore/docs/reference/libraries
For the time of writing - it is important to reference Guava directly. Otherwise there will be MethodNotFOund exceptions, because wrong versions of Guava are referenced by transitive dependencies.
<!--
VERY IMPORTANT the right version of Guava must be referenced here.
Otherwise there will be a "NoSuchMethodException", because of transitive dependencies to older Guava libs.
-->
<dependency> <!-- Google Core Libraries for Java -->
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <!-- https://github.com/google/guava/wiki -->
<version>23.0</version>
</dependency>
Enable the APIs like “Google Cloud Datastore API”, as stated in the BookShelf application
https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/bookshelf
The web credentials must be enabled, so that one can reach the API from the URS like
How to do so is stated in the bookshelf example too: https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/bookshelf
Create a JSON key using the online console: https://console.cloud.google.com/project/_/apiui/credential
Download the key e.g. as projectiname-e1234567891.p12 and put it into your WEB-INF folder, e.g. into Keys subfolder:
WEB-INF/keys/projectiname-e1234567891.json
public static final String PROJECT_ID = "projectiname";
public static final String PATH_TO_JSON_KEY = "/WEB-INF/keys/projectiname-e1234567891.json";
public static Datastore initDataStore(GenericServlet servlet) {
try {
URL theurl = servlet.getServletContext().getResource(PATH_TO_JSON_KEY);
File file = new File(theurl.toURI());
FileInputStream fileInputStreamKey = new FileInputStream(file);
return DatastoreOptions.builder().projectId(PROJECT_ID)
.authCredentials(AuthCredentials.createForJson(fileInputStreamKey)).build().service();
} catch (URISyntaxException | IOException e1) {
return null;
}
}
Now you can query the DB:
Datastore datastore = initDataStore(servlet);
Builder queryBuilder = Query.entityQueryBuilder()
.kind(FILM_DATA_KEY);
// filter if imdbId is given
if(imdbId!=null && !imdbId.isEmpty()){
String imdbUrl = String.format("http://www.imdb.com/title/%s/", imdbId.replace("/", ""));
Filter imdbUrlFilter = PropertyFilter.eq("imdbUrl", imdbUrl);
queryBuilder.filter(imdbUrlFilter);
}
// sort
queryBuilder.orderBy(OrderBy.asc("created"));
Query<Entity> query = queryBuilder.build();
Iterator<Entity> iterator = datastore.run(query);
To query the DB an index for the queried Entity properties must be created. Here the properties are:
The index is created in a index.yaml file, which is:
Example index.yaml
indexes:
- kind: FilmData
ancestor: no
properties:
- name: imdbUrl
- name: created
direction: asc
Dexcribes the app:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <application>projectiname</application> <version>1</version> <threadsafe>true</threadsafe> <system-properties> <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" /> </system-properties> <static-files> <include path="/static/"> <http-header name="Access-Control-Allow-Origin" value="*" /> </include> </static-files> </appengine-web-app>
Described in a WEB-INF/logging.properties
# Set the default logging level for all loggers to WARNING .level = INFO
The logs are visible in the console window, where the server is running.
To run a Google App Engine applicaiton locally - use the “Google Cloud Tools” plugin.
The gcloud command-line interface is the primary CLI tool to create and manage Google Cloud resources.
Installation https://cloud.google.com/sdk/docs/quickstart#deb