/*
* This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT).
*
* Copyright (c) JCThePants (www.jcwhatever.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.jcwhatever.nucleus.utils.items.loremeta;
import com.jcwhatever.nucleus.collections.wrap.MapWrapper;
import com.jcwhatever.nucleus.utils.PreCon;
import com.jcwhatever.nucleus.utils.items.ItemStackUtils;
import org.bukkit.inventory.ItemStack;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* A collection of {@link LoreMetaItem}.
*/
public class LoreMetaMap extends MapWrapper<String, LoreMetaItem> {
private final Map<String, LoreMetaItem> _map;
/**
* Constructor.
*/
public LoreMetaMap() {
_map = new LinkedHashMap<>(7);
}
/**
* Constructor.
*
* @param items The collection of meta items to initialize with.
*/
public LoreMetaMap(Collection<? extends LoreMetaItem> items) {
PreCon.notNull(items);
_map = new HashMap<>(items.size() + (int)(items.size() * 0.25D));
for (LoreMetaItem item : items)
_map.put(item.getName(), item);
}
/**
* Constructor.
*
* @param itemStack The item stack to parse meta from.
*/
public LoreMetaMap(ItemStack itemStack) {
this(itemStack, LoreMetaParser.get());
}
/**
* Constructor.
*
* @param itemStack The item stack to parse meta from.
* @param parser The parser to use.
*/
public LoreMetaMap(ItemStack itemStack, ILoreMetaParser parser) {
PreCon.notNull(itemStack);
PreCon.notNull(parser);
List<String> lore = ItemStackUtils.getLore(itemStack);
_map = new HashMap<>(lore.size() + 10);
for (String loreLine : lore) {
LoreMetaItem item = parser.parseLoreMeta(loreLine);
if (item != null)
_map.put(item.getName(), item);
}
}
/**
* Add a new meta item to the collection.
*
* <p>Replaces existing value.</p>
*
* @param name The name of the meta.
* @param value The meta value.
*
* @return The newly created {@link LoreMetaItem} instance.
*/
public LoreMetaItem put(String name, String value) {
PreCon.notNullOrEmpty(name);
PreCon.notNull(value);
LoreMetaItem item = new LoreMetaItem(name, value);
_map.put(name, item);
return item;
}
/**
* Add a new meta item to the collection.
*
* <p>Replaces existing value.</p>
*
* @param item The item to put.
*
* @return The previously stored {@link LoreMetaItem} instance.
*/
@Nullable
public LoreMetaItem put(LoreMetaItem item) {
PreCon.notNull(item);
return _map.put(item.getName(), item);
}
/**
* Set the value of a meta item.
*
* <p>Replaces existing value. Adds new value if not found.</p>
*
* @param name The name of the meta.
* @param value The meta value.
*
* @return Self for chaining.
*/
public LoreMetaMap set(String name, String value) {
put(name, value);
return this;
}
/**
* Remove a meta value by name.
*
* @param name The name of the meta.
*
* @return The removed meta item or null if not found.
*/
@Nullable
public LoreMetaItem remove(String name) {
PreCon.notNull(name);
return _map.remove(name);
}
/**
* Get a meta item by name.
*
* @param name The name of the meta.
*
* @return The meta item or null if not found.
*/
@Nullable
public LoreMetaItem get(String name) {
PreCon.notNull(name);
return _map.get(name);
}
/**
* Append meta in the collection to an item stacks lore text.
*
* @param itemStack The item stack.
*/
public void appendTo(ItemStack itemStack) {
appendTo(itemStack, LoreMetaParser.get());
}
/**
* Append meta in the collection to an item stacks lore text.
*
* @param itemStack The item stack.
* @param parser The parser to use.
*/
public void appendTo(ItemStack itemStack, ILoreMetaParser parser) {
PreCon.notNull(itemStack);
LoreMeta.append(itemStack, parser, this.values());
}
/**
* Prepend meta in the collection to an item stacks lore text.
*
* @param itemStack The item stack.
*/
public void prependTo(ItemStack itemStack) {
prependTo(itemStack, LoreMetaParser.get());
}
/**
* Prepend meta in the collection to an item stacks lore text.
*
* @param itemStack The item stack.
* @param parser The parser to use.
*/
public void prependTo(ItemStack itemStack, ILoreMetaParser parser) {
PreCon.notNull(itemStack);
LoreMeta.prepend(itemStack, parser, this.values());
}
@Override
protected Map<String, LoreMetaItem> map() {
return _map;
}
}