@Override public AccountStatus getAccountStatus(String username) { Mailbox mailbox = new Mailbox(username); logger.debug("Validating " + mailbox.getId()); return AccountStatus.ACTIVE; }
@Override public Message getParsed(final Mailbox mailbox, final UUID messageId) { return MessagePersistence.fetch(mailbox.getId(), messageId, true); }
@Override public List<UUID> getMessageIds(final Mailbox mailbox, final int labelId, final UUID start, final int count, final boolean reverse) { return LabelIndexPersistence.get(mailbox.getId(), labelId, start, count, reverse); }
@Override public Mailbox authenticate(String username, String password) { Mailbox mailbox = new Mailbox(username); logger.debug("Authenticated " + mailbox.getId()); return mailbox; }
public MessageAggregator(final Mailbox mailbox, final List<UUID> messageIds) { // get message headers messages = MessagePersistence.fetch(mailbox.getId(), messageIds, false); invalidMessageIds = new HashSet<UUID>(messageIds); invalidMessageIds.removeAll(this.getValidMessageIds()); }
@Override public String getBlobName(BlobNameBuilder builder) { Assert.notNull(builder.messageId, "message id cannot be null"); Assert.notNull(builder.mailbox, "mailbox cannot be null"); return builder.messageId.toString() + ":" + builder.mailbox.getId(); }
@Override public Map<UUID, Message> getMessageIdsWithMetadata(final Mailbox mailbox, final int labelId, final UUID start, final int count, boolean reverse, boolean includeBody) { List<UUID> messageIds = getMessageIds(mailbox, labelId, start, count, reverse); return MessagePersistence.fetch(mailbox.getId(), messageIds, includeBody); }
@Override public String getBlobName(BlobNameBuilder builder) { Assert.notNull(builder.messageId, "message id cannot be null"); Assert.notNull(builder.mailbox, "mailbox cannot be null"); String uniqId = new StringBuilder(builder.mailbox.getId()).append(":").append(builder.messageId).toString(); String path = "00" + File.separator + "00"; MessageDigest md5; try { md5 = MessageDigest.getInstance("MD5"); final byte[] digestBytes = md5.digest(uniqId.getBytes("UTF-8")); path = new StringBuilder(byteToHex(digestBytes[0])) .append(File.separator) .append(byteToHex(digestBytes[1])) .toString(); } catch (NoSuchAlgorithmException e) { logger.error("Can't calculate digest, fallback to the default path '00/00': ", e); } catch (UnsupportedEncodingException e) { logger.error("Can't calculate digest, fallback to the default path '00/00': ", e); } return path + File.separator + uniqId; }
@Override public Map<Integer, String> getAll(final Mailbox mailbox) { return AccountPersistence.getLabels(mailbox.getId()).getNameMap(); }
/** * Initialize new account * * @param account * @return */ @POST @Produces(MediaType.APPLICATION_JSON) public Response add( @PathParam("user") final String user, @PathParam("domain") final String domain) { Mailbox mailbox = new Mailbox(user, domain); try { accountDAO.add(mailbox); } catch (IllegalArgumentException iae) { throw new BadRequestException(iae.getMessage()); } catch (IOException e) { logger.error("Account initialization failed: {}", mailbox.getId()); throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); } URI messageUri = uriInfo.getAbsolutePathBuilder().path("mailbox").build(); return Response.created(messageUri).entity(JSONResponse.OK).build(); }
new Object[] { mailbox.getId(), labelId, e.getMessage() }); throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
purgeIndex = PurgeIndexPersistence.get(mailbox.getId(), age, readBatchSize); MessagePersistence.fetch(mailbox.getId(), purgeIndex.values(), false); MessagePersistence.deleteMessage(mutator, mailbox.getId(), purgeIndex.values()); PurgeIndexPersistence.remove(mutator, mailbox.getId(), purgeIndex.keySet());
@Override public LabelMap getAllWithMetadata(final Mailbox mailbox) throws IOException { // get labels LabelMap labels = AccountPersistence.getLabels(mailbox.getId()); // set labels' counters Map<Integer, LabelCounters> counters = LabelCounterPersistence.getAll(mailbox.getId()); for (int labelId : counters.keySet()) { if (labels.containsId(labelId) && counters.containsKey(labelId)) { labels.get(labelId).setCounters(counters.get(labelId)); } else if (labels.containsId(labelId) && !counters.containsKey(labelId)) { // assume zeros for all counters if not yet initialised labels.get(labelId).setCounters(new LabelCounters()); } else if (!labels.containsId(labelId) && counters.containsKey(labelId)) { logger.warn("Found counters for label {}/{}, but label does not exist.", mailbox.getId(), labelId); } } return labels; }
@Override public BlobDataSource getRaw(final Mailbox mailbox, final UUID messageId) throws IOException { Message metadata = MessagePersistence.fetch(mailbox.getId(), messageId, false); return blobStorage.read(metadata.getLocation()); }
messageIds = LabelIndexPersistence.get(mailbox.getId(), ReservedLabels.ALL_MAILS.getId(), start, BatchConstants.BATCH_READS, true); MessagePersistence.fetch(mailbox.getId(), messageIds, false); MessagePersistence.deleteAllMessages(m, mailbox.getId()); LabelIndexPersistence.deleteIndexes(m, mailbox.getId()); LabelCounterPersistence.deleteAll(m, mailbox.getId()); AccountPersistence.delete(m, mailbox.getId());
@Override public void setCounters(Mailbox mailbox, LabelMap newCounters) { Map<Integer, LabelCounters> existingCounters = LabelCounterPersistence.getAll(mailbox.getId()); // begin batch operation Mutator<String> m = createMutator(keyspace, strSe); // update with the new counter values for (Label label : newCounters.values()) { int labelId = label.getId(); LabelCounters diff = new LabelCounters(label.getCounters()); if (existingCounters.containsKey(labelId)) { diff.add(existingCounters.get(labelId).getInverse()); } logger.debug( "Recalculated counters for label {}:\n\tCurrent: {}\n\tCalculated: {}\n\tDiff: {}", new Object[] { labelId, existingCounters.get(labelId), label.getCounters(), diff }); LabelCounterPersistence.add(m, mailbox.getId(), labelId, diff); } // reset non-existing counters for (int labelId : existingCounters.keySet()) { if (!newCounters.containsId(labelId)) { LabelCounterPersistence.subtract( m, mailbox.getId(), labelId, existingCounters.get(labelId)); } } m.execute(); }
PurgeIndexPersistence.add(mutator, mailbox.getId(), validMessageIds); LabelIndexPersistence.remove(mutator, mailbox.getId(), validMessageIds, labels.getIds()); LabelCounterPersistence.subtract(mutator, mailbox.getId(), labelId, labels.get(labelId).getCounters()); LabelMap allLabels = AccountPersistence.getLabels(mailbox.getId()); LabelIndexPersistence.remove(mutator, mailbox.getId(), invalidMessageIds, allLabels.getIds());
@Override public int add(Mailbox mailbox, Label label) { // get all existing labels LabelMap existingLabels = AccountPersistence.getLabels(mailbox.getId()); LabelUtils.validateLabelName(label.getName(), existingLabels); try { // generate new label id int labelId = LabelUtils.getNewLabelId(existingLabels.getIds()); label.setId(labelId); } catch (IllegalLabelException ile) { // log and rethrow logger.warn("{} reached max random label id attempts with {} labels", mailbox, existingLabels.size()); throw ile; } // begin batch operation Mutator<String> mutator = createMutator(keyspace, strSe); // add new label AccountPersistence.putLabel(mutator, mailbox.getId(), label); // commit batch operation mutator.execute(); return label.getId(); }
@Override public void update(Mailbox mailbox, Label label) throws IOException { // get all existing labels LabelMap existingLabels = AccountPersistence.getLabels(mailbox.getId()); // validate only if name is changed (skips letter case changes) if (label.getName() != null && !existingLabels.containsName(label.getName())) { LabelUtils.validateLabelName(label.getName(), existingLabels); } // check if label id reserved if (ReservedLabels.contains(label.getId())) { throw new ExistingLabelException("This is reserved label and can't be modified"); } // check if label id exists if (!existingLabels.containsId(label.getId())) { throw new IllegalLabelException("Label does not exist"); } // begin batch operation Mutator<String> mutator = createMutator(keyspace, strSe); // set new name AccountPersistence.putLabel(mutator, mailbox.getId(), label); // commit batch operation mutator.execute(); }