diff --git a/Java/src/main/java/com/gildedrose/enums/AttributeType.java b/Java/src/main/java/com/gildedrose/enums/AttributeType.java new file mode 100644 index 00000000..96dae862 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/enums/AttributeType.java @@ -0,0 +1,8 @@ +package com.gildedrose.enums; + +public enum AttributeType { + + SELL, + QUALITY; + +} diff --git a/Java/src/main/java/com/gildedrose/enums/CountType.java b/Java/src/main/java/com/gildedrose/enums/CountType.java new file mode 100644 index 00000000..b0b63bd1 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/enums/CountType.java @@ -0,0 +1,9 @@ +package com.gildedrose.enums; + +public enum CountType { + + PLUS, + MINUS, + NONE; + +} diff --git a/Java/src/main/java/com/gildedrose/generic/EventHandler.java b/Java/src/main/java/com/gildedrose/generic/EventHandler.java new file mode 100644 index 00000000..bc52ef67 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/generic/EventHandler.java @@ -0,0 +1,32 @@ +package com.gildedrose.generic; + +import com.gildedrose.Item; + +/*** + * EventHandler helps to upgrade/degrade the items + * @author VIJAY G + * + */ +public interface EventHandler { + + default void increaseQualityByValue(Item item, Integer value) { + item.quality += value; + } + + default void decreaseQualityByValue(Item item, Integer value) { + item.quality -= value; + } + + default void increaseSellInByValue(Item item, Integer value) { + item.sellIn += value; + } + + default void decreaseSellInByValue(Item item, Integer value) { + item.sellIn -= value; + } + + default void neutralizeQuality(Item item) { + item.quality = 0; + } + +} diff --git a/Java/src/main/java/com/gildedrose/generic/IItemType.java b/Java/src/main/java/com/gildedrose/generic/IItemType.java new file mode 100644 index 00000000..99390192 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/generic/IItemType.java @@ -0,0 +1,49 @@ +package com.gildedrose.generic; + +import com.gildedrose.Item; +import com.gildedrose.enums.CountType; +import com.gildedrose.enums.AttributeType; + +/*** + * IItemType helps to update the quality of the item + * on daily basis and type of item invokes + * @author VIJAY G + * + * @param - Type of item + */ +public interface IItemType extends EventHandler { + + int MIN = 0; + int MAX = 50; + int INCREMENTOR = 1; + + default void updateQuality(Item item) { + if(isValid(item, AttributeType.QUALITY) && CountType.PLUS.equals(getT().getQualityType())) { + increaseQualityByValue(item, getIncrementor(item)); + } else if(isValid(item, AttributeType.QUALITY) && CountType.MINUS.equals(getT().getQualityType())) { + decreaseQualityByValue(item, getIncrementor(item)); + } + if(isValid(item, AttributeType.SELL) && CountType.PLUS.equals(getT().getSellType())) { + increaseSellInByValue(item, getIncrementor(item)); + } else if(isValid(item, AttributeType.SELL) && CountType.MINUS.equals(getT().getSellType())) { + decreaseSellInByValue(item, getIncrementor(item)); + } + + if(isNeutralized(item)) { + neutralizeQuality(item); + } + } + + default int getIncrementor(Item item) { + return INCREMENTOR; + } + + default boolean isNeutralized(Item item) { + return false; + } + + boolean isValid(Item item, AttributeType dayType); + + ItemType getT(); + +} diff --git a/Java/src/main/java/com/gildedrose/generic/ItemType.java b/Java/src/main/java/com/gildedrose/generic/ItemType.java new file mode 100644 index 00000000..179c0258 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/generic/ItemType.java @@ -0,0 +1,60 @@ +package com.gildedrose.generic; + +import com.gildedrose.Item; +import com.gildedrose.enums.CountType; +import com.gildedrose.enums.AttributeType; + +/*** + * ItemType provides as a template for all types of items, + * which can be appendable/detachable to the system at any time. + * @author VIJAY G + * + * @param + */ +public abstract class ItemType implements IItemType { + + private boolean validationRequired; + private CountType sellType; + private CountType qualityType; + + protected ItemType(boolean validationRequired, CountType sellType, CountType qualityType) { + this.validationRequired = validationRequired; + this.sellType = sellType; + this.qualityType = qualityType; + } + + public boolean isValid(Item item, AttributeType dayType) { + boolean validationRequired = getT().isValidationRequired(); + if(!validationRequired) { + return true; + } + if(dayType.equals(AttributeType.QUALITY) && CountType.PLUS.equals(getT().getQualityType())) { + return item.quality < MAX; + } else if(dayType.equals(AttributeType.QUALITY) && CountType.MINUS.equals(getT().getQualityType())) { + return item.quality > MIN; + } + if(dayType.equals(AttributeType.SELL) && CountType.PLUS.equals(getT().getQualityType())) { + return item.sellIn < MAX; + } else if(dayType.equals(AttributeType.SELL) && CountType.MINUS.equals(getT().getQualityType())) { + return item.sellIn > MIN; + } + return false; + } + + public ItemType getT() { + return this; + } + + public CountType getSellType() { + return sellType; + } + + public CountType getQualityType() { + return qualityType; + } + + public boolean isValidationRequired() { + return validationRequired; + } + +}