package org.apereo.cas.ticket.registry.support.kryo.serial; import java.lang.reflect.Constructor; import java.security.PrivateKey; import java.security.PublicKey; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import org.apereo.cas.support.saml.authentication.principal.GoogleAccountsService; import org.apereo.cas.ticket.registry.support.kryo.FieldHelper; /** * Serializer for {@link GoogleAccountsService}. * * @author Marvin S. Addison * @since 3.0.0 */ public class GoogleAccountsServiceSerializer extends AbstractWebApplicationServiceSerializer<GoogleAccountsService> { private static final Constructor CONSTRUCTOR; private final PrivateKey privateKey; private final PublicKey publicKey; private final String alternateUsername; static { try { CONSTRUCTOR = GoogleAccountsService.class.getDeclaredConstructor( String.class, String.class, String.class, String.class, String.class, PrivateKey.class, PublicKey.class, String.class); CONSTRUCTOR.setAccessible(true); } catch (final NoSuchMethodException e) { throw new IllegalStateException("Expected constructor signature not found.", e); } } /** * Instantiates a new google accounts service serializer. * * @param helper the helper * @param publicKey the public key * @param privateKey the private key * @param alternateUsername the alternate username */ public GoogleAccountsServiceSerializer( final FieldHelper helper, final PublicKey publicKey, final PrivateKey privateKey, final String alternateUsername) { super(helper); this.publicKey = publicKey; this.privateKey = privateKey; this.alternateUsername = alternateUsername; } @Override public void write(final Kryo kryo, final Output output, final GoogleAccountsService service) { super.write(kryo, output, service); kryo.writeObject(output, this.fieldHelper.getFieldValue(service, "requestId")); kryo.writeObject(output, this.fieldHelper.getFieldValue(service, "relayState")); } @Override protected GoogleAccountsService createService(final Kryo kryo, final Input input, final String id, final String originalUrl, final String artifactId) { final String requestId = kryo.readObject(input, String.class); final String relayState = kryo.readObject(input, String.class); try { return (GoogleAccountsService) CONSTRUCTOR.newInstance( id, originalUrl, artifactId, relayState, requestId, this.privateKey, this.publicKey, this.alternateUsername); } catch (final Exception e) { throw new IllegalStateException("Error creating SamlService", e); } } }