/*
* This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT).
*
* Copyright (c) JCThePants (www.jcwhatever.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.jcwhatever.nucleus.internal.managed.scripting;
import com.jcwhatever.nucleus.Nucleus;
import com.jcwhatever.nucleus.internal.NucMsg;
import com.jcwhatever.nucleus.utils.modules.ClassLoadMethod;
import com.jcwhatever.nucleus.utils.modules.IModuleInfo;
import com.jcwhatever.nucleus.utils.modules.JarModuleLoader;
import com.jcwhatever.nucleus.utils.file.FileUtils.DirectoryTraversal;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.jar.JarFile;
import javax.annotation.Nullable;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
public final class InternalScriptEngineLoader extends JarModuleLoader<ScriptEngineFactory> {
private final ScriptEngineManager _engineManager;
private final File _engineFolder;
/**
* Constructor.
*/
public InternalScriptEngineLoader(ScriptEngineManager engineManager) {
super(Nucleus.getPlugin(), ScriptEngineFactory.class);
_engineManager = engineManager;
File scriptFolder = new File(Nucleus.getPlugin().getDataFolder(), "scripts");
_engineFolder = new File(scriptFolder, "engines");
if (!_engineFolder.exists() && !_engineFolder.mkdirs()) {
throw new RuntimeException("Failed to create script engine folder.");
}
}
@Override
public File getModuleFolder() {
return _engineFolder;
}
@Override
public DirectoryTraversal getDirectoryTraversal() {
return DirectoryTraversal.NONE;
}
@Override
public void loadModules() {
super.loadModules();
List<ScriptEngineFactory> factories = getModules();
for (ScriptEngineFactory factory : factories) {
_engineManager.registerEngineName(factory.getEngineName(), factory);
List<String> extensions = factory.getExtensions();
for (String ext : extensions) {
_engineManager.registerEngineExtension(ext, factory);
}
List<String> mimes = factory.getMimeTypes();
for (String mime : mimes) {
_engineManager.registerEngineExtension(mime, factory);
}
NucMsg.info("Loaded script engine: {0}", factory.getEngineName());
}
}
@Override
protected ClassLoadMethod getLoadMethod(File file) {
return ClassLoadMethod.DIRECT_OR_SEARCH;
}
@Override
protected String getModuleClassName(JarFile jarFile) {
return null;
}
@Nullable
@Override
protected IModuleInfo createModuleInfo(final ScriptEngineFactory moduleInstance) {
return new IModuleInfo() {
String name = moduleInstance.getEngineName();
String searchName = moduleInstance.getEngineName().toLowerCase();
@Override
public String getName() {
return name;
}
@Override
public String getSearchName() {
return searchName;
}
};
}
@Nullable
@Override
protected ScriptEngineFactory instantiateModule(Class<ScriptEngineFactory> clazz) {
try {
Constructor<ScriptEngineFactory> constructor = clazz.getDeclaredConstructor();
return constructor.newInstance();
} catch (NoSuchMethodException | InvocationTargetException |
IllegalAccessException | InstantiationException e) {
e.printStackTrace();
return null;
}
}
}