package org.fastcatsearch.plugin; import org.fastcatsearch.db.InternalDBModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; public abstract class Plugin { protected static final Logger logger = LoggerFactory.getLogger(Plugin.class); protected File pluginDir; protected String pluginId; protected PluginSetting pluginSetting; protected InternalDBModule internalDBModule; protected boolean isLoaded; protected final String serverId; protected final String licenseKey; protected String licenseStatus; private final static String licenseFileName = "license.key"; protected PluginLicenseInfo licenseInfo; public Plugin(File pluginDir, PluginSetting pluginSetting, String serverId) { this.pluginDir = pluginDir; this.pluginSetting = pluginSetting; this.pluginId = pluginSetting.getId(); this.serverId = serverId; this.licenseKey = readLicenseKey(); } protected void setLicenseInfo(PluginLicenseInfo licenseInfo) { this.licenseInfo = licenseInfo; } public PluginLicenseInfo getLicenseInfo() { return licenseInfo; } private String readLicenseKey() { File licenseKeyFile = new File(pluginDir, licenseFileName); if(licenseKeyFile.exists()) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(licenseKeyFile)); StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); sb.append("\n"); line = br.readLine(); } return sb.toString(); } catch (IOException e) { logger.error("", e); } finally { if(br != null) { try { br.close(); } catch (IOException e) { //ignore } } } } return null; } public String pluginId(){ return pluginId; } public String getLicenseStatus() { return licenseStatus != null ? licenseStatus : ""; } public final void load(boolean isMasterNode) throws LicenseInvalidException { boolean isLoadDb = isMasterNode && pluginSetting.isUseDB(); if(isLoadDb){ loadDB(); } try { doLoad(isLoadDb); }catch (LicenseInvalidException e) { licenseStatus = e.getMessage(); throw e; } licenseStatus = "Valid"; if(licenseInfo != null) { licenseStatus = licenseStatus + " (" + licenseInfo.getLicenseExpireDate() + ")"; } isLoaded = true; } public final void unload(){ doUnload(); if(pluginSetting.isUseDB()){ unloadDB(); } isLoaded = false; } public final void reload(boolean isMaster) throws LicenseInvalidException { unload(); load(isMaster); } protected abstract void doLoad(boolean isLoadDb) throws LicenseInvalidException; protected abstract void doUnload(); public boolean isLoaded(){ return isLoaded; } private final void loadDB() { String dbPath = getPluginDBDataDir().getAbsolutePath(); new File(dbPath).getParentFile().mkdirs(); List<URL> mapperFileList = new ArrayList<URL>(); addMapperFile(mapperFileList); internalDBModule = new InternalDBModule(dbPath, mapperFileList, null, null); internalDBModule.load(); } protected abstract void addMapperFile(List<URL> mapperFileList); private void unloadDB() { if(internalDBModule != null){ internalDBModule.unload(); } } public InternalDBModule internalDBModule(){ return internalDBModule; } public File getPluginDir(){ return pluginDir; } protected File getPluginDBDir(){ return new File(pluginDir, "db"); } protected File getPluginDBDataDir(){ return new File(getPluginDBDir(), "data"); } protected File getPluginDBConfigDir(){ return new File(getPluginDBDir(), "config"); } public PluginSetting getPluginSetting(){ return pluginSetting; } }