Author: matthieu Date: Fri Dec 11 10:07:24 2015 New Revision: 1719317 URL: http://svn.apache.org/viewvc?rev=1719317&view=rev Log: JAMES-1644 simplier continuation token parsing
Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/ContinuationToken.java Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/ContinuationToken.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/ContinuationToken.java?rev=1719317&r1=1719316&r2=1719317&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/ContinuationToken.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/ContinuationToken.java Fri Dec 11 10:07:24 2015 @@ -19,31 +19,79 @@ package org.apache.james.jmap.model; +import java.time.DateTimeException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.LinkedList; +import java.util.NoSuchElementException; +import java.util.Objects; + +import org.apache.james.jmap.exceptions.MalformedContinuationTokenException; + import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.apache.james.jmap.exceptions.MalformedContinuationTokenException; - -import java.time.DateTimeException; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; public class ContinuationToken { public static final String SEPARATOR = "_"; + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String username; + private ZonedDateTime expirationDate; + private String signature; + + private Builder() {} + + public Builder username(String username) { + this.username = username; + return this; + } + + public Builder expirationDate(ZonedDateTime expirationDate) { + this.expirationDate = expirationDate; + return this; + } + + public Builder signature(String signature) { + this.signature = signature; + return this; + } + + public ContinuationToken build() { + return new ContinuationToken(username, expirationDate, signature); + } + } + + public static ContinuationToken fromString(String serializedToken) throws MalformedContinuationTokenException { + Preconditions.checkArgument(!Strings.isNullOrEmpty(serializedToken), "Serialized continuation token should not be null or empty"); + LinkedList<String> tokenParts = Lists.newLinkedList(Splitter.on(SEPARATOR).split(serializedToken)); + try { + return ContinuationToken.builder() + .signature(tokenParts.removeLast()) + .expirationDate(ZonedDateTime.parse(tokenParts.removeLast(), DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + .username(Joiner.on(SEPARATOR).join(tokenParts)) + .build(); + } catch (NoSuchElementException | IllegalArgumentException e) { + throw new MalformedContinuationTokenException("Token " + serializedToken + " does not have enough parts", e); + } catch(DateTimeException e) { + throw new MalformedContinuationTokenException("Token " + serializedToken + " as an incorrect date", e); + } + } + private final String username; private final ZonedDateTime expirationDate; private final String signature; public ContinuationToken(String username, ZonedDateTime expirationDate, String signature) { Preconditions.checkNotNull(username); + Preconditions.checkArgument(! username.isEmpty()); Preconditions.checkNotNull(expirationDate); Preconditions.checkNotNull(signature); this.username = username; @@ -51,30 +99,6 @@ public class ContinuationToken { this.signature = signature; } - public static ContinuationToken fromString(String serializedToken) throws MalformedContinuationTokenException { - Preconditions.checkArgument(!Strings.isNullOrEmpty(serializedToken), "Serialized continuation token should not be null or empty"); - ImmutableList<String> tokenParts = ImmutableList.copyOf(Splitter.on(SEPARATOR).split(serializedToken)); - if (tokenParts.size() < 3) { - throw new MalformedContinuationTokenException("Token " + serializedToken + " does not have enough parts"); - } - Iterator<String> tokenPartsReversedIterator = tokenParts.reverse().iterator(); - String signature = tokenPartsReversedIterator.next(); - String expirationDateString = tokenPartsReversedIterator.next(); - String username = retrieveUsername(tokenPartsReversedIterator); - try { - return new ContinuationToken(username, - ZonedDateTime.parse(expirationDateString, DateTimeFormatter.ISO_OFFSET_DATE_TIME), - signature); - } catch(DateTimeException e) { - throw new MalformedContinuationTokenException("Token " + serializedToken + " as an incorrect date", e); - } - } - - private static String retrieveUsername(Iterator<String> reversedIteratorOnUsernameParts) { - List<String> usernamePart = ImmutableList.copyOf(Lists.newArrayList(reversedIteratorOnUsernameParts)).reverse(); - return Joiner.on(SEPARATOR).join(usernamePart); - } - public String getUsername() { return username; } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org