/* * See LICENSE for licensing and NOTICE for copyright. */ package net.shibboleth.idp.cas.ticket.serialization; import java.io.IOException; import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.shibboleth.idp.cas.ticket.Ticket; import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import org.opensaml.storage.StorageSerializer; /** * Base class for ticket serializers that use a simple field-delimited serialization strategy. * Tickets are expected to be stored using the ticket ID as a key, so the ticket ID is not contained as part * of the serialized form. * * @author Marvin S. Addison */ public abstract class AbstractTicketSerializer<T extends Ticket> implements StorageSerializer<T> { /** Field delimiter. */ private static final String DELIMITER = "::"; /** Pattern used to extract fields from delimited form. */ private static final Pattern SPLIT_PATTERN = Pattern.compile(DELIMITER); @Override public void initialize() throws ComponentInitializationException {} @Override public boolean isInitialized() { return true; } @Override @Nonnull public String serialize(@Nonnull final T ticket) throws IOException { final String[] fields = extractFields(ticket); if (fields.length == 0) { throw new IllegalStateException("Ticket has no fields to serialize."); } final StringBuilder sb = new StringBuilder(fields[0]); for (int i = 1; i < fields.length; i++) { sb.append(DELIMITER).append(fields[i]); } return sb.toString(); } @Override @Nonnull public T deserialize( final long version, @Nonnull @NotEmpty final String context, @Nonnull @NotEmpty final String key, @Nonnull @NotEmpty final String value, @Nullable final Long expiration) throws IOException { return createTicket(key, SPLIT_PATTERN.split(value)); } @NotEmpty protected abstract String[] extractFields(@Nonnull T ticket); @Nonnull protected abstract T createTicket(@Nonnull String id, @NotEmpty String[] fields); }