Author Picture By Brad Abrams, Google Cloud Platform Team
(Cross-posted with the Google App Engine Blog)
Today we are announcing two new preview features: App Engine Java 7 runtime support and Google Cloud Endpoints.   Preview features are ‘experimental’ features on a path towards general availability.


Java 7 Runtime Support for App Engine

The App Engine Java 7 runtime allows App Engine developers to keep pace with innovations in the Java language and runtime. It is important that you begin testing your applications with the new Java 7 runtime before the complete rollout in a few months.
Some of the language features you now have access to include:
invokedynamic support, which allows developers, tools providers, and language implementations to take advantage of a new bytecode, invokedynamic, to handle method invocations efficiently even when there is no static type information. For example:
  public static void invokeExample() {
    String s;
    MethodType mt; 
    MethodHandle mh;

    MethodHandles.Lookup lookup = MethodHandles.lookup();
    MethodType mt = MethodType.methodType(String.class, char.class,
                                          char.class);
    MethodHandle mh = lookup.findVirtual(String.class, "replace", mt);
    s = (String) mh.invokeExact("App Engine Java 6 runtime",'6','7');
    System.out.println(s);
  }
Try-with-resources, which helps avoid memory leaks and related bugs by automatically closing resources that are used in a try-catch statement.
  public static void viewTable(Connection con, String query) throws SQLException {

   try (
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)
) {
      while (rs.next()) {
      // process results
      //
      }
   } catch (SQLException e) {
      // con resource is auto-closed, no need to do anything here!
      //
   }
}
Flexible Type Creation when using generics, enabling you to create parameterized types more succinctly. For example, you can write:
  Map<String, List<String>> myMap = new HashMap<>();
instead of:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
In addition to the language features listed above, the App Engine Java 7 runtime also includes:
  • Use of String class in Switch statements.
  • Expression of binary literals using simple prefixes 0b or 0B.
  • Single catch blocks that can handle multiple exceptions.
  • Simplified varargs method invocation.
Want to get started now? Download the latest App Engine Java SDK and then check out the docs here.


Cloud Endpoints Preview

Have you ever wanted a simple way to get a cloud backend for that Android or iPhone app you are working on?  Wish it was easier to expose RESTful APIs from your web application?  Google Cloud Endpoints simplifies building highly scalable and flexible backends for your web and mobile applications. Use Cloud Endpoints to store application data in the cloud that spans both devices and users. You can now easily expose your own authenticated, reliable, REST-based APIs hosted from an App Engine application and consume them in your Android, iOS, or web clients. Deeply integrated authentication support allows your users to have a transparent yet secure experience accessing your services. You have access to strongly typed client libraries for your custom service optimized for Android and iOS.
To use Cloud Endpoints, you simply write a Java or Python class with methods you want to expose to web or mobile clients. You then annotate the methods with attributes that control exactly how they are represented in REST interfaces on the wire. Finally, use Cloud Endpoints to generate your strongly-typed client libraries for Android, iOS and a lightweight JavaScript library.
For example, you can create a simple class to list some important data:
  public class SuperHeroes {

    public List listSuperHeroes() {
  
  List list = new ArrayList();
  list.add(new SuperHero ("Champion of the Obvious", "Brad Abrams"));
  list.add(new SuperHero ("Mr. Justice", "Chris Ramsdale"));

  return list;

 }
}
Then, expose it over a standard REST interface with a simple attribute and a versioning pattern.
@Api(name = "superheroes", version = "v1")
public class SuperHeroesV1 {
 ...
}
Now you have a simple REST interface.
$ curl http://localhost:8888/_ah/api/superheroes/v1/superheroes
{
 "items": [
  {
   "knownAs" : "Champion of the Obvious",
   "realName" : "Brad Abrams"
  },
  {
   "knownAs" : "Mr. Justice",
   "realName" : "Chris Ramsdale"
  }
And you can make strongly typed calls from your Android clients:
Real result = superheroes.list().execute();
Or Objective-C iOS client:
GTLQuerySuperHeroesV1 *query = [GTLQuerySuperHeroesV1 queryForSuperHeroesList];
[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, 
GTLSuperHeroes *object, NSError *error) {
  NSArray *items = [object items];
}];
Or the web client in JavaScript:
// ...
var ROOT = 'https://' + window.location.host + '/_ah/api';
gapi.client.load('superheroes', 'v1',
                 loadSuperheroesCallback, ROOT);

// Get the list of superheroes
gapi.client.superheroes.superheroes.list().execute(function(resp) {
  displaySuperheroesList(resp);
});
Read the documentation for Java or Python to discover how you can build a simple tic-tac-toe game using Cloud Endpoints.
To get started with Cloud Endpoints, download the App Engine 1.7.5 SDK and the latest Google Plugin for Eclipse. Be sure to look at the docs and follow along in the discussion forums on Stack Overflow.
For more on using Cloud Endpoints with Python, check out +Danny Hermes and +Dan Holevoet on Google Developers Live.


Brad Abrams is a Product Manager on the Google Cloud Platform where he looks after the developer experience. Brad is currently learning to ride the unicycle, so far with no broken bones!
Posted by Ashleigh Rentz, Editor Emerita