// 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/URLMetadataStoreContext.java
// public class URLMetadataStoreContext extends MetadataStoreContextBase {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 5358038794721104393L;
// 
// 	private URL url;
// 	
// 	public URL getUrl() {
// 		return url;
// 	}
// 	
// 	public void setUrl(URL url) {
// 		this.url = url;
// 	}
// 	
// }


import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 net.nordu.mdx.store.fs.URLMetadataStoreContext;
import org.eclipse.jgit.lib.Commit;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.oasis.saml.metadata.EntityDescriptorDocument;
import org.oasis.saml.metadata.EntityDescriptorType;

	/**
	 * Diff two trees, and emit metadata change notifications.
	 * 
	 * @param oldTree
	 * @param newTree
	 * @param message
	 * @param timeStamp
	 * @throws IOException
	 */
	private void diffTrees(ObjectId oldTree, ObjectId newTree, String message,
			Date timeStamp) throws IOException {
		TreeWalk tw = new TreeWalk(repository);
		int cur = tw.addTree(newTree);
		int old = 0;
		boolean initialScan = oldTree == null;
		if (!initialScan) {
			old = tw.addTree(oldTree);
		}
		tw.setFilter(TreeFilter.ANY_DIFF);
		tw.setRecursive(true);

		while (tw.next()) {
			if (initialScan || !tw.idEqual(old, cur)) {
				String changedFile = tw.getNameString();
				int pfix = changedFile.lastIndexOf(".xml");
				if (pfix == -1) {
					continue;
				}
				String identifier = changedFile.substring(0, pfix);
// 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/URLMetadataStoreContext.java
// public class URLMetadataStoreContext extends MetadataStoreContextBase {
// 
// 	/**
// 	 * 
// 	 */
// 	private static final long serialVersionUID = 5358038794721104393L;
// 
// 	private URL url;
// 	
// 	public URL getUrl() {
// 		return url;
// 	}
// 	
// 	public void setUrl(URL url) {
// 		this.url = url;
// 	}
// 	
// }


// Path: src/main/java/net/nordu/mdx/store/git/GitRepositoryMetadataStore.java
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 net.nordu.mdx.store.fs.URLMetadataStoreContext;
import org.eclipse.jgit.lib.Commit;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.oasis.saml.metadata.EntityDescriptorDocument;
import org.oasis.saml.metadata.EntityDescriptorType;


	/**
	 * Diff two trees, and emit metadata change notifications.
	 * 
	 * @param oldTree
	 * @param newTree
	 * @param message
	 * @param timeStamp
	 * @throws IOException
	 */
	private void diffTrees(ObjectId oldTree, ObjectId newTree, String message,
			Date timeStamp) throws IOException {
		TreeWalk tw = new TreeWalk(repository);
		int cur = tw.addTree(newTree);
		int old = 0;
		boolean initialScan = oldTree == null;
		if (!initialScan) {
			old = tw.addTree(oldTree);
		}
		tw.setFilter(TreeFilter.ANY_DIFF);
		tw.setRecursive(true);

		while (tw.next()) {
			if (initialScan || !tw.idEqual(old, cur)) {
				String changedFile = tw.getNameString();
				int pfix = changedFile.lastIndexOf(".xml");
				if (pfix == -1) {
					continue;
				}
				String identifier = changedFile.substring(0, pfix);
				MetadataChangeType chT = null;