May 10, 2013 - Cloud Endpoints + JPA: failure in checking if entity exists

Comments

After defining some entity classes to be used by JPA for persisting data in Google App Engine I auto-generated some Cloud Endpoint classes (for Google Cloud Endpoints), via the Google App Engine SDK, to be used in an Android application. However, it turned out to be a sad out-of-the-box experience due to new entity instances having a null ID.

Before proceeding, here's the testing entity code (excluding imports):

@Entity
public class Testo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long ID;
private String description;

public Long getID() {
return ID;
}
public void setID(Long ID) {
this.ID = ID;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

A really simple one.

To test the entity and the endpoint classes, I auto-generated the Cloud Endpoint Client Library and made use of it in an Android testing application (Endpoints Backend enabled). The application would only create a new entity, set its attributes to some value, and then request to insert that entity into the datastore, using Google Cloud Endpoints in the middle.

After testing it up, though, I got a big stack trace from the Google development server due to a NullPointerException that occurred when checking if that entity existed in the datastore.

The exception referred to the fact that no entity ID was set. So, if new entities don't have an ID, how can they be checked for existence requiring a valid ID?

The point of failure
(at least in my specific case)

The endpoint class TestoEndpoint.java, auto-generated method: containsTesto(Testo testo):
private boolean containsTesto(Testo testo) {
EntityManager mgr = getEntityManager();
boolean contains = true;
try {
Testo item = mgr.find(Testo.class, testo.getID());
if (item == null) {
contains = false;
}
} finally {
mgr.close();
}
return contains;
}

This method makes use of the Entity Manager's find() method, which in this context takes a null ID and crashes, not even being able to tell if the datastore contains or not that entity.

What I changed

To work around this annoying problem I added a null check for the entity argument:

private boolean containsTesto(Testo testo) {
EntityManager mgr = getEntityManager();
boolean contains = true;
try {
// If no ID was set, the entity doesn't exist yet.
if(testo.getID() == null)
return false;

Testo item = mgr.find(Testo.class, testo.getID());
if (item == null) {
contains = false;
}
} finally {
mgr.close();
}
return contains;
}

Some links:

May 5, 2013 - Tabata Trainer - Android App

Comments

Today I released my first Android application, Tabata Trainer.
Developing this app has made learning Android development a very pleasant experience, while at the same time adding something new to the mobile ecosystem.

This app aims at providing a way for Tabata practitioners and general sports fans to do their exercises in an appropriate and automated timely manner. It also provides the ability for users to define/plan their own training exercises and times. More features are planned for next releases!

Tabata is a form of high-intensity interval training (HIIT) based on a study by Izumi Tabata. It initially consisted of one exercise carried out intensively during 20 seconds with 10 seconds of rest after it. This exercise was looped 8 times, giving a total of 4 minutes.

Summary of features:
  • Tabata timer;
  • Start/pause/stop controls;
  • Definition of rest and exercise time;
  • Definition of the number of rounds;
  • Definition of any number of exercises, with textual descriptions, that form a custom training/workout;
  • Text-to-speech engine to read exercises' names to guide users throughout their workouts;
  • Sound alerts: Resting; Exercising; Darth Vader breath stimulator; Workout completed;
  • English (UK) and Portuguese (Portugal) text languages supported;
  • Text-to-speech in Portuguese is not available due to lack of support from Android;
  • No ads and no special access permissions required;
  • Sound, speech and display sleeping mode configurable;
  • Ability to share current workout;
  • Horizontal layout and Tablet support;
  • Settings;
  • Customizable sounds;
  • Ability to disable the background gradient.
[the list of features was last updated on November 2013 and is now outdated, please check the changelog.]

    If you are willing to do some working out with this application, head over to the Tabata Trainer's Play Store page or Amazon Appstore and give it a try!

    Tabata Trainer has been mentioned in the following websites:

    May 5, 2013 - Tabata Trainer - Aplicação Android

    Comments

    Hoje lancei a minha primeira aplicação Android, Tabata Trainer.
    Desenvolver esta app tornou a minha aprendizagem de desenvolvimento Android numa experiência muito agradável, ao mesmo tempo dando algo de novo ao ecossistema de aplicações móvel.

    A app permite aos praticantes de Tabata e desportistas em geral fazer os seus exercícios cronometradamente, de forma apropriada e automática. Fornece ainda a possibilidade dos utilizadores definirem/planearem os seus próprios exercícios e tempos de treino. Mais funcionalidades estão previstas para esta aplicação!
    Tabata é um tipo de treino de alta intensidade de intervalos de tempo fixos (HIIT) e foi baseado num estudo de Izumi Tabata. Inicialmente consistia num exercício que era executado de forma intensiva durante 20 segundos com 10 segundos de descanso após. Este exercício era repetido 8 vezes, dando um total de 4 minutos de treino.

    Resumo das funcionalidades:
    • Temporizador para Tabata;
    • Controlos de começo/pausa/parar;
    • Definição de tempos;
    • Definição do número de rondas;
    • Definição de exercícios, com descrições textuais, que formam um treino personalizado pelo utilizador;
    • Motor texto-para-voz para ler os nomes dos exercícios e guiar o utilizador no seu treino;
    • Alertas sonoros: Descansar; Exercitar; Estimulador de respiração; Treino terminado;
    • Línguas suportadas em texto: Português (Portugal) e Inglês (Reino Unido);
    • Texto-para-voz em Português não está disponível devido à falta de suporte por parte do Android;
    • Sem publicidade e sem permissões especiais de acesso necessárias;
    • Som, voz, e permanência do ecrã configuráveis;
    • Capacidade de partilhar o treino atual;
    • Layout horizontal e suporte para Tablet;
    • Definições;
    • Sons personalizáveis;
    • Capacidade de desativar o gradiente de fundo.
    [a lista de funcionalidades foi pela última vez alterada em novembro de 2013 e está agora desatualizada, por favor ver o registo de alterações.]

      Se pretende exercitar com esta aplicação, vá até à página da Play Store do Tabata Trainer ou da Amazon Appstore e experimente!

      O Tabata Trainer já foi referido nos seguintes websites: