package org.qrone.r7.github;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mozilla.javascript.Scriptable;
import org.qrone.database.DatabaseCursor;
import org.qrone.database.DatabaseService;
import org.qrone.database.DatabaseTable;
import org.qrone.r7.RepositoryService;
import org.qrone.r7.fetcher.HTTPFetcher;
import org.qrone.r7.handler.URIHandler;
import org.qrone.r7.resolver.CascadeResolver;
import org.qrone.r7.resolver.URIResolver;
import org.qrone.r7.script.Scriptables;
public class GitHubRepositoryService implements URIHandler, RepositoryService{
private Map<String, GitHubResolver> idToResolverMap = new Hashtable<String, GitHubResolver>();
private CascadeResolver cascade = new CascadeResolver();
private DatabaseTable table;
private static final String KIND = "qrone.repository";
private static final String OWNER = "owner";
private static final String NAME = "name";
private static final String TREE_SHA = "tree_sha";
private HTTPFetcher fetcher;
private URIResolver cacher;
public GitHubRepositoryService(HTTPFetcher fetcher, URIResolver cacher, DatabaseService service){
this.fetcher = fetcher;
this.cacher = cacher;
this.table = service.getCollection(KIND);
DatabaseCursor cursor = table.find();
while(cursor.hasNext()){
addGithub(cursor.next());
}
}
private GitHubResolver addGithub(Map e){
GitHubResolver github = new GitHubResolver(fetcher, cacher,
(String)e.get(OWNER), (String)e.get(NAME), (String)e.get(TREE_SHA));
if(github.exist()){
cascade.add(github);
return github;
}
return null;
}
public URIResolver getResolver(){
return cascade;
}
@Override
public String add(Scriptable s) {
Map repo = Scriptables.asMap(s);
Map map = new Hashtable();
map.put(OWNER, repo.get(OWNER).toString());
map.put(NAME, repo.get(NAME).toString());
map.put(TREE_SHA, repo.get(TREE_SHA).toString());
GitHubResolver resolver = addGithub(map);
if(resolver != null){
String id = table.insert(map);
idToResolverMap.put(id, resolver);
return id;
}
return null;
}
@Override
public void remove(String id) {
table.remove(id);
GitHubResolver resolver = idToResolverMap.get(id);
if(resolver != null){
idToResolverMap.remove(id);
cascade.asList().remove(resolver);
}
}
@Override
public List<Map<String, Object>> list() {
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
DatabaseCursor cursor = table.find();
while(cursor.hasNext()){
list.add(cursor.next());
}
return list;
}
@Override
public boolean handle(HttpServletRequest request,
HttpServletResponse response, String uri, String requestPath,
String requestPathArg, List<String> arg) {
List l = cascade.asList();
for (Object o : l) {
((URIHandler)o).handle(request, response, uri, requestPath, requestPathArg, arg);
}
return false;
}
@Override
public void reset(String id) {
GitHubResolver resolver = idToResolverMap.get(id);
if(resolver != null){
resolver.reset();
}
}
public Map<String, InputStream> getFiles(URI uri){
Map<String, InputStream> map = new Hashtable<String, InputStream>();
for (Iterator<Entry<String, GitHubResolver>> iter = idToResolverMap.entrySet().iterator(); iter
.hasNext();) {
Entry<String, GitHubResolver> entry = iter.next();
try {
map.put(entry.getKey(), entry.getValue().getInputStream(uri));
} catch (IOException e) {
map.put(entry.getKey(), null);
}
}
return map;
}
}