/* * Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, version 2.0. If a copy of the MPL was not distributed with * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This Source Code Form is "Incompatible With Secondary Licenses", as * defined by the Mozilla Public License, version 2.0. */ package com.trollworks.gcs.prereq; import com.trollworks.gcs.criteria.IntegerCriteria; import com.trollworks.gcs.criteria.NumericCompareType; import com.trollworks.gcs.criteria.StringCompareType; import com.trollworks.gcs.criteria.StringCriteria; import com.trollworks.gcs.widgets.outline.ListRow; import com.trollworks.toolkit.io.xml.XMLNodeType; import com.trollworks.toolkit.io.xml.XMLReader; import com.trollworks.toolkit.io.xml.XMLWriter; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; /** * An abstract prerequisite class for comparison of name and level and whether or not the specific * item is present. */ public abstract class NameLevelPrereq extends HasPrereq { /** Provided for sub-classes. */ private static final String TAG_NAME = "name"; //$NON-NLS-1$ private static final String TAG_LEVEL = "level"; //$NON-NLS-1$ private String mTag; private StringCriteria mNameCriteria; private IntegerCriteria mLevelCriteria; /** * Creates a new prerequisite. * * @param tag The tag for this prerequisite. * @param parent The owning prerequisite list, if any. */ public NameLevelPrereq(String tag, PrereqList parent) { super(parent); mTag = tag; mNameCriteria = new StringCriteria(StringCompareType.IS, ""); //$NON-NLS-1$ mLevelCriteria = new IntegerCriteria(NumericCompareType.AT_LEAST, 0); } /** * Loads a prerequisite. * * @param parent The owning prerequisite list, if any. * @param reader The XML reader to load from. */ public NameLevelPrereq(PrereqList parent, XMLReader reader) throws IOException { this(reader.getName(), parent); initializeForLoad(); String marker = reader.getMarker(); loadHasAttribute(reader); do { if (reader.next() == XMLNodeType.START_TAG) { loadSelf(reader); } } while (reader.withinMarker(marker)); } /** * Creates a copy of the specified prerequisite. * * @param parent The owning prerequisite list, if any. * @param prereq The prerequisite to clone. */ protected NameLevelPrereq(PrereqList parent, NameLevelPrereq prereq) { super(parent, prereq); mTag = prereq.mTag; mNameCriteria = new StringCriteria(prereq.mNameCriteria); mLevelCriteria = new IntegerCriteria(prereq.mLevelCriteria); } /** Called so that sub-classes can initialize themselves prior to loading. */ protected void initializeForLoad() { // Does nothing } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof NameLevelPrereq && super.equals(obj)) { NameLevelPrereq nlp = (NameLevelPrereq) obj; return mTag.equals(nlp.mTag) && mNameCriteria.equals(nlp.mNameCriteria) && mLevelCriteria.equals(nlp.mLevelCriteria); } return false; } @Override public void save(XMLWriter out) { out.startTag(mTag); saveHasAttribute(out); out.finishTagEOL(); mNameCriteria.save(out, TAG_NAME); saveSelf(out); if (mLevelCriteria.getType() != NumericCompareType.AT_LEAST || mLevelCriteria.getQualifier() != 0) { mLevelCriteria.save(out, TAG_LEVEL); } out.endTagEOL(mTag, true); } /** @param reader The XML reader to load from. */ protected void loadSelf(XMLReader reader) throws IOException { String name = reader.getName(); if (TAG_NAME.equals(name)) { mNameCriteria.load(reader); } else if (TAG_LEVEL.equals(name)) { mLevelCriteria.load(reader); } else { reader.skipTag(name); } } /** * Called so that sub-classes can save extra data. * * @param out The XML writer to use. */ protected void saveSelf(XMLWriter out) { // Does nothing } /** @return The name comparison object. */ public StringCriteria getNameCriteria() { return mNameCriteria; } /** @return The level comparison object. */ public IntegerCriteria getLevelCriteria() { return mLevelCriteria; } @Override public void fillWithNameableKeys(HashSet<String> set) { ListRow.extractNameables(set, mNameCriteria.getQualifier()); } @Override public void applyNameableKeys(HashMap<String, String> map) { mNameCriteria.setQualifier(ListRow.nameNameables(map, mNameCriteria.getQualifier())); } }