content: package jp.aegif.nemaki.bjornloka;
  
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
  
  import jp.aegif.nemaki.bjornloka.dump.DumpAction;
  import jp.aegif.nemaki.bjornloka.model.Entry;
  import jp.aegif.nemaki.bjornloka.proxy.CloudantFactory;
  import jp.aegif.nemaki.bjornloka.proxy.CloudantProxy;
  import jp.aegif.nemaki.bjornloka.proxy.CouchProxy;
  import jp.aegif.nemaki.bjornloka.proxy.EktorpFactory;
  import jp.aegif.nemaki.bjornloka.proxy.EktorpProxy;
  import jp.aegif.nemaki.bjornloka.util.Indicator;
  import jp.aegif.nemaki.bjornloka.util.Util;
  
  import com.fasterxml.jackson.core.JsonGenerationException;
  import com.fasterxml.jackson.core.JsonParseException;
  import com.fasterxml.jackson.databind.JsonMappingException;
  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.fasterxml.jackson.databind.node.ObjectNode;
  
  public class Dump {
  	public static void main(String[] args) {
  		if (args.length < 3) {
  			System.err
  					.println("Wrong number of arguments: url, repositoryId, filePath, omitTimestamp");
  			return;
  		}
  
  		// url
  		String url = args[0];
  
  		// repositoryId
  		String repositoryId = args[1];
  
  		// filePath
  		String filePath = args[2];
  		File file = new File(filePath);
  
  		// omitTimestamp(optional)
  		boolean omitTimestamp = false;
  		try {
  			String _omitTimestamp = args[3];
  			omitTimestamp = StringPool.BOOLEAN_TRUE.equals(_omitTimestamp);
  		} catch (Exception e) {
  			// do nothing
  		}
  		
  		if (!omitTimestamp) {
  			String timestamp = Util.getCurrentDateString();
  			String newFilePath = file.getAbsolutePath() + "_" + timestamp;
  			file = null;
  			file = new File(newFilePath);
  		}
  
  		// Execute dumping
  		try {
  			DumpAction dumpAction = DumpAction.getInstance(url, repositoryId, file, omitTimestamp);
  			String createdFilePath = dumpAction.dump();;
  			System.out.println("Dump successfully: " + createdFilePath);
  		} catch (Exception e) {
  			e.printStackTrace();
  			System.err.println("Dump failed");
  		}
  	}
  	
  	public static String dump(CouchProxy client,
  			File file, boolean omitTimestamp){
  		List<String> docIds = client.getAllDocIds();
  		System.out.println("alldoc keys:" + docIds.toString());
  
  		try {
  			file.createNewFile();
  		} catch (IOException e) {
  			e.printStackTrace();
  		}
  		
  		Indicator indicator = new Indicator(docIds.size());
  
  		int unit = 5000;
  		int turn = docIds.size() / unit;
  		System.out.println("Writing to " + file.getAbsolutePath() + " ...");
  		for(int i=0; i <= turn ; i++){
  			int toIndex = (unit*(i+1) > docIds.size()) ? docIds.size() : unit*(i+1);
  
  			List<String> keys = docIds.subList(i*unit, toIndex);
  			System.out.println("subsystem keys:" + keys.toString());
  			List<ObjectNode> results = client.getDocs(keys);
  			
  			List<Entry> entries = new ArrayList<Entry>();
  			for(ObjectNode document : results){
  				Entry entry = new Entry();
  				entry.setDocument(document);
  				entry.setAttachments(client.getAttachments(document));
  				entries.add(entry);
  				indicator.indicate();
  			}
  			try {
  				new ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(new FileOutputStream(file, true), entries);
  			} catch (JsonGenerationException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			} catch (JsonMappingException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			} catch (FileNotFoundException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			} catch (IOException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			}
  		}
  		
  		return file.getAbsolutePath();
  		
  	}
  	
  	public static String dumpEktorp(String url, String repositoryId,
  			File file, boolean omitTimestamp) throws JsonParseException,
  			JsonMappingException, IOException {
  		EktorpProxy proxy = EktorpFactory.getInstance().createProxy(url, repositoryId);
  		return dump(proxy, file, omitTimestamp);
  	}
  
  	//TODO implement
  	public static String dumpCloudant(String url, String repositoryId,
  			File file, boolean omitTimestamp){
  		CloudantProxy proxy = CloudantFactory.getInstance().createProxy(url, repositoryId);
  		return dump(proxy, file, omitTimestamp);
  	}
  	
  }