/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jasig.cas.ticket.registry;
import java.util.List;
import java.util.Map;
import org.jasig.cas.authentication.Authentication;
import org.jasig.cas.authentication.principal.Service;
import org.jasig.cas.ticket.ExpirationPolicy;
import org.jasig.cas.ticket.ServiceTicket;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
/**
* Abstract Implementation that handles some of the commonalities between
* distributed ticket registries.
*
* @author Scott Battaglia
* @since 3.1
*/
public abstract class AbstractDistributedTicketRegistry extends AbstractTicketRegistry {
protected abstract void updateTicket(final Ticket ticket);
protected abstract boolean needsCallback();
protected final Ticket getProxiedTicketInstance(final Ticket ticket) {
if (ticket == null) {
return null;
}
if (ticket instanceof TicketGrantingTicket) {
return new TicketGrantingTicketDelegator(this, (TicketGrantingTicket) ticket, needsCallback());
}
return new ServiceTicketDelegator(this, (ServiceTicket) ticket, needsCallback());
}
private static class TicketDelegator<T extends Ticket> implements Ticket {
private static final long serialVersionUID = 1780193477774123440L;
private final AbstractDistributedTicketRegistry ticketRegistry;
private final T ticket;
private final boolean callback;
protected TicketDelegator(final AbstractDistributedTicketRegistry ticketRegistry,
final T ticket, final boolean callback) {
this.ticketRegistry = ticketRegistry;
this.ticket = ticket;
this.callback = callback;
}
protected void updateTicket() {
this.ticketRegistry.updateTicket(this.ticket);
}
protected T getTicket() {
return this.ticket;
}
public final String getId() {
return this.ticket.getId();
}
public final boolean isExpired() {
if (!callback) {
return this.ticket.isExpired();
}
final TicketGrantingTicket t = getGrantingTicket();
return this.ticket.isExpired() || (t != null && t.isExpired());
}
public final TicketGrantingTicket getGrantingTicket() {
final TicketGrantingTicket old = this.ticket.getGrantingTicket();
if (old == null || !callback) {
return old;
}
return this.ticketRegistry.getTicket(old.getId(), Ticket.class);
}
public final long getCreationTime() {
return this.ticket.getCreationTime();
}
public final int getCountOfUses() {
return this.ticket.getCountOfUses();
}
@Override
public int hashCode() {
return this.ticket.hashCode();
}
@Override
public boolean equals(final Object o) {
return this.ticket.equals(o);
}
}
private static final class ServiceTicketDelegator extends TicketDelegator<ServiceTicket>
implements ServiceTicket {
private static final long serialVersionUID = 8160636219307822967L;
protected ServiceTicketDelegator(final AbstractDistributedTicketRegistry ticketRegistry,
final ServiceTicket serviceTicket, final boolean callback) {
super(ticketRegistry, serviceTicket, callback);
}
@Override
public Service getService() {
return getTicket().getService();
}
@Override
public boolean isFromNewLogin() {
return getTicket().isFromNewLogin();
}
@Override
public boolean isValidFor(final Service service) {
final boolean b = this.getTicket().isValidFor(service);
updateTicket();
return b;
}
@Override
public TicketGrantingTicket grantTicketGrantingTicket(final String id,
final Authentication authentication, final ExpirationPolicy expirationPolicy) {
final TicketGrantingTicket t = this.getTicket().grantTicketGrantingTicket(id,
authentication, expirationPolicy);
updateTicket();
return t;
}
}
private static final class TicketGrantingTicketDelegator extends TicketDelegator<TicketGrantingTicket>
implements TicketGrantingTicket {
private static final long serialVersionUID = 5312560061970601497L;
protected TicketGrantingTicketDelegator(final AbstractDistributedTicketRegistry ticketRegistry,
final TicketGrantingTicket ticketGrantingTicket, final boolean callback) {
super(ticketRegistry, ticketGrantingTicket, callback);
}
@Override
public Authentication getAuthentication() {
return getTicket().getAuthentication();
}
@Override
public List<Authentication> getSupplementalAuthentications() {
return getTicket().getSupplementalAuthentications();
}
@Override
public ServiceTicket grantServiceTicket(final String id, final Service service,
final ExpirationPolicy expirationPolicy, final boolean credentialsProvided) {
final ServiceTicket t = this.getTicket().grantServiceTicket(id, service,
expirationPolicy, credentialsProvided);
updateTicket();
return t;
}
@Override
public void markTicketExpired() {
this.getTicket().markTicketExpired();
updateTicket();
}
@Override
public boolean isRoot() {
return getTicket().isRoot();
}
@Override
public TicketGrantingTicket getRoot() {
return getTicket().getRoot();
}
@Override
public List<Authentication> getChainedAuthentications() {
return getTicket().getChainedAuthentications();
}
@Override
public Map<String, Service> getServices() {
return this.getTicket().getServices();
}
@Override
public void removeAllServices() {
this.getTicket().removeAllServices();
}
}
}