===== 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 e.g. http://localhost:8080/rest/ == 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** query de.projectname.servlet.QueryDbExamplesServlet query /rest/query/* ==== Google Datastore ==== The documentation for the datastore can be found here: https://cloud.google.com/datastore/docs/how-to === Spring boots with datastore === 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 === Datastore dependencies === The maven dependencies are listed here com.google.cloud google-cloud-datastore 1.28.0 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. com.google.guava guava 23.0 === Enable APIs === Enable the APIs like "Google Cloud Datastore API", as stated in the BookShelf application https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/bookshelf === Enable Web Credentials === The web credentials must be enabled, so that one can reach the API from the URS like * http://PROJECTID.appspot.com * http://localhost:8080 How to do so is stated in the bookshelf example too: https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/bookshelf === 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 query = queryBuilder.build(); Iterator 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: projectiname 1 true === 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. ==== Run in Intellij Idea ==== To run a Google App Engine applicaiton locally - use the "Google Cloud Tools" plugin. {{https://lh3.googleusercontent.com/-e52Kv6jTYic/WxkCVjuO2iI/AAAAAAAAAKs/H6qhDysp7LA_6nr4B4NEQ1nEXuy_1YbBACHMYCw/s0/2018-06-07_12-00-58.png}} After that a new launch configuration will be created: {{https://lh3.googleusercontent.com/-ybUh61AVhvU/WxkCmUriifI/AAAAAAAAAK0/Kv-DZ1GFH_cSzMI4Ng0FAvIOvGZKpUutwCHMYCw/s0/2018-06-07_12-02-06.png}} === Importing a Gradle project to Idea === * Import from github, directly via the Idea, via "VCS > Checkout from Version COntrol" as stated here https://github.com/GoogleCloudPlatform/google-cloud-intellij/issues/2027 * add to Project Structure > Modules > youtube4kidz > youtube4kidz_main via "add" the item "Google App Engin Standard" if necessary * first build the project completele. Building is not part of the appengine-start process: build > rebuild project. Or you will receive a ClassNotFound / MethodNotFound * then start project via Run "Google AppEngine Dev" ==== gcloud ==== 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