Refactor JSON array parser to not create as many "new ArrayList<>" instances

This commit is contained in:
Oskar Wiksten
2013-07-15 16:38:28 +02:00
parent 9dafe1f410
commit dfe7fde7e3
6 changed files with 59 additions and 62 deletions

View File

@@ -13,9 +13,6 @@ public final class DropList {
public DropList(DropItem[] items) {
this.items = items;
}
public DropList(Collection<DropItem> items) {
this.items = items.toArray(new DropItem[items.size()]);
}
public void createRandomLoot(Loot loot, Player player) {
for (DropItem item : items) {

View File

@@ -6,21 +6,19 @@ import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reply;
import com.gpl.rpg.AndorsTrail.conversation.Phrase.Reward;
import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress;
import com.gpl.rpg.AndorsTrail.resource.TranslationLoader;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class ConversationListParser extends JsonCollectionParserFor<Phrase> {
private final TranslationLoader translationLoader;
private final JsonParserFor<Reply> replyParser = new JsonParserFor<Reply>() {
private final JsonArrayParserFor<Reply> replyParser = new JsonArrayParserFor<Reply>(Reply.class) {
@Override
protected Reply parseObject(JSONObject o) throws JSONException {
JSONObject requires = o.optJSONObject(JsonFieldNames.Reply.requires);
@@ -48,7 +46,7 @@ public final class ConversationListParser extends JsonCollectionParserFor<Phrase
}
};
private final JsonParserFor<Reward> rewardParser = new JsonParserFor<Reward>() {
private final JsonArrayParserFor<Reward> rewardParser = new JsonArrayParserFor<Reward>(Reward.class) {
@Override
protected Reward parseObject(JSONObject o) throws JSONException {
return new Reward(
@@ -67,21 +65,17 @@ public final class ConversationListParser extends JsonCollectionParserFor<Phrase
protected Pair<String, Phrase> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.Phrase.phraseID);
final ArrayList<Reply> replies = new ArrayList<Reply>();
final ArrayList<Reward> rewards = new ArrayList<Reward>();
Reply[] _replies = null;
Reward[] _rewards = null;
try {
replyParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.replies), replies);
rewardParser.parseRows(o.optJSONArray(JsonFieldNames.Phrase.rewards), rewards);
_replies = replyParser.parseArray(o.optJSONArray(JsonFieldNames.Phrase.replies));
_rewards = rewardParser.parseArray(o.optJSONArray(JsonFieldNames.Phrase.rewards));
} catch (JSONException e) {
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) {
L.log("ERROR: parsing phrase " + id + " : " + e.getMessage());
}
}
final Reply[] _replies = replies.toArray(new Reply[replies.size()]);
Reward[] _rewards = rewards.toArray(new Reward[rewards.size()]);
if (_rewards.length == 0) _rewards = null;
return new Pair<String, Phrase>(id, new Phrase(
translationLoader.translateConversationPhrase(o.optString(JsonFieldNames.Phrase.message, null))
, _replies

View File

@@ -1,26 +1,23 @@
package com.gpl.rpg.AndorsTrail.resource.parsers;
import java.util.ArrayList;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.model.item.DropList;
import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection;
import com.gpl.rpg.AndorsTrail.model.item.DropList.DropItem;
import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public final class DropListParser extends JsonCollectionParserFor<DropList> {
private final JsonParserFor<DropItem> dropItemParser;
private final JsonArrayParserFor<DropItem> dropItemParser;
public DropListParser(final ItemTypeCollection itemTypes) {
this.dropItemParser = new JsonParserFor<DropItem>() {
this.dropItemParser = new JsonArrayParserFor<DropItem>(DropItem.class) {
@Override
protected DropItem parseObject(JSONObject o) throws JSONException {
return new DropItem(
@@ -35,13 +32,10 @@ public final class DropListParser extends JsonCollectionParserFor<DropList> {
@Override
protected Pair<String, DropList> parseObject(JSONObject o) throws JSONException {
String droplistID = o.getString(JsonFieldNames.DropList.dropListID);
JSONArray array = o.getJSONArray(JsonFieldNames.DropList.items);
final ArrayList<DropItem> items = new ArrayList<DropItem>();
dropItemParser.parseRows(array, items);
DropItem[] items = dropItemParser.parseArray(o.getJSONArray(JsonFieldNames.DropList.items));
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
if (items.size() <= 0) {
if (items == null) {
L.log("OPTIMIZE: Droplist \"" + droplistID + "\" has no dropped items.");
}
}

View File

@@ -8,21 +8,19 @@ import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.ConstRange;
import com.gpl.rpg.AndorsTrail.util.L;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public final class ItemTraitsParser {
private final JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withDuration;
private final JsonParserFor<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
private final JsonArrayParserFor<ActorConditionEffect> actorConditionEffectParser_withDuration;
private final JsonArrayParserFor<ActorConditionEffect> actorConditionEffectParser_withoutDuration;
public ItemTraitsParser(final ActorConditionTypeCollection actorConditionTypes) {
this.actorConditionEffectParser_withDuration = new JsonParserFor<ActorConditionEffect>() {
this.actorConditionEffectParser_withDuration = new JsonArrayParserFor<ActorConditionEffect>(ActorConditionEffect.class) {
@Override
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
return new ActorConditionEffect(
@@ -33,7 +31,7 @@ public final class ItemTraitsParser {
);
}
};
this.actorConditionEffectParser_withoutDuration = new JsonParserFor<ActorConditionEffect>() {
this.actorConditionEffectParser_withoutDuration = new JsonArrayParserFor<ActorConditionEffect>(ActorConditionEffect.class) {
@Override
protected ActorConditionEffect parseObject(JSONObject o) throws JSONException {
return new ActorConditionEffect(
@@ -51,14 +49,12 @@ public final class ItemTraitsParser {
ConstRange boostCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnUse.increaseCurrentHP));
ConstRange boostCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnUse.increaseCurrentAP));
final ArrayList<ActorConditionEffect> addedConditions_source = new ArrayList<ActorConditionEffect>();
final ArrayList<ActorConditionEffect> addedConditions_target = new ArrayList<ActorConditionEffect>();
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsSource), addedConditions_source);
actorConditionEffectParser_withDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsTarget), addedConditions_target);
ActorConditionEffect[] addedConditions_source = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsSource));
ActorConditionEffect[] addedConditions_target = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnUse.conditionsTarget));
if ( boostCurrentHP == null
&& boostCurrentAP == null
&& addedConditions_source.isEmpty()
&& addedConditions_target.isEmpty()
&& addedConditions_source == null
&& addedConditions_target == null
) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Tried to parseItemTraits_OnUse , where hasEffect=" + o.toString() + ", but all data was empty.");
@@ -71,8 +67,8 @@ public final class ItemTraitsParser {
,boostCurrentHP
,boostCurrentAP
)
,listToArray(addedConditions_source)
,listToArray(addedConditions_target)
,addedConditions_source
,addedConditions_target
);
}
}
@@ -81,21 +77,15 @@ public final class ItemTraitsParser {
if (o == null) return null;
AbilityModifierTraits stats = ResourceParserUtils.parseAbilityModifierTraits(o);
final ArrayList<ActorConditionEffect> addedConditions = new ArrayList<ActorConditionEffect>();
actorConditionEffectParser_withoutDuration.parseRows(o.optJSONArray(JsonFieldNames.ItemTraits_OnEquip.addedConditions), addedConditions);
if (stats == null && addedConditions.isEmpty()) {
ActorConditionEffect[] addedConditions = actorConditionEffectParser_withoutDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnEquip.addedConditions));
if (stats == null && addedConditions == null) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("OPTIMIZE: Tried to parseItemTraits_OnEquip , where hasEffect=" + o.toString() + ", but all data was empty.");
}
return null;
} else {
return new ItemTraits_OnEquip(stats, listToArray(addedConditions));
return new ItemTraits_OnEquip(stats, addedConditions);
}
}
private static ActorConditionEffect[] listToArray(ArrayList<ActorConditionEffect> list) {
if (list.isEmpty()) return null;
return list.toArray(new ActorConditionEffect[list.size()]);
}
}

View File

@@ -3,22 +3,21 @@ package com.gpl.rpg.AndorsTrail.resource.parsers;
import com.gpl.rpg.AndorsTrail.model.quest.Quest;
import com.gpl.rpg.AndorsTrail.model.quest.QuestLogEntry;
import com.gpl.rpg.AndorsTrail.resource.TranslationLoader;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonParserFor;
import com.gpl.rpg.AndorsTrail.util.Pair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.Comparator;
public final class QuestParser extends JsonCollectionParserFor<Quest> {
private final TranslationLoader translationLoader;
private int sortOrder = 0;
private final JsonParserFor<QuestLogEntry> questLogEntryParser = new JsonParserFor<QuestLogEntry>() {
private final JsonArrayParserFor<QuestLogEntry> questLogEntryParser = new JsonArrayParserFor<QuestLogEntry>(QuestLogEntry.class) {
@Override
protected QuestLogEntry parseObject(JSONObject o) throws JSONException {
return new QuestLogEntry(
@@ -44,17 +43,15 @@ public final class QuestParser extends JsonCollectionParserFor<Quest> {
protected Pair<String, Quest> parseObject(JSONObject o) throws JSONException {
final String id = o.getString(JsonFieldNames.Quest.questID);
final ArrayList<QuestLogEntry> stages = new ArrayList<QuestLogEntry>();
questLogEntryParser.parseRows(o.getJSONArray(JsonFieldNames.Quest.stages), stages);
Collections.sort(stages, sortByQuestProgress);
final QuestLogEntry[] stages_ = stages.toArray(new QuestLogEntry[stages.size()]);
QuestLogEntry[] stages = questLogEntryParser.parseArray(o.getJSONArray(JsonFieldNames.Quest.stages));
Arrays.sort(stages, sortByQuestProgress);
++sortOrder;
return new Pair<String, Quest>(id, new Quest(
id
, translationLoader.translateQuestName(o.getString(JsonFieldNames.Quest.name))
, stages_
, stages
, o.optInt(JsonFieldNames.Quest.showInLog, 0) > 0
, sortOrder
));

View File

@@ -0,0 +1,25 @@
package com.gpl.rpg.AndorsTrail.resource.parsers.json;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Array;
import java.util.ArrayList;
public abstract class JsonArrayParserFor<T> extends JsonParserFor<T> {
private final Class<T> classType;
public JsonArrayParserFor(Class<T> classType) {
if (classType == null) throw new IllegalArgumentException("classType for parseArray must not be null");
this.classType = classType;
}
public T[] parseArray(JSONArray array) throws JSONException {
if (array == null) return null;
final ArrayList<T> arrayList = new ArrayList<T>(array.length());
parseRows(array, arrayList);
if (arrayList.isEmpty()) return null;
return arrayList.toArray((T[]) Array.newInstance(classType, arrayList.size()));
}
}