All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.edu.icm.unity.saml.metadata.URIMetadataProvider Maven / Gradle / Ivy

/*
 * Copyright (c) 2014 ICM Uniwersytet Warszawski All rights reserved.
 * See LICENCE.txt file for licensing information.
 */
package pl.edu.icm.unity.saml.metadata;

import java.io.ByteArrayInputStream;
import java.net.URI;
import java.util.Date;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.Logger;

import pl.edu.icm.unity.base.file.FileData;
import pl.edu.icm.unity.base.utils.Log;
import pl.edu.icm.unity.engine.api.files.URIAccessService;
import pl.edu.icm.unity.engine.api.files.URIHelper;
import pl.edu.icm.unity.engine.api.utils.ExecutorsService;
import pl.edu.icm.unity.exceptions.EngineException;
import xmlbeans.org.oasis.saml2.metadata.EntityDescriptorDocument;

/**
 * Returns metadata read from uri - local file or remote url. The contents is parsed to check syntax. The uri content is automatically 
 * checked for updates.
 * @author  P.Piernik
 */
public class URIMetadataProvider implements MetadataProvider
{
	private Logger log = Log.getLogger(Log.U_SERVER_SAML, URIMetadataProvider.class);
	private Date lastModification;
	private URI uri;
	private URIAccessService uriAccessService;
	private FileData lastLoaded;
	private ScheduledExecutorService scheduler;
	private EntityDescriptorDocument document;
	private boolean stopped = false;
	
	private Runnable task;
	
	public URIMetadataProvider(ExecutorsService executorsService, URIAccessService uriAccessService, String uriRaw) throws EngineException
	{
		this.uriAccessService = uriAccessService;
		this.uri = URIHelper.parseURI(uriRaw);
		scheduler = executorsService.getScheduledService();
		load(uriAccessService.readURI(uri));
		
		task = () -> {
			reloadTask();
		};
		
		reschedule();
	}

	private synchronized void reloadTask()
	{
		try
		{
			FileData data = uriAccessService.readURI(uri);
			if (!lastLoaded.equalsContent(data))
			{
				log.info("Metadata file modification detected, reloading " + uri.toString());
				load(data);
			}			
		} catch (EngineException e)
		{
			log.error("Can not load the metadata from the configured uri " + uri.toString(), e);
		}
			
		reschedule();
	}
	
	private synchronized void load(FileData fileData) throws EngineException
	{
		try
		{
			document = EntityDescriptorDocument.Factory.parse(new ByteArrayInputStream(fileData.getContents()));
			lastLoaded = fileData;
			lastModification = new Date();
			log.trace("Load metadata from " + fileData.getName() + ":" + new String(fileData.getContents()));
		} catch (Exception e)
		{
			throw new EngineException("Metadata file can not be loaded", e);
		}
	}
	
	@Override
	public synchronized EntityDescriptorDocument getMetadata()
	{
		return document;
	}

	@Override
	public synchronized Date getLastmodification()
	{
		return lastModification;
	}

	@Override
	public synchronized void stop()
	{
		this.stopped = true;
	}
	
	private synchronized boolean isStopped()
	{
		return stopped ;
	}
	
	private void reschedule()
	{
		if (!isStopped())
			scheduler.schedule(task, 20, TimeUnit.SECONDS);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy