Java tutorial
/* * Copyright (C) 2015 Orange * * This software is distributed under the terms and conditions of the 'GNU GENERAL PUBLIC LICENSE * Version 2' license which can be found in the file 'LICENSE.txt' in this package distribution or * at 'http://www.gnu.org/licenses/gpl-2.0-standalone.html'. */ package com.orange.cepheus.broker.persistence; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.orange.cepheus.broker.exception.SubscriptionPersistenceException; import com.orange.cepheus.broker.model.Subscription; import com.orange.ngsi.model.SubscribeContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import javax.annotation.PostConstruct; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Repository for Subscriptions */ @Repository public class SubscriptionsRepository { private static Logger logger = LoggerFactory.getLogger(SubscriptionsRepository.class); @Autowired protected JdbcTemplate jdbcTemplate; @Autowired private ObjectMapper mapper; @PostConstruct protected void createTableOnStartup() { jdbcTemplate.execute( "create table if not exists t_subscriptions (id varchar primary key, expirationDate varchar not null, subscribeContext varchar not null)"); jdbcTemplate.execute("create unique index if not exists index_subscriptionId on t_subscriptions (id)"); } /** * Save a subscription. * @param subscription * @throws SubscriptionPersistenceException */ public void saveSubscription(Subscription subscription) throws SubscriptionPersistenceException { try { //Mapping from model to database model ObjectWriter writer = mapper.writer(); String susbcribeContextString = writer.writeValueAsString(subscription.getSubscribeContext()); String expirationDate = subscription.getExpirationDate().toString(); //insert into database jdbcTemplate.update("insert into t_subscriptions(id,expirationDate,subscribeContext) values(?,?,?)", subscription.getSubscriptionId(), expirationDate, susbcribeContextString); } catch (Exception e) { throw new SubscriptionPersistenceException(e); } } /** * Save a subscription updated * @param subscription * @throws SubscriptionPersistenceException */ public void updateSubscription(Subscription subscription) throws SubscriptionPersistenceException { try { //serialization ObjectWriter writer = mapper.writer(); String susbcribeContextString = writer.writeValueAsString(subscription.getSubscribeContext()); String expirationDate = subscription.getExpirationDate().toString(); jdbcTemplate.update("update t_subscriptions set expirationDate=? , subscribeContext=? where id=?", expirationDate, susbcribeContextString, subscription.getSubscriptionId()); } catch (Exception e) { throw new SubscriptionPersistenceException(e); } } /** * Get all subscriptions saved * @return subscriptions map * @throws SubscriptionPersistenceException */ public Map<String, Subscription> getAllSubscriptions() throws SubscriptionPersistenceException { Map<String, Subscription> subscriptions = new ConcurrentHashMap<>(); try { List<Subscription> subscriptionList = jdbcTemplate.query( "select id, expirationDate, subscribeContext from t_subscriptions", (ResultSet rs, int rowNum) -> { Subscription subscription = new Subscription(); try { subscription.setSubscriptionId(rs.getString("id")); subscription.setExpirationDate(Instant.parse(rs.getString("expirationDate"))); subscription.setSubscribeContext( mapper.readValue(rs.getString("subscribeContext"), SubscribeContext.class)); } catch (IOException e) { throw new SQLException(e); } return subscription; }); subscriptionList .forEach(subscription -> subscriptions.put(subscription.getSubscriptionId(), subscription)); } catch (DataAccessException e) { throw new SubscriptionPersistenceException(e); } return subscriptions; } /** * Remove a subscription. * @param subscriptionId * @throws SubscriptionPersistenceException */ public void removeSubscription(String subscriptionId) throws SubscriptionPersistenceException { try { jdbcTemplate.update("delete from t_subscriptions where id=?", subscriptionId); } catch (DataAccessException e) { throw new SubscriptionPersistenceException(e); } } }