Sales message processor
// Sales message processor
package sales_processing;
// Item
public class Item {
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setPrice(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
// ItemGenerator
package sales_processing;
import java.util.Random;
public class ItemGenerator {
private final int ITEM_COUNT = 10;
private final String ITEM_PREFIX = "item_";
private int MAX_PRICE = 1000;
private Random random;
public ItemGenerator(Random random) {
this.random = random;
}
public Item[] generate() {
Item[] sales = new Item[this.ITEM_COUNT];
int i = 0;
String name = "";
int price = 0;
for (; i < sales.length; i++) {
name = this.ITEM_PREFIX + i;
price = this.random.nextInt(this.MAX_PRICE + 1);
if (price == 0) {
price = 1;
}
}
sales[i] = new Item(name, price);
return sales;
}
}
// Sale
package sales_processing;
public class Sale {
public static int MAX_QUANTITY = 1000;
private Item item;
private int quantity;
public Sale(Item item, int quantity) {
this.item = item;
this.quantity = quantity;
}
public Item getItem() {
return item;
}
public int getQuantity() {
return quantity;
}
}
// SaleAdjustment
package sales_processing;
public class SaleAdjustment extends Sale {
private String adjustmentCommand;
public SaleAdjustment(Item item, int quantity, String adjustmentCommand) {
super(item, quantity);
this.adjustmentCommand = adjustmentCommand;
}
public String getAdjustmentCommand() {
return this.adjustmentCommand;
}
public void adjust(Sale[] sales) {
String[] parameters = this.adjustmentCommand.split(" ");
String action = parameters[0];
int diff = Integer.parseInt(parameters[1]);
int newValue = -1;
String itemName = parameters[2];
if (action == SalesGenerator.ACTIONS[0]) {
for (int i = 0; i < sales.length; i++) {
if (itemName == sales[i].getItem().getName()) {
newValue = sales[i].getItem().getPrice() + diff;
sales[i].getItem().setPrice(newValue);
}
}
}
else if (action == SalesGenerator.ACTIONS[1]) {
for (int i = 0; i < sales.length; i++) {
if (itemName == sales[i].getItem().getName()) {
int oldPrice = sales[i].getItem().getPrice();
int tmp = oldPrice - diff;
if (tmp >= 0) {
newValue = oldPrice - diff;
}
else {
newValue = diff - oldPrice;
}
}
sales[i].getItem().setPrice(newValue);
}
}
else if (action == SalesGenerator.ACTIONS[2]) {
for (int i = 0; i < sales.length; i++) {
if (itemName == sales[i].getItem().getName()) {
int oldPrice = sales[i].getItem().getPrice();
}
}
}
newValue = oldPrice * diff;
sales[i].getItem().setPrice(newValue);
}
}
// SalesGenerator
package sales_processing;
import java.util.Random;
public class SalesGenerator {
public static String[] ACTIONS = {"add", "subtract", "multiply"};
private final int MAX_ADJUSTMENT_VALUE = 100;
private static int salesGeneratorCount;
private int salesCount;
private Random random;
private SalesGenerator(int salesCount, Random random) {
this.salesCount = salesCount;
this.random = random;
}
public static SalesGenerator getSalesGenerator(int salesCount) {
if (SalesGenerator.salesGeneratorCount == 0) {
SalesGenerator.salesGeneratorCount = 1;
return new SalesGenerator(salesCount, new Random());
}
return null;
}
private String generateCommand(Item[] items) {
int actionIndex =
this.random.nextInt(SalesGenerator.ACTIONS.length);
String action = SalesGenerator.ACTIONS[actionIndex];
int value = this.random.nextInt(this.MAX_ADJUSTMENT_VALUE + 1);
int itemIndex = this.random.nextInt(items.length);
String itemName = items[itemIndex].getName();
String command = action + " " + value + " " + itemName;
return command;
}
public Sale[] generateSales() {
Item[] items = new ItemGenerator(this.random).generate();
int i = 0;
int itemId = -1;
int quantity = 0;
String command = "";
Sale sale = null;
Sale[] sales = new Sale[this.salesCount];
for (; i < sales.length; i++) {
boolean isAdjustment = this.random.nextBoolean();
itemId = this.random.nextInt(items.length);
quantity = this.random.nextInt(Sale.MAX_QUANTITY + 1);
if (isAdjustment) {
command = this.generateCommand(items);
sale = new SaleAdjustment(items[itemId], quantity, command);
}
else {
sale = new Sale(items[itemId], quantity);
}
sales[i] = sale;
}
}
return sales;
}
// SalesProcessor
package sales_processing;
import java.util.*;
public class SalesProcessor {
public static void main(String[] args) {
int salesCount = 100;
SalesGenerator g = SalesGenerator.getSalesGenerator(salesCount);
SaleAdjustment adjustment = null;
Sale[] sales = g.generateSales();
for (int i = 0; i < sales.length; i++) {
System.out.println("n=" + sales[i].getItem().getName() + ",
p=" + sales[i].getItem().getPrice() + ", q=" + sales[i].getQuantity());
if (sales[i] instanceof SaleAdjustment) {
adjustment = (SaleAdjustment) sales[i];
adjustment.adjust(sales);
}
if (i > 0 && i % 10 == 0) {
salesReport(sales, i);
}
}
if (i > 0 && i % 50 == 0) {
adjustmentReport(sales, i);
}
}
public static void salesReport(Sale[] sales, int top) {
Hashtable salesByItem = new Hashtable();
ArrayList keys = new ArrayList();
System.out.println("\nSALES REPORT START\n");
for (int i = top - 10; i < top; i++) {
String name = sales[i].getItem().getName();
int soldCount = 0;
int total = 0;
for (int j = 0; j < sales.length; j++) {
if (name == sales[i].getItem().getName()) {
soldCount += 1;
}
}
}
total = soldCount * sales[i].getItem().getPrice();
salesByItem.put(name, total);
for (Enumeration e = salesByItem.keys(); e.hasMoreElements();) {
String k = (String) e.nextElement();
keys.add(k);
}
Collections.sort(keys);
for (int i = 0; i < keys.size(); i++) {
System.out.println("item=" + keys.get(i) + ", total=" +
salesByItem.get(keys.get(i)));
}
System.out.println("\nSALES REPORT END\n");
}
public static void adjustmentReport(Sale[] sales, int top) {
System.out.println("\nADJUSTMENT REPORT START\n");
for (int i = top - 10; i < top; i++) {
if (sales[i] instanceof SaleAdjustment) {
System.out.println(((SaleAdjustment)
sales[i]).getAdjustmentCommand());
}
}
}
}
System.out.println("\nADJUSTMENT REPORT END\n");