package com.antfortune.freeline.router.schema;
import android.os.Build;
import android.util.Log;
import com.antfortune.freeline.FreelineCore;
import com.antfortune.freeline.router.ISchemaAction;
import com.antfortune.freeline.server.EmbedHttpServer;
import com.antfortune.freeline.server.LongLinkServer;
import com.antfortune.freeline.util.FileUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Created by huangyong on 16/7/28.
*/
public class PushResourceSchema implements ISchemaAction {
private static final String TAG = "Freeline.PushResource";
@Override
public String getDescription() {
return "pushResource";
}
@Override
public void handle(String method, String path, HashMap<String, String> headers, Map<String, String> queries, InputStream input, EmbedHttpServer.ResponseOutputStream response) throws Exception {
Log.d(TAG, new StringBuilder().append("receive res ").append(path).toString());
String bundleName = queries.get("bundleId");
boolean fullBuild = Build.VERSION.SDK_INT <= 19;
if (fullBuild) {
Log.d(TAG, "receive full res pck command");
}
Log.d(TAG, new StringBuilder().append("bundle id ").append(bundleName).toString());
String destPath = FreelineCore.getDynamicInfoTempPath(bundleName);
File lastPathFile = new File(FreelineCore.getBundleFilePathByPackageId(bundleName));
Log.i(TAG, new StringBuilder().append("bundle last time :").append(lastPathFile.lastModified()).toString());
File destFile = new File(destPath);
File pendingFile = new File(destPath + ".bak");
int count = 0;
try {
if (!pendingFile.exists()) {
pendingFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(pendingFile);
byte[] buf = new byte[4096];
int l;
while ((l = input.read(buf)) != -1) {
fos.write(buf, 0, l);
count += l;
}
fos.close();
} catch (Exception e) {
Log.d(TAG, e.getStackTrace().toString());
response.setStatusCode(500);
return;
}
if (fullBuild) {
FileUtils.rm(destFile);
boolean rst2 = pendingFile.renameTo(destFile);
Log.d(TAG, new StringBuilder().append("delete pending file rename rst :").append(rst2).toString());
} else {
if (destFile.exists()) {
if (!destFile.isDirectory()) {
File temp = new File(new StringBuilder().append(destFile.getAbsolutePath()).append(".temp").toString());
boolean rst = destFile.renameTo(temp);
Log.d(TAG, new StringBuilder().append("dest File renameTo ").append(temp.getAbsolutePath()).append(" rst:").append(rst).toString());
destFile = new File(destPath);
if (rst) {
long s = System.currentTimeMillis();
destFile.mkdirs();
FileUtils.unzip(temp, destFile);
Log.d(TAG, new StringBuilder().append("unzip file ").append(temp).append(" to ").append(destPath).append(" rst:").append(rst).append(" last:").append(System.currentTimeMillis() - s).toString());
Log.d(TAG, new StringBuilder().append("after unzip ,dir file size =").append(destFile.list().length).toString());
}
}
} else {
try {
long s = System.currentTimeMillis();
destFile.mkdirs();
FileUtils.unzip(lastPathFile, destFile);
Log.d(TAG, new StringBuilder().append("unzip old file ").append(lastPathFile).append(" to ").append(destFile.getAbsolutePath()).append(" last:").append(System.currentTimeMillis() - s).toString());
Log.d(TAG, new StringBuilder().append("after unzip ,dir file size =").append(destFile.list().length).toString());
} catch (Exception e) {
FreelineCore.printStackTrace(e);
}
}
long s = System.currentTimeMillis();
FileUtils.unzip(pendingFile, destFile);
FileUtils.rm(pendingFile);
Log.d(TAG, new StringBuilder().append("sync res increment files to ").append(destFile.getAbsolutePath()).append(" last:").append(System.currentTimeMillis() - s).toString());
}
//FreelineCore.saveDynamicInfo(bundleName, destPath);
LongLinkServer.setBundleName(bundleName);
LongLinkServer.setDstPath(destPath);
LongLinkServer.markResourcesChanged();
response.setStatusCode(201);
Log.d(TAG, new StringBuilder().append("increment resources file received (").append(count).append(" bytes)").toString());
}
}