// Path: src/main/java/net/nordu/mdx/scanner/MetadataChange.java
// public class MetadataChange implements Serializable {
// 	
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -6750830823194935907L;
// 
// 	private String id;
// 	private String reason;
// 	private Date timeStamp;
// 	private MetadataChangeType type;
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public void setId(String id) {
// 		this.id = id;
// 	}
// 	
// 	public String getReason() {
// 		return reason;
// 	}
// 	
// 	public void setReason(String reason) {
// 		this.reason = reason;
// 	}
// 	
// 	public Date getTimeStamp() {
// 		return timeStamp;
// 	}
// 	
// 	public void setTimeStamp(Date timeStamp) {
// 		this.timeStamp = timeStamp;
// 	}
// 	
// 	public MetadataChangeType getType() {
// 		return type;
// 	}
// 	
// 	public void setType(MetadataChangeType type) {
// 		this.type = type;
// 	}
// 	
// 	public String toString() {
// 		return "EntityDescriptor["+id+"] changed: "+timeStamp+", "+type+(reason == null ? "" : ": "+reason);
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type, String reason, Date timeStamp) {
// 		this.id = id;
// 		this.type = type;
// 		this.reason = reason;
// 		this.timeStamp = timeStamp;
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type, String reason) {
// 		this(id,type,reason,new Date());
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type) {
// 		this(id,type,null,new Date());
// 	}
// }
// 
// Path: src/main/java/net/nordu/mdx/scanner/MetadataChangeType.java
// public enum MetadataChangeType {
// 	ADD,
// 	REMOVE,
// 	MODIFY,
// 	CHATTR
// }
// 
// Path: src/main/java/net/nordu/mdx/store/MetadataStore.java
// public interface MetadataStore {
// 
// 	public List<String> listIDs() throws Exception;
// 	public boolean exists(String id) throws Exception;
// 	public EntityDescriptorType load(String id) throws Exception;
// 	public Calendar lastModified(String id);
// 	public TimerTask scanner();
// 	public void setContext(MetadataStoreContext params) throws Exception;
// 	
// }
// 
// Path: src/main/java/net/nordu/mdx/store/MetadataStoreContext.java
// public interface MetadataStoreContext extends Serializable {
// 
// 	public MetadataIndex getIndex();
// 	public MetadataChangeNotifier getChangeNotifier();
// 	
// }


import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimerTask;
import net.nordu.mdx.scanner.MetadataChange;
import net.nordu.mdx.scanner.MetadataChangeType;
import net.nordu.mdx.store.MetadataStore;
import net.nordu.mdx.store.MetadataStoreContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.oasis.saml.metadata.EntityDescriptorDocument;
import org.oasis.saml.metadata.EntityDescriptorType;
	private File _file(String id) {
		return new File(getDir(),id+".xml");
	}
	
	@Override
	public boolean exists(String id) throws Exception {
		File f = _file(id);
		return f.exists() && f.canRead();
	}

	@Override
	public Calendar lastModified(String id) {
		File f = _file(id);
		Calendar t = Calendar.getInstance();
		t.setTimeInMillis(f.lastModified());
		return t;
	}
	
	@Override
	public TimerTask scanner() {
		final MetadataStore store = this;
		
		return new TimerTask() {
			private final Log log = LogFactory.getLog(this.getClass());
			public void run() {
				try {
					for (String id: store.listIDs()) {
						if (!context.getIndex().exists(id))
							context.getChangeNotifier().notifyChange(new MetadataChange(id, MetadataChangeType.ADD));
						else if (store.lastModified(id).after(context.getIndex().lastModified(id)))
// Path: src/main/java/net/nordu/mdx/scanner/MetadataChange.java
// public class MetadataChange implements Serializable {
// 	
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = -6750830823194935907L;
// 
// 	private String id;
// 	private String reason;
// 	private Date timeStamp;
// 	private MetadataChangeType type;
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public void setId(String id) {
// 		this.id = id;
// 	}
// 	
// 	public String getReason() {
// 		return reason;
// 	}
// 	
// 	public void setReason(String reason) {
// 		this.reason = reason;
// 	}
// 	
// 	public Date getTimeStamp() {
// 		return timeStamp;
// 	}
// 	
// 	public void setTimeStamp(Date timeStamp) {
// 		this.timeStamp = timeStamp;
// 	}
// 	
// 	public MetadataChangeType getType() {
// 		return type;
// 	}
// 	
// 	public void setType(MetadataChangeType type) {
// 		this.type = type;
// 	}
// 	
// 	public String toString() {
// 		return "EntityDescriptor["+id+"] changed: "+timeStamp+", "+type+(reason == null ? "" : ": "+reason);
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type, String reason, Date timeStamp) {
// 		this.id = id;
// 		this.type = type;
// 		this.reason = reason;
// 		this.timeStamp = timeStamp;
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type, String reason) {
// 		this(id,type,reason,new Date());
// 	}
// 	
// 	public MetadataChange(String id, MetadataChangeType type) {
// 		this(id,type,null,new Date());
// 	}
// }
// 
// Path: src/main/java/net/nordu/mdx/scanner/MetadataChangeType.java
// public enum MetadataChangeType {
// 	ADD,
// 	REMOVE,
// 	MODIFY,
// 	CHATTR
// }
// 
// Path: src/main/java/net/nordu/mdx/store/MetadataStore.java
// public interface MetadataStore {
// 
// 	public List<String> listIDs() throws Exception;
// 	public boolean exists(String id) throws Exception;
// 	public EntityDescriptorType load(String id) throws Exception;
// 	public Calendar lastModified(String id);
// 	public TimerTask scanner();
// 	public void setContext(MetadataStoreContext params) throws Exception;
// 	
// }
// 
// Path: src/main/java/net/nordu/mdx/store/MetadataStoreContext.java
// public interface MetadataStoreContext extends Serializable {
// 
// 	public MetadataIndex getIndex();
// 	public MetadataChangeNotifier getChangeNotifier();
// 	
// }


// Path: src/main/java/net/nordu/mdx/store/fs/FileSystemMetadataStore.java
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimerTask;
import net.nordu.mdx.scanner.MetadataChange;
import net.nordu.mdx.scanner.MetadataChangeType;
import net.nordu.mdx.store.MetadataStore;
import net.nordu.mdx.store.MetadataStoreContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.oasis.saml.metadata.EntityDescriptorDocument;
import org.oasis.saml.metadata.EntityDescriptorType;

	private File _file(String id) {
		return new File(getDir(),id+".xml");
	}
	
	@Override
	public boolean exists(String id) throws Exception {
		File f = _file(id);
		return f.exists() && f.canRead();
	}

	@Override
	public Calendar lastModified(String id) {
		File f = _file(id);
		Calendar t = Calendar.getInstance();
		t.setTimeInMillis(f.lastModified());
		return t;
	}
	
	@Override
	public TimerTask scanner() {
		final MetadataStore store = this;
		
		return new TimerTask() {
			private final Log log = LogFactory.getLog(this.getClass());
			public void run() {
				try {
					for (String id: store.listIDs()) {
						if (!context.getIndex().exists(id))
							context.getChangeNotifier().notifyChange(new MetadataChange(id, MetadataChangeType.ADD));
						else if (store.lastModified(id).after(context.getIndex().lastModified(id)))
							context.getChangeNotifier().notifyChange(new MetadataChange(id, MetadataChangeType.MODIFY));