grails.plugins.GrailsPlugin Maven / Gradle / Ivy
Show all versions of grails-core Show documentation
/*
* Copyright 2004-2005 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package grails.plugins;
import grails.config.Config;
import grails.util.BuildScope;
import grails.util.Environment;
import groovy.lang.GroovyObject;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import grails.core.GrailsApplication;
import org.grails.spring.RuntimeSpringConfiguration;
import org.grails.plugins.support.WatchPattern;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.type.filter.TypeFilter;
/**
* Plugin interface that adds Spring {@link org.springframework.beans.factory.config.BeanDefinition}s
* to a registry based on a {@link GrailsApplication} object. After all GrailsPlugin
classes
* have been processed the {@link org.springframework.beans.factory.config.BeanDefinition}s in the registry are
* loaded in a Spring {@link org.springframework.context.ApplicationContext} that's the singular
* configuration unit of Grails applications.
*
* It's up to implementation classes to determine where GrailsPlugin
instances are loaded
* from.
*
* @author Steven Devijver
* @author Graeme Rocher
*
* @since 0.2
* @see org.springframework.beans.factory.support.BeanDefinitionRegistry
*/
@SuppressWarnings("rawtypes")
public interface GrailsPlugin extends ApplicationContextAware, Comparable, GrailsPluginInfo, org.codehaus.groovy.grails.plugins.GrailsPlugin {
int EVENT_ON_CHANGE = 0;
int EVENT_ON_CONFIG_CHANGE = 1;
int EVENT_ON_SHUTDOWN = 2;
String DO_WITH_DYNAMIC_METHODS = "doWithDynamicMethods";
/**
* The scopes to which this plugin applies
*/
String SCOPES = "scopes";
/**
* The environments to which this plugin applies
*/
String ENVIRONMENTS = "environments";
/**
* The prefix used in plug-ins paths
*/
String PLUGINS_PATH = "/plugins";
/**
* Defines the name of the property that specifies resources which this plugin monitors for changes
* in the format a Ant-style path
*/
String WATCHED_RESOURCES = "watchedResources";
/**
* Defines the name of the property that specifies a List or plugins that this plugin evicts
* Eviction occurs when the PluginManager loads
*/
String EVICT = "evict";
/**
* The status of the plugin.
*/
String STATUS = "status";
/**
* When a plugin is "enabled" it will be loaded as usual.
*/
String STATUS_ENABLED = "enabled";
/**
* When a plugin is "disabled" it will not be loaded
*/
String STATUS_DISABLED = "disabled";
/**
* Defines the name of the property that defines the closure that will be invoked
* when a watched resource changes
*/
String ON_CHANGE = "onChange";
/**
* Defines the name of the property that holds a closure to be invoked when shutdown is called
*/
String ON_SHUTDOWN = "onShutdown";
/**
* Defines the name of the property that defines the closure that will be invoked
* when a the Grails configuration object changes
*/
String ON_CONFIG_CHANGE = "onConfigChange";
/**
* Defines the name of the property that defines the closure that will be invoked
* when the web.xml is being generated
*/
String DO_WITH_WEB_DESCRIPTOR = "doWithWebDescriptor";
/**
* Defines the name of the property that defines the closure that will be invoked during runtime spring configuration
*/
String DO_WITH_SPRING = "doWithSpring";
/**
* Defines the name of the property that defines a closure that will be invoked after intialisation
* and when the application context has been built
*/
String DO_WITH_APPLICATION_CONTEXT = "doWithApplicationContext";
/**
* Defines the name of the property that specifies which plugins this plugin depends on
*/
String DEPENDS_ON = "dependsOn";
/**
* Define the list of ArtefactHandlers supporting by the plugin
*/
String ARTEFACTS = "artefacts";
/**
* The name of the property that provides a list of shipped, but overridable artefacts
*/
String PROVIDED_ARTEFACTS = "providedArtefacts";
/**
* The profiles for which this plugin is active
*/
String PROFILES = "profiles";
/**
* The name of the property that provides a list of plugins this plugin should load before
*/
String PLUGIN_LOAD_BEFORE_NAMES = "loadBefore";
/**
* The name of the property that provides a list of plugins this plugin should after before
*/
String PLUGIN_LOAD_AFTER_NAMES = "loadAfter";
/**
* The field that represents the list of resources to exclude from plugin packaging
*/
String PLUGIN_EXCLUDES = "pluginExcludes";
/**
* The field that represents the list of type filters a plugin provides
*/
String TYPE_FILTERS = "typeFilters";
/**
* The field that represents the plugin names that this plugin is observing for changes.
*/
String OBSERVE = "observe";
/**
* This method is called to allow the plugin to add {@link org.springframework.beans.factory.config.BeanDefinition}s
* to the {@link org.springframework.beans.factory.support.BeanDefinitionRegistry}.
*
* @param applicationContext The Spring ApplicationContext instance
*/
void doWithApplicationContext(ApplicationContext applicationContext);
/**
* Executes the plugin code that performs runtime configuration as defined in the doWithSpring closure
*
* @param springConfig The RuntimeSpringConfiguration instance
*/
void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig);
/**
* Makes the plugin excluded for a particular BuildScope
* @param buildScope The BuildScope
*/
void addExclude(BuildScope buildScope);
/**
* Makes the plugin excluded for a particular Environment
* @param env The Environment
*/
void addExclude(Environment env);
/**
* Return whether this plugin supports the given PluginScope
*
* @param buildScope The PluginScope
* @return true if it does
*/
boolean supportsScope(BuildScope buildScope);
/**
* Returns whether this plugin supports the given environment name
* @param environment The environment name
* @return true if it does
*/
boolean supportsEnvironment(Environment environment);
/**
* @return true if the current plugin supports the current BuildScope and Environment
*/
boolean supportsCurrentScopeAndEnvironment();
/**
* Write some documentation to the DocumentationContext
*/
void doc(String text);
/**
* Returns the path of the plug-in
*
* @return A String that makes up the path to the plug-in in the format /plugins/plugin-name-PLUGIN_VERSION
*/
String getPluginPath();
/**
* Returns the path of the plug-in using camel case
*
* @return A String that makes up the path to the plug-in in the format /plugins/pluginName-PLUGIN_VERSION
*/
String getPluginPathCamelCase();
/**
* @return The names of the plugins this plugin is dependant on
*/
String[] getDependencyNames();
/**
* @return The names of the plugins this plugin should evict onload
*/
String[] getEvictionNames();
/**
* Retrieves the names of plugins that this plugin should be loaded after. This differs
* from dependencies in that if that plugin doesn't exist this plugin will still be loaded.
* It is a way of enforcing plugins are loaded before, but not necessarily needed
*
* @return The names of the plugins that this plugin should be loaded after
*/
String[] getLoadAfterNames();
/**
* Retrieves the names of plugins that this plugin should be loaded before. As with getLoadAfterNames() it
* is not a requirement that the specified plugins exist
*
* @return The names of the plugins that this plugin should load before
*/
String[] getLoadBeforeNames();
/**
* The version of the specified dependency
*
* @param name the name of the dependency
* @return The version
*/
String getDependentVersion(String name);
PropertySource> getPropertySource();
/**
* Refreshes this Grails plugin reloading any watched resources as necessary
*/
void refresh();
/**
* Retrieves the plugin manager if known, otherwise returns null
* @return The PluginManager or null
*/
GrailsPluginManager getManager();
/**
* Retrieves the wrapped plugin instance for this plugin
* @return The plugin instance
*/
GroovyObject getInstance();
/**
* Sets the plugin manager for this plugin
*
* @param manager A GrailsPluginManager instance
*/
void setManager(GrailsPluginManager manager);
void setApplication(GrailsApplication application);
/**
* Calls a "doWithDynamicMethods" closure that allows a plugin to register dynamic methods at runtime
* @param applicationContext The Spring ApplicationContext instance
*/
void doWithDynamicMethods(ApplicationContext applicationContext);
/**
* @return Whether the plugin is enabled or not
*/
boolean isEnabled();
/**
* Check whether the plugin is enabled for the given profile
* @param activeProfiles
* @return True if it is
*/
boolean isEnabled(String[] activeProfiles);
/**
* Retrieve the plugin names that this plugin is observing for changes
*
* @return The names of the observed plugins
*/
String[] getObservedPluginNames();
/**
* Notifies this plugin of the specified Event calling the onChange listener
*
* @param event The event to listen for
*/
void notifyOfEvent(Map event);
/**
* Notifies the plugin of a specific event for the given event id, which is one of ON_CHANGE, ON_CONFIG_CHANGE
*
* @param eventKind The event kind
* @param source The source of the event
* @return a Map that represents the event
*/
Map notifyOfEvent(int eventKind, Object source);
/**
* Called prior to the initialisation of the GrailsApplication instance to allow the registration
* of additonal ArtefactHandlers
*
* @see grails.core.ArtefactHandler
*
*/
void doArtefactConfiguration();
/**
* Retrieves an array of provided Artefacts that are pre-compiled additions to the GrailsApplication object
* but are overridable by the end-user
*
* @return A list of provided artefacts
*/
Class>[] getProvidedArtefacts();
/**
* Returns the name of the plugin as represented in the file system including the version. For example TagLibGrailsPlugin would result in "tag-lib-0.1"
* @return The file system representation of the plugin name
*/
String getFileSystemName();
/**
* Returns the name of the plugin as represented on the file system without the version. For example TagLibGrailsPlugin would result in "tag-lib"
* @return The file system name
*/
String getFileSystemShortName();
/**
* Returns the underlying class that represents this plugin
* @return The plugin class
*/
Class> getPluginClass();
/**
* A list of resources that the plugin should exclude from the packaged distribution
* @return a List of resources
*/
List getPluginExcludes();
/**
* Returns whether this plugin is loaded from the current plugin. In other words when you execute grails run-app from a plugin project
* the plugin project's *GrailsPlugin.groovy file represents the base plugin and this method will return true for this plugin
*
* @return true if it is the base plugin
*/
boolean isBasePlugin();
/**
* Sets whether this plugin is the base plugin
*
* @param isBase True if is
* @see #isBasePlugin()
*/
void setBasePlugin(boolean isBase);
/**
* Plugin can provide a list of Spring TypeFilters so that annotated components can
* be scanned into the ApplicationContext
* @return A collection of TypeFilter instance
*/
Collection extends TypeFilter> getTypeFilters();
/**
* Resources that this plugin watches
*
* @return The watch resource patterns
*/
List getWatchedResourcePatterns();
/**
* Whether the plugin is interested in a particular change
*
* @param path The path to the resource that changed
* @return true if it is
*/
boolean hasInterestInChange(String path);
/**
* Sets the plugin descriptor for this plugin
*
* @param descriptor The descriptor
*/
void setDescriptor(Resource descriptor);
}