@Override
  public void removeClaimFromApplication(Application application, RequestClaim claim) {
    ApplicationEntity applicationEntity = null;
    if (application.getId() != 0) {
      applicationEntity = em.find(ApplicationEntity.class, application.getId());
    } else {
      Query query = null;
      query = em.createQuery("select a from Application a where a.realm=:realm");
      query.setParameter("realm", application.getRealm());

      applicationEntity = (ApplicationEntity) query.getSingleResult();
    }

    ApplicationClaimEntity foundEntity = null;
    for (ApplicationClaimEntity acm : applicationEntity.getRequestedClaims()) {
      if (claim.getClaimType().toString().equals(acm.getClaim().getClaimType())) {
        foundEntity = acm;
        break;
      }
    }
    if (foundEntity == null) {
      throw new EntityNotFoundException("ApplicationClaimEntity not found");
    }

    applicationEntity.getRequestedClaims().remove(foundEntity);
  }
  @Override
  public Application addApplication(Application application) {
    ApplicationEntity entity = new ApplicationEntity();

    domain2entity(application, entity);
    em.persist(entity);

    LOG.debug("Application '{}' added", application.getRealm());
    return entity2domain(entity, Arrays.asList("all"));
  }
  public static void domain2entity(Application application, ApplicationEntity entity) {
    // The ID must not be updated if the entity has got an id already (update case)
    if (application.getId() > 0) {
      entity.setId(application.getId());
    }

    entity.setEncryptionCertificate(application.getEncryptionCertificate());
    entity.setLifeTime(application.getLifeTime());
    entity.setProtocol(application.getProtocol());
    entity.setRealm(application.getRealm());
    entity.setRole(application.getRole());
    entity.setServiceDescription(application.getServiceDescription());
    entity.setServiceDisplayName(application.getServiceDisplayName());
    entity.setTokenType(application.getTokenType());
    entity.setPolicyNamespace(application.getPolicyNamespace());
    entity.setPassiveRequestorEndpoint(application.getPassiveRequestorEndpoint());
  }
  @Override
  public void addClaimToApplication(Application application, RequestClaim claim) {
    ApplicationEntity applicationEntity = null;
    if (application.getId() != 0) {
      applicationEntity = em.find(ApplicationEntity.class, application.getId());
    } else {
      Query query = null;
      query = em.createQuery("select a from Application a where a.realm=:realm");
      query.setParameter("realm", application.getRealm());

      applicationEntity = (ApplicationEntity) query.getSingleResult();
    }

    Claim c = claimDAO.getClaim(claim.getClaimType().toString());
    ClaimEntity claimEntity = em.find(ClaimEntity.class, c.getId());

    ApplicationClaimEntity appClaimEntity = new ApplicationClaimEntity();
    appClaimEntity.setClaim(claimEntity);
    appClaimEntity.setApplication(applicationEntity);
    appClaimEntity.setOptional(claim.isOptional());

    applicationEntity.getRequestedClaims().add(appClaimEntity);
  }