jeudi 21 avril 2011

Manipulation de la Remote Api GAE avec Guice/Objectify

Avec la version 1.4.3 de app engine, arrive une api qui jusque là était disponible seulement en python : la remote api. Celle çi permet de se connecter de façon sécurisée au datastore afin d’y insérer des données par exemple.
La documentation, bien que courte, donne de bonnes explications sur la façon de mettre en place. Mais, c’est le cas simple... Si au sein de mon application app engine, j’ai mis en place Guice et Objectify, je me retrouve confronté à 2 problèmes :
1/ Pour fonctionner ma servlet doit être déclarée dans la configuration Guice.
2/ Je manipule des objets métier et non pas des Entity.

Imaginons je possède l'objet "métier" suivant :

public class Hello {
 
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Long id;
 
 private String message;
 private String name;
 
 public Hello(){
 }
 
 public Hello(String message, String name) {
  super();
  this.message = message;
  this.name = name;
 }
 
 // Getter & Setter/hascode/equals methods ...

}

Je vais devoir modifier mon GuiceServletConfig pour la mapper avec la servlet. Aussi une servlet déclarée doit Guice doit être un singleton.

public class GuiceServletConfig extends GuiceServletContextListener {

 @Override
 protected Injector getInjector() {
  return Guice.createInjector(new ServletModule() {
   @Override
   protected void configureServlets() {
    bind(RemoteApiServlet.class).in(Singleton.class);
    serve("/remote_api").with(RemoteApiServlet.class);
    // D'autres bindings ou serve ...
   }

  });

 }

}

Le 1er problème est ainsi résolu.
Il ne me reste plus qu'à transformer mes Hello en Entity. Une petite ballade dans le code source permet de trouver la solution.


public static Entity helloToEntity(Hello hello) {
 Objectify ofy = ObjectifyService.begin();
 EntityMetadata<Hello> metadata = factory.getMetadataForEntity(hello);
 return metadata.toEntity(hello, ofy);
}


Il ne reste plus qu'à écrire un petit batch d'alimentation :


public static void main(String[] args) throws IOException {
 

 RemoteApiOptions options = new RemoteApiOptions()
         .server("maSuperApplication.appspot.com", 443)
         .credentials("monEmailAMoi@gmail.com", "monMotDePasse");
 RemoteApiInstaller installer = new RemoteApiInstaller();
 installer.install(options);

List<Entity> hellos = Lists.newArrayList(helloToEntity(new Hello("Hello", "Nicolas")),
          helloToEntity(new Hello("Bonjour", "Vincent")),
          helloToEntity(new Hello("Salut", "Guillaume")),
          helloToEntity(new Hello("Enchanté", "M. Gendal")));

 try {
  DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
  for (Entity hello : hellos) {
   Key key = ds.put(hello);
   System.out.println("Hello key=" + key);
  }
 } finally {
  installer.uninstall();
 }
}


En console, nous obtiendrons :
Hello key=Hello(3001)
Hello key=Hello(4001)
Hello key=Hello(1002)
Hello key=Hello(5001)

Et dans l'interface web du datastore, nous voyons bien nos 4 Hellos :

Aucun commentaire:

Enregistrer un commentaire