Gridarta Editor
Plugin.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.plugin;
21 
22 import bsh.EvalError;
23 import bsh.Interpreter;
24 import java.io.File;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.Iterator;
28 import java.util.List;
40 import nu.xom.Element;
41 import nu.xom.Node;
42 import org.apache.log4j.Category;
43 import org.apache.log4j.Logger;
44 import org.jetbrains.annotations.NotNull;
45 import org.jetbrains.annotations.Nullable;
46 
52 public class Plugin<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Iterable<PluginParameter<G, A, R, ?>> {
53 
57  @NotNull
58  private static final Category LOG = Logger.getLogger(Plugin.class);
59 
63  @NotNull
64  private String code = "";
65 
69  @NotNull
70  private final List<PluginParameter<G, A, R, ?>> parameters = new ArrayList<>();
71 
75  @NotNull
76  private final String name;
77 
81  @NotNull
83 
88  @NotNull
90 
94  private boolean autoBoot;
95 
99  private boolean filter;
100 
104  private boolean script;
105 
109  @NotNull
111 
116  @Nullable
117  private File file;
118 
122  private boolean modified;
123 
128  @NotNull
129  private final PluginParameterListener pluginParameterListener = this::setModified;
130 
137  public Plugin(@NotNull final String name, @NotNull final PluginParameterFactory<G, A, R> pluginParameterFactory) {
138  this.name = name;
139  this.pluginParameterFactory = pluginParameterFactory;
140  }
141 
146  @NotNull
147  public String getName() {
148  return name;
149  }
150 
155  @NotNull
156  public String getCode() {
157  return code;
158  }
159 
164  public void setCode(@NotNull final String code) {
165  if (this.code.equals(code)) {
166  return;
167  }
168 
169  this.code = code;
170  setModified();
171  }
172 
177  public boolean hasParameters() {
178  return !parameters.isEmpty();
179  }
180 
186  public int getParameter(@NotNull final String parameterName) {
187  int index = 0;
188  for (final PluginParameter<G, A, R, ?> parameter : parameters) {
189  if (parameter.getName().equals(parameterName)) {
190  return index;
191  }
192  index++;
193  }
194  return -1;
195  }
196 
197  @NotNull
198  @Override
199  public String toString() {
200  return name;
201  }
202 
206  public void newParameter() {
207  final PluginParameter<G, A, R, ?> pluginParameter;
208  try {
209  pluginParameter = pluginParameterFactory.createParameter(StringParameter.PARAMETER_TYPE);
210  } catch (final NoSuchParameterException ex) {
211  LOG.warn("Cannot create parameter: " + ex.getMessage());
212  return;
213  }
214  parameters.add(pluginParameter);
215  pluginParameter.addPluginParameterListener(pluginParameterListener);
216  setModified();
218  }
219 
224  public void removeParameter(final int index) {
225  parameters.remove(index).removePluginParameterListener(pluginParameterListener);
226  setModified();
228  }
229 
234  public void addPluginListener(@NotNull final PluginListener listener) {
235  listeners.add(listener);
236  }
237 
242  public void removePluginListener(@NotNull final PluginListener listener) {
243  listeners.remove(listener);
244  }
245 
251  for (final PluginListener listener : listeners.getListeners()) {
252  listener.parametersChanged();
253  }
254  }
255 
262  @NotNull
265  model.code = code;
266  model.autoBoot = autoBoot;
267  model.filter = filter;
268  model.script = script;
269  model.file = file;
270  model.modified = modified;
271  for (final PluginParameter<G, A, R, ?> parameter : parameters) {
272  final Element parameterXml = codec.toXML(parameter);
273  final PluginParameter<G, A, R, ?> clonedParam;
274  try {
275  clonedParam = pluginParameterFactory.createParameter(parameterXml);
276  } catch (final NoSuchParameterException ex) {
277  throw new AssertionError(ex);
278  }
279  model.addParameter(clonedParam);
280  }
281  return model;
282  }
283 
288  public void addParameter(@NotNull final PluginParameter<G, A, R, ?> pluginParameter) {
289  parameters.add(pluginParameter);
290  pluginParameter.addPluginParameterListener(pluginParameterListener);
291  setModified();
293  }
294 
303  try {
304  return parameters.get(index);
305  } catch (final IndexOutOfBoundsException ignored) {
306  //noinspection ThrowInsideCatchBlockWhichIgnoresCaughtException
307  throw new NoSuchParameterException(index);
308  }
309  }
310 
315  public boolean isAutoBoot() {
316  return autoBoot;
317  }
318 
323  public boolean isScript() {
324  return script;
325  }
326 
331  public boolean isFilter() {
332  return filter;
333  }
334 
339  public void setAutoBoot(final boolean autoBoot) {
340  if (this.autoBoot == autoBoot) {
341  return;
342  }
343  this.autoBoot = autoBoot;
344  setModified();
345  }
346 
351  public void setScript(final boolean script) {
352  if (this.script == script) {
353  return;
354  }
355  this.script = script;
356  setModified();
357  }
358 
363  public void setFilter(final boolean filter) {
364  if (this.filter == filter) {
365  return;
366  }
367  this.filter = filter;
368  setModified();
369  }
370 
377  public void convertType(@NotNull final PluginParameter<G, A, R, ?> pluginParameter, @NotNull final String newType) throws NoSuchParameterException {
378  final int index = parameters.indexOf(pluginParameter);
379  if (index == -1) {
380  throw new NoSuchParameterException(pluginParameter);
381  }
382  final PluginParameter<G, A, R, ?> newParameter = pluginParameterFactory.createParameter(newType);
383  final PluginParameter<G, A, R, ?> oldParameter = parameters.set(index, newParameter);
384  oldParameter.removePluginParameterListener(pluginParameterListener);
385  newParameter.addPluginParameterListener(pluginParameterListener);
386  setModified();
388  }
389 
394  public boolean isModified() {
395  return modified;
396  }
397 
401  public void resetModified() {
402  modified = false;
403  }
404 
408  private void setModified() {
409  modified = true;
410  }
411 
417  @Nullable
418  public File getFile() {
419  return file;
420  }
421 
426  public void setFile(@Nullable final File file) {
427  this.file = file;
428  }
429 
430  @NotNull
431  @Override
432  public Iterator<PluginParameter<G, A, R, ?>> iterator() {
433  return Collections.unmodifiableList(parameters).iterator();
434  }
435 
436  public void runPlugin(@NotNull final PluginParameters pluginParameters) {
437  final Interpreter runner = new Interpreter();
438  try {
439  pluginParameters.setInterpreterValues(runner, PluginRunMode.AUTO_RUN);
440  runner.eval(code);
441  } catch (final EvalError e) {
442  LOG.warn("Evaluation error on (auto-run)" + name, e);
443  }
444  }
445 
446  @Nullable
447  public Filter<?, ?> getPluginAsFilter(@NotNull final PluginParameters pluginParameters) {
448  final Interpreter runner = new Interpreter();
449  try {
450  pluginParameters.setInterpreterValues(runner, PluginRunMode.FILTER);
451  return (Filter<?, ?>) runner.eval(code);
452  } catch (final EvalError e) {
453  LOG.warn("Evaluation error on (filter)" + name, e);
454  } catch (final ClassCastException e) {
455  LOG.warn("Plugin did not return a net.sf.gridarta.model.filter.Filter object" + name, e);
456  }
457  return null;
458  }
459 
465  @NotNull
466  public Node toXML(@NotNull final PluginParameter<G, A, R, ?> pluginParameter) {
467  return codec.toXML(pluginParameter);
468  }
469 
470 }
void setFile(@Nullable final File file)
Sets the location to save this plugin to.
Definition: Plugin.java:426
T [] getListeners()
Returns an array of all the listeners.
File file
The location to save this plugin to; set to.
Definition: Plugin.java:117
Interface for Filters.
Definition: Filter.java:33
boolean isScript()
Returns whether this plugin is a stand-alone plugin.
Definition: Plugin.java:323
void setScript(final boolean script)
Sets whether this plugin is a stand-alone plugin.
Definition: Plugin.java:351
void setAutoBoot(final boolean autoBoot)
Sets whether this plugin is run whenever the editor starts.
Definition: Plugin.java:339
final List< PluginParameter< G, A, R, ?> > parameters
The PluginParameters for this plugin.
Definition: Plugin.java:70
Converts PluginParameters from or to XML encoding.
boolean isAutoBoot()
Returns whether this plugin is run whenever the editor starts.
Definition: Plugin.java:315
Filter<?, ?> getPluginAsFilter(@NotNull final PluginParameters pluginParameters)
Definition: Plugin.java:447
boolean isFilter()
Returns whether this plugin is a filter.
Definition: Plugin.java:331
int getParameter(@NotNull final String parameterName)
Returns the index for a plugin parameter name.
Definition: Plugin.java:186
void addParameter(@NotNull final PluginParameter< G, A, R, ?> pluginParameter)
Adds a plugin parameter to this plugin.
Definition: Plugin.java:288
PluginParameter< G, A, R, ?> getParameter(final int index)
Returns the PluginParameter at a given index.
Definition: Plugin.java:302
Base package of all Gridarta classes.
Reflects a game object (object on a map).
Definition: GameObject.java:36
final PluginParameterVisitor< G, A, R, Element > toXML
A PluginParameterVisitor that returns XML representation.
final PluginParameterListener pluginParameterListener
The PluginParameterListener that is attached to all plugin parameters to detect changes.
Definition: Plugin.java:129
String getName()
Returns the name of this plugin.
Definition: Plugin.java:147
void remove(@NotNull final T listener)
Removes a listener.
Plugin(@NotNull final String name, @NotNull final PluginParameterFactory< G, A, R > pluginParameterFactory)
Creates a new instance.
Definition: Plugin.java:137
Plugin< G, A, R > clonePlugin()
Returns a clone copy of this plugin.
Definition: Plugin.java:263
GameObjects are the objects based on Archetypes found on maps.
Interface for listeners interested in PluginParameter related events.
void setModified()
Marks this plugin a modified since last save.
Definition: Plugin.java:408
File getFile()
Returns the location to save this plugin to.
Definition: Plugin.java:418
void add(@NotNull final T listener)
Adds a listener.
static final String PARAMETER_TYPE
The string representation of this parameter type.
boolean hasParameters()
Returns whether this plugin has at least one parameter.
Definition: Plugin.java:177
void convertType(@NotNull final PluginParameter< G, A, R, ?> pluginParameter, @NotNull final String newType)
Changes the type of a plugin parameter.
Definition: Plugin.java:377
The run mode of a plugin plugin.
final EventListenerList2< PluginListener > listeners
The PluginListeners to inform about changes.
Definition: Plugin.java:110
void notifyParametersChangedListeners()
Notifies all registered PluginListeners that the parameters have changed.
Definition: Plugin.java:250
Node toXML(@NotNull final PluginParameter< G, A, R, ?> pluginParameter)
Returns XML representation for a PluginParameter.
Definition: Plugin.java:466
String getCode()
Returns the executable code of this plugin.
Definition: Plugin.java:156
void removePluginListener(@NotNull final PluginListener listener)
Removes a PluginListener to be notified about changes.
Definition: Plugin.java:242
Makes basic Gridarta classes available to scripts.
void newParameter()
Creates a new plugin parameter.
Definition: Plugin.java:206
final PluginParameterFactory< G, A, R > pluginParameterFactory
The PluginParameterFactory for creating plugin parameters.
Definition: Plugin.java:82
Model for plugins.
Definition: Plugin.java:52
boolean script
Whether this plugin is a stand-alone plugin.
Definition: Plugin.java:104
Type-safe version of EventListenerList.
void runPlugin(@NotNull final PluginParameters pluginParameters)
Definition: Plugin.java:436
final String name
The plugin name.
Definition: Plugin.java:76
void removePluginParameterListener(@NotNull PluginParameterListener listener)
Removes a listener to be notified.
Iterator< PluginParameter< G, A, R, ?> > iterator()
Definition: Plugin.java:432
Interface for listeners interested in Plugin related events.
static final Category LOG
The Logger for printing log messages.
Definition: Plugin.java:58
boolean filter
Whether this plugin is a filter.
Definition: Plugin.java:99
void resetModified()
Marks the plugin as unmodified since last save.
Definition: Plugin.java:401
void setFilter(final boolean filter)
Sets whether this plugin is a filter.
Definition: Plugin.java:363
void addPluginParameterListener(@NotNull PluginParameterListener listener)
Adds a listener to be notified.
String code
The executable code.
Definition: Plugin.java:64
void setCode(@NotNull final String code)
Sets the executable code of this plugin.
Definition: Plugin.java:164
boolean modified
Whether the plugin contents has been modified since last save.
Definition: Plugin.java:122
final PluginParameterCodec< G, A, R > codec
The PluginParameterCodec for converting PluginParameters to or from XML representation.
Definition: Plugin.java:89
A PluginParameter that holds a string value.
boolean isModified()
Returns whether the plugin contents have been modified since last save.
Definition: Plugin.java:394
void addPluginListener(@NotNull final PluginListener listener)
Adds a PluginListener to be notified about changes.
Definition: Plugin.java:234
boolean autoBoot
Whether this plugin is run whenever the editor starts.
Definition: Plugin.java:94
PluginParameter< G, A, R, ?> createParameter(@NotNull final Element parameterNode)
void removeParameter(final int index)
Removes a plugin parameter.
Definition: Plugin.java:224