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;
28 import java.util.concurrent.CopyOnWriteArrayList;
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 
84  private final Collection<ArchetypeSetListener<G, A, R>> listenerList = new CopyOnWriteArrayList<>();
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) {
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 }
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.addArchetype
void addArchetype(@NotNull final R archetype)
Definition: DefaultArchetypeSet.java:146
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.DefaultArchetypeSet
DefaultArchetypeSet(@NotNull final ArchetypeFactory< G, A, R > archetypeFactory, @Nullable final String imageSet)
Definition: DefaultArchetypeSet.java:91
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.archetypeFactory
final ArchetypeFactory< G, A, R > archetypeFactory
Definition: DefaultArchetypeSet.java:50
net.sf.gridarta
net.sf.gridarta.model.archetype.UndefinedArchetypeException
Definition: UndefinedArchetypeException.java:28
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.getImageSet
String getImageSet()
Definition: DefaultArchetypeSet.java:98
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.listenerList
final Collection< ArchetypeSetListener< G, A, R > > listenerList
Definition: DefaultArchetypeSet.java:84
net.sf
net.sf.gridarta.model.archetype.ArchetypeSetListener
Definition: ArchetypeSetListener.java:30
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.loadedFromArchive
boolean loadedFromArchive
Definition: DefaultArchetypeSet.java:73
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.getArchetype
R getArchetype(@NotNull final String archetypeName)
Definition: DefaultArchetypeSet.java:114
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.archetype.ArchetypeFactory.newUndefinedArchetype
R newUndefinedArchetype(@NotNull String archetypeName)
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.undefinedArchetypes
final Map< String, WeakReference< R > > undefinedArchetypes
Definition: DefaultArchetypeSet.java:79
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.archetypeMap
final Map< String, R > archetypeMap
Definition: DefaultArchetypeSet.java:64
net.sf.gridarta.model.archetype.ArchetypeFactory
Definition: ArchetypeFactory.java:30
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.archetypeset.ArchetypeSet
Definition: ArchetypeSet.java:37
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.setLoadedFromArchive
void setLoadedFromArchive(final boolean loadedFromArchive)
Definition: DefaultArchetypeSet.java:156
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.getArchetypeCount
int getArchetypeCount()
Definition: DefaultArchetypeSet.java:108
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.isLoadedFromArchive
boolean isLoadedFromArchive()
Definition: DefaultArchetypeSet.java:103
net.sf.gridarta.model.baseobject.BaseObject
Definition: BaseObject.java:34
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.getArchetypes
Collection< R > getArchetypes()
Definition: DefaultArchetypeSet.java:167
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.connectFaces
void connectFaces()
Definition: DefaultArchetypeSet.java:195
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.imageSet
final String imageSet
Definition: DefaultArchetypeSet.java:56
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.addArchetypeSetListener
void addArchetypeSetListener(@NotNull final ArchetypeSetListener< G, A, R > listener)
Definition: DefaultArchetypeSet.java:176
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.model.baseobject
Definition: AbstractBaseObject.java:20
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.fireLoadedFromArchiveChangedEvent
void fireLoadedFromArchiveChangedEvent()
Definition: DefaultArchetypeSet.java:188
net.sf.gridarta.model.archetype.DuplicateArchetypeException
Definition: DuplicateArchetypeException.java:29
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.removeArchetypeSetListener
void removeArchetypeSetListener(@NotNull final ArchetypeSetListener< G, A, R > listener)
Definition: DefaultArchetypeSet.java:181
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet
Definition: DefaultArchetypeSet.java:44
net.sf.gridarta.model.archetypeset.DefaultArchetypeSet.getOrCreateArchetype
R getOrCreateArchetype(@NotNull final String archetypeName)
Definition: DefaultArchetypeSet.java:125