package org.dcache.gplazma.loader;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.dcache.gplazma.plugins.GPlazmaPlugin;
/**
* Class to hold (static) metadata about a plugin. It also checks the
* validity of the information.
*/
public class PluginMetadata {
private final Set<String> _names = new HashSet<>();
private Class<? extends GPlazmaPlugin> _class;
private String _defaultControl;
void addName( String name) {
validPluginNameGuard( name);
_names.add( name);
}
void validPluginNameGuard( String name) {
if( name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Plugin name cannot be null or empty.");
}
}
public void setPluginClass( String className) {
validClassNameGuard( className);
Class<?> arbClass = tryToGetClassForName( className);
Class<? extends GPlazmaPlugin> pluginClass = tryToCastClass( arbClass);
setPluginClass( pluginClass);
}
private void validClassNameGuard( String name) {
if( name == null) {
throw new IllegalArgumentException("Plugin class name cannot be null");
}
if( hasPluginClass()) {
throw new IllegalArgumentException("Plugin class cannot be specified twice");
}
}
public boolean hasPluginClass() {
return _class != null;
}
private Class<?> tryToGetClassForName( String className) {
Class<?> arbitraryClass;
try {
arbitraryClass = Class.forName( className);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Class " + className +
" could not be found.",
e);
}
return arbitraryClass;
}
private Class<? extends GPlazmaPlugin> tryToCastClass( Class<?> arbClass) {
Class<? extends GPlazmaPlugin> pluginClass;
try {
pluginClass = arbClass.asSubclass( GPlazmaPlugin.class);
} catch (ClassCastException e) {
throw new IllegalArgumentException("Named plugin class is not a GPlazmaPlugin class",
e);
}
return pluginClass;
}
public void setPluginClass( Class<? extends GPlazmaPlugin> pluginClass) {
_class = pluginClass;
addName( pluginClass.getName());
}
void setDefaultControl( String defaultControl) {
_defaultControl = defaultControl;
}
public Set<String> getPluginNames() {
return Collections.unmodifiableSet(_names);
}
public String getShortestName() {
String shortestName = null;
for( String name : _names) {
if( shortestName == null || name.length() < shortestName.length()) {
shortestName = name;
}
}
return shortestName;
}
public Class<? extends GPlazmaPlugin> getPluginClass() {
return _class;
}
public String getDefaultControl() {
return _defaultControl;
}
public boolean isValid() {
return hasPluginName() && hasPluginClass();
}
public boolean hasPluginName() {
return !_names.isEmpty();
}
}