/* * Copyright 2012 A. Kaplanov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.waveprotocol.box.waveimport; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.Reader; import java.util.Arrays; import java.util.Comparator; import java.util.StringTokenizer; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; import org.apache.commons.httpclient.methods.PostMethod; import org.waveprotocol.box.server.persistence.file.FileUtils; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.id.WaveletId; /** * Import waves from files to Wiab * * @author (akaplanov@gmail.com) (Andrew Kaplanov) */ public final class WaveImport { private final String waveServerImportUrl; private final String waveServerDomain; private final String exportDir; private WaveImport(String waveServerImportUrl, String waveServerDomain, String exportDir) { this.waveServerImportUrl = waveServerImportUrl; this.waveServerDomain = waveServerDomain; this.exportDir = exportDir; } public static void main(String[] args) { if (args.length != 3) { System.err.println("Use: WaveImport <WaveServerImportUrl> <WaveServerDomain> <ExportDir>"); System.exit(1); } new WaveImport(args[0], args[1], args[2]).importWavesFromFiles(); } /* * Import waves from files */ public void importWavesFromFiles() { File dir = new File(exportDir); if (!dir.exists()) { System.err.println("Directory " + exportDir + " is not exists."); System.exit(1); } File[] files = dir.listFiles(new FilenameFilter() { @Override public boolean accept(File file, String name) { return name.endsWith("json"); } }); Arrays.sort(files, new Comparator<File>() { @Override public int compare(File f1, File f2) { return f1.getName().compareTo(f2.getName()); } }); int importedCount = 0; int appendedCount = 0; int skippedCount = 0; int errorCount = 0; for (int i = 0; i < files.length; i++) { try { File file = files[i]; System.out.println("Importing " + file + " (" + (i + 1) + " of " + files.length + ") ..."); StringTokenizer fileNameTokenizer = new StringTokenizer(file.getName(), "."); WaveId waveId = FileUtils.waveIdFromPathSegment(fileNameTokenizer.nextToken()); waveId = WaveId.of(waveServerDomain, waveId.getId()); WaveletId waveletId = FileUtils.waveletIdFromPathSegment(fileNameTokenizer.nextToken()); waveletId = WaveletId.of(waveServerDomain, waveletId.getId()); String reply = importRequest(waveServerImportUrl, waveId, waveletId, readFile(file)); System.out.println("... " + reply); StringTokenizer replyTokenizer = new StringTokenizer(reply); String status = replyTokenizer.nextToken(); if (status.equals("imported")) { importedCount++; } else if (status.equals("appended")) { appendedCount++; } else if (status.equals("error")) { errorCount++; } else if (status.equals("skipped")) { skippedCount++; } } catch (IOException ex) { errorCount++; ex.printStackTrace(System.err); } } System.out.println("Imported count " + importedCount); System.out.println("Appended count " + appendedCount); System.out.println("Skipped count " + skippedCount); System.out.println("Error count " + errorCount); } private String importRequest(String url, WaveId waveId, WaveletId waveletId, String json) throws IOException { HttpClient httpClient = new HttpClient(); PostMethod request = new PostMethod(url); request.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); request.setRequestHeader("domain", waveServerDomain); request.setRequestHeader("waveId", waveId.serialise()); request.setRequestHeader("waveletId", waveletId.serialise()); request.setRequestEntity(new ByteArrayRequestEntity(json.getBytes("utf8"))); if (httpClient.executeMethod(request) != 200) { throw new IOException(request.getResponseBodyAsString()); } return request.getResponseBodyAsString(); } private static String readFile(File file) throws FileNotFoundException, IOException { Reader reader = new FileReader(file); StringBuilder sb = new StringBuilder(); char buf[] = new char[1000]; for (;;) { int ret = reader.read(buf, 0, buf.length); if (ret == -1) { break; } sb.append(buf, 0, ret); } return sb.toString(); } }