/*
* JBoss, Home of Professional Open Source.
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.picketlink.identity.federation.core.wstrust.wrappers;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.picketlink.identity.federation.PicketLinkLogger;
import org.picketlink.identity.federation.PicketLinkLoggerFactory;
import org.picketlink.identity.federation.core.saml.v2.util.XMLTimeUtil;
import org.picketlink.identity.federation.ws.trust.LifetimeType;
import org.picketlink.identity.federation.ws.wss.utility.AttributedDateTime;
/**
* <p>
* This class represents a WS-Trust {@code Lifetime}. It wraps the JAXB {@code LifetimeType} and offer methods that allows for
* easy retrieval of the creation and expiration times as {@code XMLGregorianCalendar} and {@code GregorianCalendar} objects.
* </p>
*
* @author <a href="mailto:sguilhen@redhat.com">Stefan Guilhen</a>
*/
public class Lifetime {
private static final PicketLinkLogger logger = PicketLinkLoggerFactory.getLogger();
private final LifetimeType delegate;
private XMLGregorianCalendar created;
private XMLGregorianCalendar expires;
private DatatypeFactory factory;
/**
* <p>
* Creates an instance of {@code Lifetime} with the specified parameters.
* </p>
*
* @param created a {@code GregorianCalendar} representing the token creation time.
* @param expires a {@code GregorianCalendar} representing the token expiration time.
*/
public Lifetime(GregorianCalendar created, GregorianCalendar expires) {
try {
this.factory = XMLTimeUtil.newDatatypeFactory();
} catch (DatatypeConfigurationException dce) {
throw logger.wsTrustUnableToGetDataTypeFactory(dce);
}
// normalize the parameters (convert to UTC).
this.created = factory.newXMLGregorianCalendar(created).normalize();
this.expires = factory.newXMLGregorianCalendar(expires).normalize();
// set the delegate fields.
this.delegate = new LifetimeType();
AttributedDateTime dateTime = new AttributedDateTime();
dateTime.setValue(this.created.toXMLFormat());
this.delegate.setCreated(dateTime);
dateTime = new AttributedDateTime();
dateTime.setValue(this.expires.toXMLFormat());
this.delegate.setExpires(dateTime);
}
/**
* <p>
* Creates a {@code Lifetime} instance using the specified {@code LifetimeType}.
* </p>
*
* @param lifetime a reference to the {@code LifetimeType} instance that contains the information used in the
* {@code Lifetime} construction.
*/
public Lifetime(LifetimeType lifetime) {
if (lifetime == null)
throw logger.nullArgumentError("LifetimeType");
try {
this.factory = XMLTimeUtil.newDatatypeFactory();
} catch (DatatypeConfigurationException dce) {
throw logger.wsTrustUnableToGetDataTypeFactory(dce);
}
this.delegate = lifetime;
// construct the created and expires instances from the lifetime object.
this.created = factory.newXMLGregorianCalendar(lifetime.getCreated().getValue());
this.expires = factory.newXMLGregorianCalendar(lifetime.getExpires().getValue());
// check if the supplied lifetime needs to be normalized.
if (this.created.getTimezone() != 0) {
this.created = this.created.normalize();
this.delegate.getCreated().setValue(this.created.toXMLFormat());
}
if (this.expires.getTimezone() != 0) {
this.expires = this.expires.normalize();
this.delegate.getExpires().setValue(this.expires.toXMLFormat());
}
}
/**
* <p>
* Obtains the creation time as a {@code XMLGregorianCalendar}.
* </p>
*
* @return a reference to the {@code XMLGregorianCalendar} that represents the creation time.
*/
public XMLGregorianCalendar getCreated() {
return this.created;
}
/**
* <p>
* Sets the creation time.
* </p>
*
* @param created a reference to the {@code XMLGregorianCalendar} that represents the creation time to be set.
*/
public void setCreated(XMLGregorianCalendar created) {
this.created = created.normalize();
this.delegate.getCreated().setValue(this.created.toXMLFormat());
}
/**
* <p>
* Obtains the creation time as a {@code GregorianCalendar}.
* </p>
*
* @return a reference to the {@code GregorianCalendar} that represents the creation time.
*/
public GregorianCalendar getCreatedCalendar() {
return this.created.toGregorianCalendar();
}
/**
* <p>
* Sets the creation time.
* </p>
*
* @param created a reference to the {@code GregorianCalendar} that represents the creation time to be set.
*/
public void setCreatedCalendar(GregorianCalendar created) {
this.setCreated(this.factory.newXMLGregorianCalendar(created));
}
/**
* <p>
* Obtains the expiration time as a {@code XMLGregorianCalendar}.
* </p>
*
* @return a reference to the {@code XMLGregorianCalendar} that represents the expiration time.
*/
public XMLGregorianCalendar getExpires() {
return this.expires;
}
/**
* <p>
* Sets the expiration time.
* </p>
*
* @param expires a reference to the {@code XMLGregorianCalendar} that represents the expiration time.
*/
public void setExpires(XMLGregorianCalendar expires) {
this.expires = expires.normalize();
this.delegate.getExpires().setValue(this.expires.toXMLFormat());
}
/**
* <p>
* Obtains the expiration time as a {@code GregorianCalendar}.
* </p>
*
* @return a reference to the {@code GregorianCalendar} that represents the expiration time.
*/
public GregorianCalendar getExpiresCalendar() {
return this.expires.toGregorianCalendar();
}
/**
* <p>
* Sets the expiration time.
* </p>
*
* @param expires a reference to the {@code GregorianCalendar} that represents the expiration time.
*/
public void setExpiresCalendar(GregorianCalendar expires) {
this.setExpires(this.factory.newXMLGregorianCalendar(expires));
}
/**
* <p>
* Obtains a reference to the {@code LifetimeType} delegate.
* </p>
*
* @return a reference to the delegate instance.
*/
public LifetimeType getDelegate() {
return this.delegate;
}
}