Gridarta Editor
DefaultArchetypeSet.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.model.archetypeset;
21 
22 import java.lang.ref.WeakReference;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.LinkedHashMap;
27 import java.util.Map;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
39 
44 public class DefaultArchetypeSet<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements ArchetypeSet<G, A, R> {
45 
49  @NotNull
51 
55  @Nullable
56  private final String imageSet;
57 
64  private final Map<String, R> archetypeMap = new LinkedHashMap<>();
65 
73  private boolean loadedFromArchive;
74 
79  private final Map<String, WeakReference<R>> undefinedArchetypes = new HashMap<>();
80 
85 
91  public DefaultArchetypeSet(@NotNull final ArchetypeFactory<G, A, R> archetypeFactory, @Nullable final String imageSet) {
92  this.archetypeFactory = archetypeFactory;
93  this.imageSet = imageSet;
94  }
95 
96  @Nullable
97  @Override
98  public String getImageSet() {
99  return imageSet;
100  }
101 
102  @Override
103  public boolean isLoadedFromArchive() {
104  return loadedFromArchive;
105  }
106 
107  @Override
108  public int getArchetypeCount() {
109  return archetypeMap.size();
110  }
111 
112  @NotNull
113  @Override
114  public R getArchetype(@NotNull final String archetypeName) throws UndefinedArchetypeException {
115  final R archetype = archetypeMap.get(archetypeName);
116  if (archetype == null) {
117  throw new UndefinedArchetypeException(archetypeName);
118  }
119 
120  return archetype;
121  }
122 
123  @NotNull
124  @Override
125  public R getOrCreateArchetype(@NotNull final String archetypeName) {
126  try {
127  return getArchetype(archetypeName);
128  } catch (final UndefinedArchetypeException ignored) {
129  synchronized (undefinedArchetypes) {
130  final WeakReference<R> existingUndefinedArchetypeRef = undefinedArchetypes.get(archetypeName);
131  if (existingUndefinedArchetypeRef != null) {
132  final R existingUndefinedArchetype = existingUndefinedArchetypeRef.get();
133  if (existingUndefinedArchetype != null) {
134  return existingUndefinedArchetype;
135  }
136  }
137 
138  final R newArchetype = archetypeFactory.newUndefinedArchetype(archetypeName);
139  undefinedArchetypes.put(archetypeName, new WeakReference<>(newArchetype));
140  return newArchetype;
141  }
142  }
143  }
144 
145  @Override
146  public void addArchetype(@NotNull final R archetype) throws DuplicateArchetypeException {
147  final String name = archetype.getArchetypeName();
148  if (archetypeMap.containsKey(name)) {
149  throw new DuplicateArchetypeException(name);
150  }
151 
152  archetypeMap.put(name, archetype);
153  }
154 
155  @Override
156  public void setLoadedFromArchive(final boolean loadedFromArchive) {
157  if (this.loadedFromArchive == loadedFromArchive) {
158  return;
159  }
160 
161  this.loadedFromArchive = loadedFromArchive;
163  }
164 
165  @NotNull
166  @Override
167  public Collection<R> getArchetypes() {
168  return Collections.unmodifiableCollection(archetypeMap.values());
169  }
170 
175  @Override
176  public void addArchetypeSetListener(@NotNull final ArchetypeSetListener<G, A, R> listener) {
177  listenerList.add(listener);
178  }
179 
180  @Override
181  public void removeArchetypeSetListener(@NotNull final ArchetypeSetListener<G, A, R> listener) {
182  listenerList.remove(listener);
183  }
184 
189  for (final ArchetypeSetListener<G, A, R> listener : listenerList.getListeners()) {
190  listener.loadedFromArchiveChanged();
191  }
192  }
193 
194  @Override
195  public void connectFaces() {
196  for (final BaseObject<G, A, R, ?> archetype : getArchetypes()) {
197  archetype.setObjectFace();
198  }
199  }
200 
201 }
void setLoadedFromArchive(final boolean loadedFromArchive)
Interface for listeners listening to ArchetypeSet changes.
T [] getListeners()
Returns an array of all the listeners.
final ArchetypeFactory< G, A, R > archetypeFactory
The archetype factory to use.
A factory for creating Archetype instances.
Base package of all Gridarta classes.
boolean loadedFromArchive
Whether Archetypes were loaded form an archive.
final EventListenerList2< ArchetypeSetListener< G, A, R > > listenerList
The ArchetypeSetListeners to inform of changes.
R getOrCreateArchetype(@NotNull final String archetypeName)
Reflects a game object (object on a map).
Definition: GameObject.java:36
final Map< String, WeakReference< R > > undefinedArchetypes
The archetypes used for game objects which reference undefined archetypes.
void remove(@NotNull final T listener)
Removes a listener.
An Exception indicating that an Archetype name is not unique.
GameObjects are the objects based on Archetypes found on maps.
void add(@NotNull final T listener)
Adds a listener.
void addArchetypeSetListener(@NotNull final ArchetypeSetListener< G, A, R > listener)
Register an ArchetypeSetListener.
void fireLoadedFromArchiveChangedEvent()
Notifies all listeners that isLoadedFromArchive() has changed.
DefaultArchetypeSet(@NotNull final ArchetypeFactory< G, A, R > archetypeFactory, @Nullable final String imageSet)
Create an DefaultArchetypeSet.
final Map< String, R > archetypeMap
The defined Archetypes mapped by name.
Type-safe version of EventListenerList.
Interface that captures similarities between different ArchetypeSet implementations.
void removeArchetypeSetListener(@NotNull final ArchetypeSetListener< G, A, R > listener)
R newUndefinedArchetype(@NotNull String archetypeName)
Creates a new undefined archetype instance.