package org.apereo.cas.util;
import com.google.common.base.Throwables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.VfsResource;
import java.io.File;
import java.net.URL;
import java.time.ZonedDateTime;
/**
* Class that exposes the CAS version. Fetches the "Implementation-Version"
* manifest attribute from the jar file.
*
* @author Dmitriy Kopylenko
* @since 3.0.0
*/
public class CasVersion {
private static final Logger LOGGER = LoggerFactory.getLogger(CasVersion.class);
/**
* Private constructor for CasVersion. You should not be able to instantiate
* this class.
*/
protected CasVersion() {
// this class is not instantiable
}
/**
* @return Return the full CAS version string.
* @see java.lang.Package#getImplementationVersion
*/
public static String getVersion() {
return CasVersion.class.getPackage().getImplementationVersion();
}
/**
* Gets specification version from the manifest package.
*
* @return the specification version
*/
public static String getSpecificationVersion() {
return CasVersion.class.getPackage().getSpecificationVersion();
}
/**
* Gets last modified date/time for the module.
* @return the date/time
*/
public static ZonedDateTime getDateTime() {
try {
final Class clazz = CasVersion.class;
final URL resource = clazz.getResource(clazz.getSimpleName() + ".class");
if ("file".equals(resource.getProtocol())) {
return DateTimeUtils.zonedDateTimeOf(new File(resource.toURI()).lastModified());
}
if ("jar".equals(resource.getProtocol())) {
final String path = resource.getPath();
final File file = new File(path.substring(5, path.indexOf('!')));
return DateTimeUtils.zonedDateTimeOf(file.lastModified());
}
if ("vfs".equals(resource.getProtocol())) {
final File file = new VfsResource(resource.openConnection().getContent()).getFile();
return DateTimeUtils.zonedDateTimeOf(file.lastModified());
}
LOGGER.warn("Unhandled url protocol: [{}] resource: [{}]", resource.getProtocol(), resource);
return ZonedDateTime.now();
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
}