/*
* Created by LuaView.
* Copyright (c) 2017, Alibaba Group. All rights reserved.
*
* This source code is licensed under the MIT.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
package com.taobao.luaview.scriptbundle;
import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import com.taobao.luaview.global.LuaViewConfig;
import com.taobao.luaview.util.EncryptUtil;
import com.taobao.luaview.util.FileUtil;
import java.io.File;
/**
* Lua脚本管理类
*
* @author song
* @date 15/11/9
*/
public class LuaScriptManager {
private static String PACKAGE_NAME;
private static String BASE_FILECACHE_PATH;
//folders
private static final String PACKAGE_NAME_DEFAULT = "luaview";
public static final String FOLDER_SCRIPT = "script";
//默认缓存文件的后缀
public static final String POSTFIX_SCRIPT_BUNDLE = ".lvraw";
public static final String POSTFIX_JPG = ".jpg";
public static final String POSTFIX_APK = ".apk";
public static final String POSTFIX_PNG = ".png";
public static final String POSTFIX_LOG = ".log";
public static final String POSTFIX_LUA = ".lua";
public static final String POSTFIX_B_LUA = ".blua";
public static final String POSTFIX_LV = ".lv";//Lua加密脚本(source or bytecode)
public static final String POSTFIX_LV_ZIP = ".zip";//lua的zip包
public static final String POSTFIX_LV_BYTECODE_ZIP = ".bzip";//lua的二进制zip包
public static final String POSTFIX_LV_STANDARD_SYNTAX_ZIP = ".szip";//标准语法的zip包
public static final String POSTFIX_SIGN = ".sign";
/**
* 初始化
*
* @param context
*/
public static void init(final Context context) {
if (TextUtils.isEmpty(BASE_FILECACHE_PATH) && context != null) {
if (!LuaViewConfig.isDebug()) {//真实环境优先使用data/data目录
initInternalFilePath(context);
} else {//测试环境优先使用sd卡路径
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
PACKAGE_NAME = context.getPackageName();
BASE_FILECACHE_PATH = context.getExternalCacheDir() + File.separator;
} else {
initInternalFilePath(context);
}
}
}
}
/**
* 初始化内部存储目录路径
*
* @param context
*/
private static void initInternalFilePath(Context context) {
final File dir = context.getDir(PACKAGE_NAME_DEFAULT, Context.MODE_PRIVATE);
if (dir != null) {//优先存在 data/data/packagename/luaview
PACKAGE_NAME = PACKAGE_NAME_DEFAULT;
BASE_FILECACHE_PATH = dir.getPath() + File.separator;
} else {
PACKAGE_NAME = PACKAGE_NAME_DEFAULT;
BASE_FILECACHE_PATH = context.getCacheDir() + File.separator;
}
}
//--------------------------------static methods for get file path------------------------------
/**
* 获取基础文件路劲
*
* @return
*/
public static String getBaseFilePath() {
return BASE_FILECACHE_PATH + PACKAGE_NAME + File.separator;
}
/**
* get scriptFolderPath
*
* @return
*/
public static String getBaseScriptFolderPath() {
return BASE_FILECACHE_PATH + PACKAGE_NAME + File.separator + FOLDER_SCRIPT + File.separator;
}
/**
* get path of given folder
*
* @param subFolderName
* @return
*/
public static String getFolderPath(final String subFolderName) {
return new StringBuffer()
.append(getBaseScriptFolderPath())
.append(subFolderName)
.append(File.separator)
.toString();
}
/**
* get file path
*
* @param subFolderName
* @param fileNameWithPostfix
* @return
*/
public static String getFilePath(final String subFolderName, final String fileNameWithPostfix) {
return new StringBuffer()
.append(getFolderPath(subFolderName))
.append(fileNameWithPostfix)
.toString();
}
/**
* 构建文件名称
*
* @param nameWithoutPostfix 不带后缀的文件名称
* @param postfixWithDot 带点的文件后缀
* @return
*/
public static String buildFileName(final String nameWithoutPostfix, final String postfixWithDot) {
return new StringBuffer().append(nameWithoutPostfix).append(postfixWithDot).toString();
}
//------------------------------------------script function-------------------------------------
/**
* 根据Url构建ScriptBundle 的文件名称
*
* @param uri
* @return
*/
public static String buildScriptBundleFileName(final String uri) {
return buildFileName(EncryptUtil.md5Hex(uri), LuaScriptManager.POSTFIX_SCRIPT_BUNDLE);
}
/**
* 根据Url构建ScriptBundle的文件路径名称
*
* @param uri
* @return
*/
public static String buildScriptBundleFolderPath(final String uri) {
final String fileNameWithoutPostfix = EncryptUtil.md5Hex(uri);
final String folderName = fileNameWithoutPostfix;//使用文件名作为子目录的名称//new StringBuffer().append(FOLDER_SCRIPT).append(File.separator).append(fileNameWithoutPostfix).toString();
return getFolderPath(folderName);
}
/**
* 构建脚本文件文件名
*
* @param uri
* @return
*/
public static String buildScriptBundleFilePath(final String uri) {
final String fileNameWithoutPostfix = EncryptUtil.md5Hex(uri);
final String folderName = fileNameWithoutPostfix;//使用文件名作为子目录的名称//new StringBuffer().append(FOLDER_SCRIPT).append(File.separator).append(fileNameWithoutPostfix).toString();
final String fileName = buildFileName(fileNameWithoutPostfix, POSTFIX_SCRIPT_BUNDLE);
return getFilePath(folderName, fileName);
}
//------------------------------------------exists----------------------------------------------
/**
* Script Bundle 是否存在
*
* @param uri
* @return
*/
public static boolean existsScriptBundle(final String uri) {
if (!TextUtils.isEmpty(uri)) {
return FileUtil.exists(buildScriptBundleFilePath(uri));
}
return false;
}
//--------------------------------------------判断函数-------------------------------------------
/**
* 是否是lua脚本包
*
* @param fileName
* @return
*/
public static boolean isLuaScriptBundle(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_SCRIPT_BUNDLE);
}
/**
* 是否是lua的zip包(zip,bzip,szip)
*
* @param fileName
* @return
*/
public static boolean isLuaScriptZip(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_LV_ZIP)
|| FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_LV_BYTECODE_ZIP)
|| FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_LV_STANDARD_SYNTAX_ZIP);
}
/**
* 是否是lua 二进制zip包
*
* @param url
* @return
*/
public static boolean isLuaBytecodeUrl(final String url) {
return FileUtil.isSuffix(url, LuaScriptManager.POSTFIX_LV_BYTECODE_ZIP);
}
public static boolean isLuaBytecodeFile(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_B_LUA);
}
/**
* 是否是标准语法的 zip包
*
* @param url
* @return
*/
public static boolean isLuaStandardSyntaxUrl(final String url) {
return FileUtil.isSuffix(url, LuaScriptManager.POSTFIX_LV_STANDARD_SYNTAX_ZIP);
}
/**
* 是否是lua加密脚本
*
* @param fileName
* @return
*/
public static boolean isLuaEncryptScript(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_LV);
}
/**
* 是否是普通lua文件
*
* @param fileName
* @return
*/
public static boolean isLuaScript(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_LUA);
}
/**
* 签名文件
*
* @param fileName
* @return
*/
public static boolean isLuaSignFile(final String fileName) {
return FileUtil.isSuffix(fileName, LuaScriptManager.POSTFIX_SIGN);
}
/**
* 改变filename的名称
*
* @param fileName
* @param newSuffix
* @return
*/
public static String changeSuffix(final String fileName, final String newSuffix) {
if (fileName != null && fileName.lastIndexOf('.') != -1) {
return fileName.substring(0, fileName.lastIndexOf('.')) + newSuffix;
}
return fileName;
}
}