Gridarta Editor
PluginModel.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 java.io.File;
23 import java.io.FileOutputStream;
24 import java.io.IOException;
25 import java.util.Collection;
26 import java.util.Collections;
27 import java.util.Iterator;
28 import java.util.Map;
29 import java.util.TreeMap;
30 import java.util.concurrent.CopyOnWriteArrayList;
35 import nu.xom.Document;
36 import nu.xom.Element;
37 import nu.xom.ParsingException;
38 import nu.xom.Serializer;
39 import org.apache.log4j.Category;
40 import org.apache.log4j.Logger;
41 import org.jetbrains.annotations.NotNull;
42 import org.jetbrains.annotations.Nullable;
43 import org.xml.sax.SAXException;
44 
49 public class PluginModel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Iterable<Plugin<G, A, R>> {
50 
54  @NotNull
55  private static final Category LOG = Logger.getLogger(PluginModel.class);
56 
57  @NotNull
59 
60  @NotNull
62 
63  @NotNull
64  private final Map<String, Plugin<G, A, R>> plugins = new TreeMap<>();
65 
70  @NotNull
71  private final Collection<PluginModelListener<G, A, R>> listeners = new CopyOnWriteArrayList<>();
72 
74  this.pluginParameterFactory = pluginParameterFactory;
75  this.pluginModelParser = pluginModelParser;
76  }
77 
78  @Nullable
79  public Plugin<G, A, R> getPlugin(@NotNull final String name) {
80  return plugins.get(name);
81  }
82 
83  public int getPluginCount() {
84  return plugins.size();
85  }
86 
87  @Nullable
88  public Plugin<G, A, R> getPlugin(final int index) {
89  final Iterator<Plugin<G, A, R>> it = plugins.values().iterator();
90  Plugin<G, A, R> m = null;
91  int i = index;
92  while (it.hasNext() && i-- >= 0) {
93  m = it.next();
94  }
95  return i >= 0 ? null : m;
96  }
97 
104  public boolean addPlugin(@NotNull final Plugin<G, A, R> plugin) {
105  if (plugins.containsKey(plugin.getName())) {
106  return false;
107  }
108 
109  plugins.put(plugin.getName(), plugin);
110  firePluginCreatedEvent(plugin);
112  return true;
113  }
114 
115  public void addPlugin(@NotNull final File file) {
116  try {
118  } catch (final IOException ex) {
119  LOG.warn("can't load plugin: " + ex.getMessage());
120  } catch (final ParsingException | SAXException ex) {
121  LOG.warn("can't parse plugin: " + ex.getMessage());
122  }
123  }
124 
125  public void removePlugin(@NotNull final Plugin<G, A, R> plugin) {
126  if (!plugins.containsKey(plugin.getName())) {
127  throw new IllegalArgumentException("plugin does not exist: " + plugin.getName());
128  }
129 
131  firePluginDeletedEvent(plugin);
132  plugins.remove(plugin.getName());
133  }
134 
141  public void savePlugin(@NotNull final Plugin<G, A, R> plugin, @NotNull final File file) throws IOException {
142  try (FileOutputStream fos = new FileOutputStream(file)) {
143  final Element root = pluginModelParser.toXML(plugin);
144  final Document d = new Document(root);
145  final Serializer serializer = new Serializer(fos, "UTF-8");
146  serializer.setIndent(2);
147  serializer.write(d);
148  }
149  }
150 
155  public void addPluginModelListener(@NotNull final PluginModelListener<G, A, R> listener) {
156  listeners.add(listener);
157  }
158 
163  public void removePluginModelListener(@NotNull final PluginModelListener<G, A, R> listener) {
164  listeners.remove(listener);
165  }
166 
171  private void firePluginCreatedEvent(@NotNull final Plugin<G, A, R> plugin) {
172  for (final PluginModelListener<G, A, R> listener : listeners) {
173  listener.pluginCreated(plugin);
174  }
175  }
176 
181  private void firePluginDeletedEvent(@NotNull final Plugin<G, A, R> plugin) {
182  for (final PluginModelListener<G, A, R> listener : listeners) {
183  listener.pluginDeleted(plugin);
184  }
185  }
186 
191  private void firePluginRegisteredEvent(@NotNull final Plugin<G, A, R> plugin) {
192  for (final PluginModelListener<G, A, R> listener : listeners) {
193  listener.pluginRegistered(plugin);
194  }
195  }
196 
201  private void firePluginUnregisteredEvent(@NotNull final Plugin<G, A, R> plugin) {
202  for (final PluginModelListener<G, A, R> listener : listeners) {
203  listener.pluginUnregistered(plugin);
204  }
205  }
206 
207  @NotNull
208  @Override
209  public Iterator<Plugin<G, A, R>> iterator() {
210  return Collections.unmodifiableCollection(plugins.values()).iterator();
211  }
212 
213  public void reRegister(@NotNull final Plugin<G, A, R> plugin) {
216  }
217 
218  @Nullable
219  public Plugin<G, A, R> newPlugin(@NotNull final String name, @NotNull final String code) {
220  final Plugin<G, A, R> plugin = new Plugin<>(name, pluginParameterFactory);
221  plugin.setCode(code);
222  return addPlugin(plugin) ? plugin : null;
223  }
224 
225 }
net.sf.gridarta.plugin
Definition: BshRunnable.java:20
net.sf.gridarta.plugin.PluginModelParser.toXML
Element toXML(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModelParser.java:135
net.sf.gridarta.plugin.PluginModel.newPlugin
Plugin< G, A, R > newPlugin(@NotNull final String name, @NotNull final String code)
Definition: PluginModel.java:219
net.sf.gridarta
net.sf.gridarta.plugin.PluginModel.addPluginModelListener
void addPluginModelListener(@NotNull final PluginModelListener< G, A, R > listener)
Definition: PluginModel.java:155
net.sf.gridarta.plugin.PluginModel.removePlugin
void removePlugin(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:125
net.sf.gridarta.plugin.PluginModel.removePluginModelListener
void removePluginModelListener(@NotNull final PluginModelListener< G, A, R > listener)
Definition: PluginModel.java:163
net.sf.gridarta.plugin.PluginModelListener< G, A, R >
net.sf.gridarta.plugin.PluginModelLoader
Definition: PluginModelLoader.java:47
net.sf.gridarta.plugin.PluginModel.addPlugin
boolean addPlugin(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:104
net.sf
net.sf.gridarta.plugin.PluginModelParser< G, A, R >
net.sf.gridarta.plugin.PluginModel.listeners
final Collection< PluginModelListener< G, A, R > > listeners
Definition: PluginModel.java:71
net.sf.gridarta.plugin.PluginModel.LOG
static final Category LOG
Definition: PluginModel.java:55
net.sf.gridarta.plugin.Plugin.setCode
void setCode(@NotNull final String code)
Definition: Plugin.java:165
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
plugins
Definition: BoilerPlugin.java:39
net.sf.gridarta.plugin.PluginModel.iterator
Iterator< Plugin< G, A, R > > iterator()
Definition: PluginModel.java:209
net.sf.gridarta.plugin.PluginModel.firePluginUnregisteredEvent
void firePluginUnregisteredEvent(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:201
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.plugin.PluginModel.pluginModelParser
final PluginModelParser< G, A, R > pluginModelParser
Definition: PluginModel.java:61
net.sf.gridarta.plugin.PluginModel.reRegister
void reRegister(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:213
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.plugin.PluginModel.getPlugin
Plugin< G, A, R > getPlugin(@NotNull final String name)
Definition: PluginModel.java:79
net.sf.gridarta.plugin.PluginModel.savePlugin
void savePlugin(@NotNull final Plugin< G, A, R > plugin, @NotNull final File file)
Definition: PluginModel.java:141
net.sf.gridarta.plugin.PluginModel.PluginModel
PluginModel(@NotNull final PluginParameterFactory< G, A, R > pluginParameterFactory, @NotNull final PluginModelParser< G, A, R > pluginModelParser)
Definition: PluginModel.java:73
net.sf.gridarta.plugin.PluginModel.getPlugin
Plugin< G, A, R > getPlugin(final int index)
Definition: PluginModel.java:88
net.sf.gridarta.plugin.PluginModel.addPlugin
void addPlugin(@NotNull final File file)
Definition: PluginModel.java:115
net.sf.gridarta.plugin.PluginModel.firePluginCreatedEvent
void firePluginCreatedEvent(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:171
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.plugin.Plugin< G, A, R >
net.sf.gridarta.plugin.PluginModel.pluginParameterFactory
final PluginParameterFactory< G, A, R > pluginParameterFactory
Definition: PluginModel.java:58
net.sf.gridarta.plugin.PluginModel.firePluginRegisteredEvent
void firePluginRegisteredEvent(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:191
net.sf.gridarta.plugin.parameter.PluginParameterFactory
Definition: PluginParameterFactory.java:37
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.plugin.PluginModel.firePluginDeletedEvent
void firePluginDeletedEvent(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:181
net.sf.gridarta.plugin.parameter
Definition: AbstractPathParameter.java:20
net.sf.gridarta.plugin.PluginModel.getPluginCount
int getPluginCount()
Definition: PluginModel.java:83
net.sf.gridarta.plugin.PluginModel
Definition: PluginModel.java:49