This is an old revision of the document!
Table of Contents
Google Cloud Platform
Goolge App Engine
Maven
Deploy the app to the Google server
mvn appengine:update
After deployment the app will be available under: PROJECTAME.appspot.com
Start local development server
mvn appengine:devserver
available under localhost:8080/SERVLET/PATH/FROM/WEB/XML
Stops the server
mvn appengine:devserver_stop
Project
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
Servlets
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>
Google Datastore
Datastore dependencies
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/datastore-api-tutorial
Datastore usage
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);
index
To query the DB an index for the queried Entity properties must be created. Here the properties are:
- imdbUrl
- created
The index is created in a index.yaml file, which is:
- put into the WEB-INF folder
- deployed together with the app
Example index.yaml
indexes: - kind: FilmData ancestor: no properties: - name: imdbUrl - name: created direction: asc
appengine-web.xml
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>
Logging
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.