Part 8 Guidance

Problem

Working with Member and Local classes, and Lambdas.

Solution

Here is the MainUnit code

Version 10 MainUnit
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package s2s.online.gardening.v10;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Selvyn
 */
public class MainUnit
{
    public static void main(String[] args)
    {
        MainUnit munit = new MainUnit();

        munit.bootstrap_products_items();
        
        munit.bootstrap_customers_accounts();
        
        munit.bootstrap_orders_accounts_items();
        munit.test_serialization_writer_all_objects();
        munit.test_serialization_reader_all_objects();
    }

    public void bootstrap_products_items()
    {
        // This call will bootstrap the products
        Warehouse.getInstance();
    }
    
    public  void    bootstrap_customers_accounts()
    {
        CustomerAccountMgr caMgr = CustomerAccountMgr.getInstance();
        // Create the accounts first and Customers
        Account acc = null;
        Customer cc = null;

        acc = new Account(1);
        caMgr.addAccount(acc);
        cc = new Customer(acc, "Sevlyn", "Wright", LocalDate.of(1965, 5, 8), "Somewhere in Birmingham");
        acc.setCustomer(cc); // tie acc to the customer
        caMgr.addCustomer("C1", cc);

        acc = new Account(2);
        caMgr.addAccount(acc);
        cc = new Customer(acc, "Samuel", "Wright", LocalDate.of(1982, 4, 22), "Somewhere else in Birmingham");
        acc.setCustomer(cc); // tie acc to the customer
        caMgr.addCustomer("C2", cc);

        acc = new Account(3);
        caMgr.addAccount(acc);
        cc = new Customer(acc, "Graham", "Meaden", LocalDate.of(1967, 4, 3), "Somewhere down South");
        acc.setCustomer(cc); // tie acc to the customer
        caMgr.addCustomer("C3", cc);
    }

    /*
     * This method will use an Order object to link the Item and Product objects 
     * to the Customer and Account objects
    */
    public  void    bootstrap_orders_accounts_items()
    {
        // Get an account and a product
        Account acc = CustomerAccountMgr.getInstance().getAccount(1);
        Product pp = Warehouse.getInstance().getProduct("JDF-001");
        
        // only proceed if the keys were valid
        if( acc != null && pp != null )
        {
            try 
            {
                // create new order giving it the order number of 1
                Order oo = new Order(acc, 1, LocalDate.now());
                
                // add the order the account
                acc.addOrder(oo);
                
                // get an item from the product, remember Items represent real things
                // Products are descriptions of thise things
                Item itm = pp.getItem(1);
                
                // Set the quantity attribute, how many instances of the Item
                itm.setQuantity(3);
                
                // Only proceed if you used a valid item id
                if( itm != null )
                    oo.addItem(itm);  // this call decrease the stock for this product
            } catch (Exception ex) {
                Logger.getLogger(MainUnit.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public void test_serialization_writer_all_objects()
    {
        String fname = "c:\\tmp\\all-objects.oos";

        // working with a Serializable File Writer
        SerializableFileWriter sfw = Writer.getSerializableFileWriter(fname);

        // Write the object out
        // HashMap are Serializable, so it can be written straight out
        // Because all objects in the HashMap are Serializable, they will all be
        // written out as well
        sfw.write(CustomerAccountMgr.getInstance().getCustomers());

        sfw.close();
    }

    public void test_serialization_reader_all_objects()
    {
        String fname = "c:\\tmp\\all-objects.oos";
        // Read the object from the filesystem
        InputChannel sfr = Reader.getSerializableFileReader(fname);
        sfr.openForReading(fname);

        // Read the entire object network back in
        HashMap< String, Customer> customersIn = (HashMap< String, Customer>) sfr.read();

        // Only process the objects if the read was successful
        if(customersIn != null)
        {
            // Iterate over all the Customers...
            for (Map.Entry<String, Customer> entry : customersIn.entrySet())
            {
                Customer cc = entry.getValue();
                
                System.out.printf("Customer code ==> %s\n", entry.getKey());
                cc.getRenderer().display();
                cc.getAccount().getRenderer().display();
                
                displayOrderDetais( cc.getAccount() );
            }
        }
    }
    
    public  void   displayOrderDetais( Account acc )
    {
        HashMap< Integer, Order > orders = acc.getOrders();
        for(Map.Entry<Integer, Order> entry : orders.entrySet())
        {
            Order ord = entry.getValue();
            BusinessObjectRenderer handler = new BusinessObjectRenderer()
            {
                @Override
                public void display()
                {
                    System.out.printf("Order\tORDER NO\tTOTAL COSR\tORDER DATE\n");
                    System.out.printf("\t%d\t\t%.2f\t\t%s\n", 
                                                ord.getOrderNo(), 
                                                ord.getTotalCost(), 
                                                ord.getDateCreated().toString());
                }
            
            };
            handler.display();
            
            displayItemDetails( ord );
        }
    }
    
    public  void    displayItemDetails( Order ord )
    {
        for( Item itm : ord.getItems())
        {
            BusinessObjectRenderer handler = new BusinessObjectRenderer()
            {
                @Override
                public void display()
                {
                    System.out.printf("Item\tUNIQUE ID\tQUANTITY\tCOST\n");
                    System.out.printf("\t%d\t\t%d\t\t%.2f\n", 
                                                itm.getUniqueId(),
                                                itm.getQuantity(),
                                                itm.getItemCost());
                }
            };
            handler.display();
            
            displayProductDetails(itm.getProduct());
        }
    }
    
    public  void    displayProductDetails( Product pp )
    {
        BusinessObjectRenderer handler = () ->
        {
            System.out.println("Product\tPRODUCT CODE\tDESCRIPTION\t\tPRICE\tQUANTITY");
            System.out.printf("\t%s\t\t%s\t\t%.2f\t%d\n", 
                    pp.getProductCode(), 
                    pp.getDescription(), 
                    pp.getPrice(), 
                    pp.getQuantity());
        };
        handler.display();
    }
}