@Override public void serialize(final AckMessage ackMessage, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeFieldName(AckMessage.MESSSAGE_TYPE_FIELD); jgen.writeString(ackMessage.getMessageType().toString().toLowerCase()); jgen.writeArrayFieldStart(AckMessage.UPDATES_FIELD); for (Ack ack : ackMessage.getAcks()) { jgen.writeStartObject(); jgen.writeFieldName("channelID"); jgen.writeString(ack.getChannelId()); jgen.writeFieldName(AckMessage.VERSION_FIELD); jgen.writeNumber(ack.getVersion()); jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }
@Override public Set<Ack> perform(final EntityManager em) { final List<String> channelIds = new ArrayList<String>(acked.size()); for (Ack ack : acked) { channelIds.add(ack.getChannelId()); } final Query delete = em.createQuery("DELETE from AckDTO c where c.channelId in (:channelIds)"); delete.setParameter("channelIds", channelIds); delete.executeUpdate(); final UserAgentDTO userAgent = em.find(UserAgentDTO.class, uaid); final Set<AckDTO> acks = userAgent.getAcks(); final Set<Ack> unacked = new HashSet<Ack>(acks.size()); for (AckDTO ackDto : acks) { unacked.add(new AckImpl(ackDto.getChannelId(), ackDto.getVersion())); } return unacked; } };
@Override public Notification handleNotification(final String endpointToken, final String body) throws ChannelNotFoundException { final Long version = Long.valueOf(VersionExtractor.extractVersion(body)); final String channelId = store.updateVersion(endpointToken, version); if (channelId == null) { throw new ChannelNotFoundException("Could not find channel for endpoint [" + endpointToken + "]", null); } final Ack ack = new AckImpl(channelId, version); final String uaid = store.saveUnacknowledged(channelId, ack.getVersion()); return new Notification(uaid, ack); }
@Override public Set<Ack> perform(final EntityManager em) { final List<String> channelIds = new ArrayList<String>(acked.size()); for (Ack ack : acked) { channelIds.add(ack.getChannelId()); } final Query delete = em.createQuery("DELETE from AckDTO c where c.channelId in (:channelIds)"); delete.setParameter("channelIds", channelIds); delete.executeUpdate(); final UserAgentDTO userAgent = em.find(UserAgentDTO.class, uaid); final Set<AckDTO> acks = userAgent.getAcks(); final Set<Ack> unacked = new HashSet<Ack>(acks.size()); for (AckDTO ackDto : acks) { unacked.add(new AckImpl(ackDto.getChannelId(), ackDto.getVersion())); } return unacked; } };
@Override public Notification handleNotification(final String endpointToken, final String body) throws ChannelNotFoundException { final Long version = Long.valueOf(VersionExtractor.extractVersion(body)); final String channelId = store.updateVersion(endpointToken, version); if (channelId == null) { throw new ChannelNotFoundException("Could not find channel for endpoint [" + endpointToken + "]", null); } final Ack ack = new AckImpl(channelId, version); final String uaid = store.saveUnacknowledged(channelId, ack.getVersion()); return new Notification(uaid, ack); }
@Override public void serialize(final NotificationMessage notification, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeFieldName(NotificationMessage.MESSSAGE_TYPE_FIELD); jgen.writeString(notification.getMessageType().toString().toLowerCase()); jgen.writeArrayFieldStart(NotificationMessage.UPDATES_FIELD); for (Ack ack : notification.getAcks()) { jgen.writeStartObject(); jgen.writeFieldName(RegisterMessage.CHANNEL_ID_FIELD); jgen.writeString(ack.getChannelId()); jgen.writeFieldName(NotificationMessage.VERSION_FIELD); jgen.writeNumber(ack.getVersion()); jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }
@Override public Set<Ack> removeAcknowledged(final String uaid, final Set<Ack> acks) { final Jedis jedis = jedisPool.getResource(); try { for (Ack ack : acks) { jedis.del(ackLookupKey(ack.getChannelId())); jedis.srem(acksLookupKey(uaid), ack.getChannelId()); } return getUnacknowledged(uaid); } finally { jedisPool.returnResource(jedis); } }
@Override public void serialize(final NotificationMessage notification, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeFieldName(NotificationMessage.MESSSAGE_TYPE_FIELD); jgen.writeString(notification.getMessageType().toString().toLowerCase()); jgen.writeArrayFieldStart(NotificationMessage.UPDATES_FIELD); for (Ack ack : notification.getAcks()) { jgen.writeStartObject(); jgen.writeFieldName(RegisterMessage.CHANNEL_ID_FIELD); jgen.writeString(ack.getChannelId()); jgen.writeFieldName(NotificationMessage.VERSION_FIELD); jgen.writeNumber(ack.getVersion()); jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }
@Override public Set<Ack> removeAcknowledged(final String uaid, final Set<Ack> acked) { final ViewResult viewResult = db.queryView(query(Views.UNACKS.viewName(), uaid)); final List<Row> rows = viewResult.getRows(); final Collection<BulkDeleteDocument> removals = new LinkedHashSet<BulkDeleteDocument>(); for (Iterator<Row> iter = rows.iterator(); iter.hasNext(); ) { final Row row = iter.next(); final JsonNode json = row.getValueAsNode(); final JsonNode doc = json.get(DOC_FIELD); final String channelId = doc.get(CHID_FIELD).asText(); for (Ack ack : acked) { if (ack.getChannelId().equals(channelId)) { removals.add(BulkDeleteDocument.of(doc)); iter.remove(); } } } db.executeBulk(removals); return rowsToAcks(rows); }
@Override public void serialize(final AckMessage ackMessage, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeFieldName(AckMessage.MESSSAGE_TYPE_FIELD); jgen.writeString(ackMessage.getMessageType().toString().toLowerCase()); jgen.writeArrayFieldStart(AckMessage.UPDATES_FIELD); for (Ack ack : ackMessage.getAcks()) { jgen.writeStartObject(); jgen.writeFieldName("channelID"); jgen.writeString(ack.getChannelId()); jgen.writeFieldName(AckMessage.VERSION_FIELD); jgen.writeNumber(ack.getVersion()); jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }
@Override public Set<Ack> removeAcknowledged(final String uaid, final Set<Ack> acked) { final ViewResult viewResult = db.queryView(query(Views.UNACKS.viewName(), uaid)); final List<Row> rows = viewResult.getRows(); final Collection<BulkDeleteDocument> removals = new LinkedHashSet<BulkDeleteDocument>(); for (Iterator<Row> iter = rows.iterator(); iter.hasNext(); ) { final Row row = iter.next(); final JsonNode json = row.getValueAsNode(); final JsonNode doc = json.get(DOC_FIELD); final String channelId = doc.get(CHID_FIELD).asText(); for (Ack ack : acked) { if (ack.getChannelId().equals(channelId)) { removals.add(BulkDeleteDocument.of(doc)); iter.remove(); } } } db.executeBulk(removals); return rowsToAcks(rows); }