// Path: src/main/java/com/rc/gds/GDSLink.java
// public class GDSLink {
// 
// 	Object pojo;
// 	Collection<Object> collection;
// 	GDSField gdsField;
// 	Key key;
// 	Collection<Key> keyCollection;
// 
// 	public GDSLink(Object pojo, GDSField gdsField, Key key) {
// 		this.pojo = pojo;
// 		this.gdsField = gdsField;
// 		this.key = key;
// 	}
// 
// 	public GDSLink(Object pojo, GDSField gdsField, Collection<Key> keyIterable) {
// 		this.pojo = pojo;
// 		this.gdsField = gdsField;
// 		keyCollection = keyIterable;
// 	}
// 
// 	public GDSLink(Collection<Object> collection, Collection<Key> keyIterable) {
// 		this.collection = collection;
// 		keyCollection = keyIterable;
// 	}
// 
// 	public GDSLink(Collection<Object> collection, Key key) {
// 		this.collection = collection;
// 		this.key = key;
// 	}
// 
// }
// 
// Path: src/main/java/com/rc/gds/Key.java
// public class Key implements Serializable {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	String kind, id;
// 	Long version;
// 
// 	public Key() {
// 	}
// 	
// 	public Key(Map<String, Object> map) {
// 		id = (String) map.get("id");
// 		kind = (String) map.get("kind");
// 	}
// 	
// 	public Key(Class<?> clazz, String id) {
// 		this.id = id;
// 		kind = GDSClass.getKind(clazz);
// 	}
// 
// 	public Key(String kind, String id) {
// 		this.id = id;
// 		this.kind = kind;
// 	}
// 
// 	public Key(String kind, String id, long version) {
// 		this(kind, id);
// 		this.version = version;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		Key other = (Key) obj;
// 		if (id == null) {
// 			if (other.id != null)
// 				return false;
// 		} else if (!id.equals(other.id))
// 			return false;
// 		if (kind == null) {
// 			if (other.kind != null)
// 				return false;
// 		} else if (!kind.equals(other.kind))
// 			return false;
// 		return true;
// 	}
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public void setId(String id) {
// 		this.id = id;
// 	}
// 	
// 	public String getKind() {
// 		return kind;
// 	}
// 	
// 	public void setKind(String kind) {
// 		this.kind = kind;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + (id == null ? 0 : id.hashCode());
// 		result = prime * result + (kind == null ? 0 : kind.hashCode());
// 		return result;
// 	}
// 	
// 	public Map<String, Object> toMap() {
// 		Map<String, Object> map = new HashMap<>();
// 		map.put("id", id);
// 		map.put("kind", kind);
// 		return map;
// 	}
// 
// }
// 
// Path: src/main/java/com/rc/gds/PropertyContainer.java
// public interface PropertyContainer {
// 
// 	public void setProperty(String key, Object val);
// 
// 	public void setUnindexedProperty(String key, Object val);
// 	
// 	public Map<String, Object> getDBDbObject();
// 
// 	public Object getProperty(String key);
// 	
// 	public boolean hasProperty(String key);
// 	
// }


import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import com.rc.gds.GDSLink;
import com.rc.gds.Key;
import com.rc.gds.PropertyContainer;

package com.rc.gds.interfaces;



public interface GDSLoader {
	
	/**
	 * This will fetch a pojo of type clazz with specific id. This method is prefered over fetch(Key)
	 * 
	 * @param clazz
	 *            Class of the object to fetch. Should be the class itself if possible, but superclass or subclass of the object will work
	 *            too.
	 * @param id
	 *            Long id returned from a previous saved pojo
	 * @return
	 */
	public abstract <T> GDSResult<T> fetch(Class<T> clazz, String id);
	
	/**
	 * Will fetch the pojo matching the key.
	 * 
	 * @param key
	 * @return
	 */

// Path: src/main/java/com/rc/gds/GDSLink.java
// public class GDSLink {
// 
// 	Object pojo;
// 	Collection<Object> collection;
// 	GDSField gdsField;
// 	Key key;
// 	Collection<Key> keyCollection;
// 
// 	public GDSLink(Object pojo, GDSField gdsField, Key key) {
// 		this.pojo = pojo;
// 		this.gdsField = gdsField;
// 		this.key = key;
// 	}
// 
// 	public GDSLink(Object pojo, GDSField gdsField, Collection<Key> keyIterable) {
// 		this.pojo = pojo;
// 		this.gdsField = gdsField;
// 		keyCollection = keyIterable;
// 	}
// 
// 	public GDSLink(Collection<Object> collection, Collection<Key> keyIterable) {
// 		this.collection = collection;
// 		keyCollection = keyIterable;
// 	}
// 
// 	public GDSLink(Collection<Object> collection, Key key) {
// 		this.collection = collection;
// 		this.key = key;
// 	}
// 
// }
// 
// Path: src/main/java/com/rc/gds/Key.java
// public class Key implements Serializable {
// 
// 	private static final long serialVersionUID = 1L;
// 
// 	String kind, id;
// 	Long version;
// 
// 	public Key() {
// 	}
// 	
// 	public Key(Map<String, Object> map) {
// 		id = (String) map.get("id");
// 		kind = (String) map.get("kind");
// 	}
// 	
// 	public Key(Class<?> clazz, String id) {
// 		this.id = id;
// 		kind = GDSClass.getKind(clazz);
// 	}
// 
// 	public Key(String kind, String id) {
// 		this.id = id;
// 		this.kind = kind;
// 	}
// 
// 	public Key(String kind, String id, long version) {
// 		this(kind, id);
// 		this.version = version;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		Key other = (Key) obj;
// 		if (id == null) {
// 			if (other.id != null)
// 				return false;
// 		} else if (!id.equals(other.id))
// 			return false;
// 		if (kind == null) {
// 			if (other.kind != null)
// 				return false;
// 		} else if (!kind.equals(other.kind))
// 			return false;
// 		return true;
// 	}
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public void setId(String id) {
// 		this.id = id;
// 	}
// 	
// 	public String getKind() {
// 		return kind;
// 	}
// 	
// 	public void setKind(String kind) {
// 		this.kind = kind;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + (id == null ? 0 : id.hashCode());
// 		result = prime * result + (kind == null ? 0 : kind.hashCode());
// 		return result;
// 	}
// 	
// 	public Map<String, Object> toMap() {
// 		Map<String, Object> map = new HashMap<>();
// 		map.put("id", id);
// 		map.put("kind", kind);
// 		return map;
// 	}
// 
// }
// 
// Path: src/main/java/com/rc/gds/PropertyContainer.java
// public interface PropertyContainer {
// 
// 	public void setProperty(String key, Object val);
// 
// 	public void setUnindexedProperty(String key, Object val);
// 	
// 	public Map<String, Object> getDBDbObject();
// 
// 	public Object getProperty(String key);
// 	
// 	public boolean hasProperty(String key);
// 	
// }


// Path: src/main/java/com/rc/gds/interfaces/GDSLoader.java
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import com.rc.gds.GDSLink;
import com.rc.gds.Key;
import com.rc.gds.PropertyContainer;

package com.rc.gds.interfaces;



public interface GDSLoader {
	
	/**
	 * This will fetch a pojo of type clazz with specific id. This method is prefered over fetch(Key)
	 * 
	 * @param clazz
	 *            Class of the object to fetch. Should be the class itself if possible, but superclass or subclass of the object will work
	 *            too.
	 * @param id
	 *            Long id returned from a previous saved pojo
	 * @return
	 */
	public abstract <T> GDSResult<T> fetch(Class<T> clazz, String id);
	
	/**
	 * Will fetch the pojo matching the key.
	 * 
	 * @param key
	 * @return
	 */

	public abstract void fetch(Key key, GDSCallback<Object> callback);
