/*
* ExperienceMod - Bukkit server plugin for modifying the experience system in Minecraft.
* Copyright (C) 2012 Kristian S. Stangeland
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*/
package com.comphenix.xp.parser.text;
import java.util.Collection;
import java.util.Set;
import org.bukkit.Material;
import com.comphenix.xp.parser.TextParser;
import com.comphenix.xp.parser.ParsingException;
import com.comphenix.xp.parser.Utility;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Iterables;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Sets;
public class ItemNameParser extends TextParser<Set<Integer>> {
protected SetMultimap<String, Integer> lookupMaterial = HashMultimap.create();
public ItemNameParser() {
loadDefaultList();
}
protected void loadDefaultList() {
// Default list of extra materials
register("WOOLDYE", Material.INK_SACK);
register("WOOLDYES", Material.INK_SACK);
register("SLAB", Material.STEP);
register("DOUBLESLAB", Material.DOUBLE_STEP);
register("STONEBRICK", Material.SMOOTH_BRICK);
register("STONEBRICKSTAIRS", Material.SMOOTH_STAIRS);
register("HUGEBROWNMUSHROOM", Material.HUGE_MUSHROOM_1);
register("HUGEREDMUSHROOM", Material.HUGE_MUSHROOM_2);
register("SILVERFISHBLOCK", Material.MONSTER_EGGS);
register("RECORD1", Material.GOLD_RECORD);
register("RECORD2", Material.GREEN_RECORD);
register("BOTTLEOENCHANTING", Material.EXP_BOTTLE);
// Add every other material with no spaces
for (Material material : Material.values()) {
register(material.name().replace("_", ""), material);
}
}
/**
* Registers a new material for the item parser.
* @param name - name of the material. Only capital letters and no underscores/spaces.
* @param material - the associated material.
*/
public void register(String name, Material material) {
register(name, material.getId());
}
/**
* Registers a new material for the item parser.
* @param name - name of the material. Only capital letters and no underscores/spaces.
* @param id - the associated material id.
*/
public void register(String name, Integer id) {
lookupMaterial.put(name, id);
}
/**
* Retrieves the set of registered IDs directly.
* @param name - material to find.
* @return Collection of registered IDs by this name.
*/
public Collection<Integer> getRegistered(String name) {
return lookupMaterial.get(name);
}
/**
* Retrieves the first registered item, or NULL if not found.
* @param name - the name of the item to search for.
* @return ID of the first registered item, or NULL if not found.
*/
public Integer getFirstRegistered(String name) {
Collection<Integer> registered = getRegistered(name);
return Iterables.getFirst(registered, null);
}
/**
* Dissociates the given name by the given ID.
* @param name - name to find.
* @param id - ID to remove.
*/
public void unregister(String name, Integer id) {
lookupMaterial.remove(name, id);
}
/**
* Determines the item, either by ID or name, of the given string of characters.
* @param text String of characters.
* @return ID of the item parsed.
* @throws ParsingException Invoked when an unrecognized item name is given.
*/
@Override
public Set<Integer> parse(String text) throws ParsingException {
if (Utility.isNullOrIgnoreable(text))
throw new ParsingException("Text cannot be empty or null.");
// Try both integers and named values
Integer itemID = tryParse(text);
String filtered = Utility.getEnumName(text).replace("_", "");
// Use the lookup table
if (filtered.length() > 0 && lookupMaterial.containsKey(filtered))
return lookupMaterial.get(filtered);
else if (itemID == null)
throw ParsingException.fromFormat("Unable to find item %s.", text);
return Sets.newHashSet(itemID);
}
}