Java- Object-Oriented and Concurrent Programming

profilebrinco
p2_sourcecode.zip

SeaPorts/.classpath

SeaPorts/.project

SeaPorts org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature

SeaPorts/.settings/org.eclipse.jdt.core.prefs

eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.8

SeaPorts/bin/edu/umuc/cmsc335/beans/CargoShip.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class CargoShip 
                extends Ship {
    
                private double 
                cargoValue;
    
                private double 
                cargoVolume;
    
                private double 
                cargoWeight;
    
                public void CargoShip(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/Dock.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class Dock 
                extends Thing {
    
                protected Ship 
                ship;
    
                public void Dock(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/Job.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class Job 
                extends Thing {
    
                private double 
                duration;
    
                protected java.util.ArrayList 
                requirements;
    
                public void Job(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/PassengerShip.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class PassengerShip 
                extends Ship {
    
                private int 
                numberOfOccupiedRooms;
    
                private int 
                numberOfPassengers;
    
                private int 
                numberOfRooms;
    
                public void PassengerShip(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/Person.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class Person 
                extends Thing {
    
                protected String 
                skill;
    
                public void Person(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/PortTime.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class PortTime {
    
                private int 
                time;
    
                public void PortTime();
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/SeaPort.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class SeaPort 
                extends Thing {
    
                protected java.util.ArrayList 
                docks;
    
                protected java.util.ArrayList 
                queue;
    
                protected java.util.ArrayList 
                ships;
    
                protected java.util.ArrayList 
                persons;
    
                public void SeaPort(java.util.Scanner);
    
                public String 
                toString();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/Ship.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class Ship 
                extends Thing {
    
                private PortTime 
                arrivalTime;
    
                private PortTime 
                dockTime;
    
                private double 
                draft;
    
                private double 
                length;
    
                private double 
                weight;
    
                private double 
                width;
    
                protected java.util.ArrayList 
                jobs;
    
                public void Ship(java.util.Scanner);
    
                public String 
                toString();
    
                public double 
                getDraft();
    
                public double 
                getLength();
    
                public double 
                getWeight();
    
                public double 
                getWidth();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/Thing.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class Thing 
                implements Comparable {
    
                protected int 
                index;
    
                protected String 
                name;
    
                protected int 
                parent;
    
                public void Thing(java.util.Scanner);
    
                public void Thing(String, int, int);
    
                public int 
                compareTo(Thing);
    
                public String 
                toString();
    
                public String 
                getName();
}

            

SeaPorts/bin/edu/umuc/cmsc335/beans/World.class

                package edu.umuc.cmsc335.beans;

                public 
                synchronized 
                class World 
                extends Thing {
    
                private java.util.ArrayList 
                ports;
    
                private PortTime 
                time;
    
                private java.util.HashMap 
                hms;
    
                public void World(java.util.Scanner);
    
                public void World(String, int, int);
    
                public String 
                toString();
    
                public String 
                searchByName(String);
    
                private String 
                className(Thing);
    
                public String 
                searchByIndex(String);
    
                public String 
                searchBySkill(String);
    
                public void 
                process(String);
    
                private Job 
                getJobByIndex(int);
    
                private Person 
                getPersonByIndex(int);
    
                private Ship 
                getShipByIndex(int);
    
                private Dock 
                getDockByIndex(int);
    
                public SeaPort 
                getSeaPortByIndex(int);
    
                private void 
                addJob(java.util.Scanner);
    
                private void 
                addPerson(java.util.Scanner);
    
                private void 
                addCargoShip(java.util.Scanner);
    
                private void 
                addPassengerShip(java.util.Scanner);
    
                private void 
                addDock(java.util.Scanner);
    
                private void 
                addPort(java.util.Scanner);
    
                public void 
                sortByName();
    
                public void 
                sortShipsByWeight();
    
                public void 
                sortShipsByLength();
    
                public void 
                sortShipsByWidth();
    
                public void 
                sortShipsByDraft();
}

            

SeaPorts/bin/edu/umuc/cmsc335/comparator/ShipDraftComparator.class

                package edu.umuc.cmsc335.comparator;

                public 
                synchronized 
                class ShipDraftComparator 
                implements java.util.Comparator {
    
                public void ShipDraftComparator();
    
                public int 
                compare(edu.umuc.cmsc335.beans.Ship, edu.umuc.cmsc335.beans.Ship);
}

            

SeaPorts/bin/edu/umuc/cmsc335/comparator/ShipLengthComparator.class

                package edu.umuc.cmsc335.comparator;

                public 
                synchronized 
                class ShipLengthComparator 
                implements java.util.Comparator {
    
                public void ShipLengthComparator();
    
                public int 
                compare(edu.umuc.cmsc335.beans.Ship, edu.umuc.cmsc335.beans.Ship);
}

            

SeaPorts/bin/edu/umuc/cmsc335/comparator/ShipWeightComparator.class

                package edu.umuc.cmsc335.comparator;

                public 
                synchronized 
                class ShipWeightComparator 
                implements java.util.Comparator {
    
                public void ShipWeightComparator();
    
                public int 
                compare(edu.umuc.cmsc335.beans.Ship, edu.umuc.cmsc335.beans.Ship);
}

            

SeaPorts/bin/edu/umuc/cmsc335/comparator/ShipWidthComparator.class

                package edu.umuc.cmsc335.comparator;

                public 
                synchronized 
                class ShipWidthComparator 
                implements java.util.Comparator {
    
                public void ShipWidthComparator();
    
                public int 
                compare(edu.umuc.cmsc335.beans.Ship, edu.umuc.cmsc335.beans.Ship);
}

            

SeaPorts/bin/edu/umuc/cmsc335/comparator/ThingNameComparator.class

                package edu.umuc.cmsc335.comparator;

                public 
                synchronized 
                class ThingNameComparator 
                implements java.util.Comparator {
    
                public void ThingNameComparator();
    
                public int 
                compare(edu.umuc.cmsc335.beans.Thing, edu.umuc.cmsc335.beans.Thing);
}

            

SeaPorts/bin/edu/umuc/cmsc335/ui/SeaPortListener.class

                package edu.umuc.cmsc335.ui;

                public 
                synchronized 
                class SeaPortListener 
                implements java.awt.event.ActionListener {
    
                static SeaPortProgram 
                seaPortProgram;
    
                static void 
                <clinit>();
    
                public void SeaPortListener(SeaPortProgram);
    
                public void 
                actionPerformed(java.awt.event.ActionEvent);
    
                private void 
                sortActionPerformed(java.awt.event.ActionEvent);
    
                private void 
                openFileActionPerformed(java.awt.event.ActionEvent);
    
                private void 
                searchActionPerformed(java.awt.event.ActionEvent);
}

            

SeaPorts/bin/edu/umuc/cmsc335/ui/SeaPortProgram.class

                package edu.umuc.cmsc335.ui;

                public 
                synchronized 
                class SeaPortProgram 
                extends javax.swing.JFrame {
    
                public edu.umuc.cmsc335.beans.World 
                world;
    
                private 
                static 
                final String 
                TITLE = Sea Port Program;
    
                public 
                static 
                final String 
                OPEN_FILE = Open File;
    
                public 
                static 
                final String 
                SEARCH = Search;
    
                public 
                static 
                final String 
                SORT = Sort;
    
                public 
                static 
                final String[] 
                SORT_OPTION;
    javax.swing.JButton 
                openFileButton;
    javax.swing.JButton 
                searchButton;
    javax.swing.ButtonGroup 
                group;
    javax.swing.JRadioButton 
                rbName;
    javax.swing.JRadioButton 
                rbIndex;
    javax.swing.JRadioButton 
                rbSkill;
    javax.swing.JTextArea 
                outPutArea;
    javax.swing.JScrollPane 
                scrollPane;
    javax.swing.JPanel 
                buttonsPanel;
    javax.swing.JPanel 
                comboButtonPanel;
    javax.swing.JTextField 
                searchField;
    javax.swing.JComboBox 
                sortComboBox;
    
                static void 
                <clinit>();
    
                public void SeaPortProgram();
    
                public javax.swing.JTextArea 
                getOutPutArea();
    
                private javax.swing.JScrollPane 
                getScrollPane(javax.swing.JTextArea);
    
                private javax.swing.JTextField 
                getSearchField();
    
                private javax.swing.JPanel 
                getComboButtonPanel();
    
                private javax.swing.JPanel 
                getButtonspanel();
    
                private javax.swing.JButton 
                getSearchButton();
    
                private javax.swing.JButton 
                getOpenFileButton();
    
                public javax.swing.JComboBox 
                getSortComboBox();
    
                public 
                static void 
                main(String[]);
}

            

SeaPorts/src/edu/umuc/cmsc335/beans/CargoShip.java

SeaPorts/src/edu/umuc/cmsc335/beans/CargoShip.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . Scanner ;

public   class   CargoShip   extends   Ship   {

     private   double  cargoValue ;
     private   double  cargoVolume ;
     private   double  cargoWeight ;
    
    
     public   CargoShip   ( Scanner  sc ){
         super ( sc );
         if ( sc . hasNextDouble ()){
            cargoWeight  =  sc . nextDouble ();
         }
        
         if ( sc . hasNextDouble ()){
            cargoVolume  =  sc . nextDouble ();
         }
        
         if ( sc . hasNextDouble ()){
            cargoValue  =  sc . nextDouble ();
         }
     }
    
    
    @ Override
     public   String  toString ()   {
         return   "  Ship: Cargo Ship: "   +   super . toString ();
     }
}

SeaPorts/src/edu/umuc/cmsc335/beans/Dock.java

SeaPorts/src/edu/umuc/cmsc335/beans/Dock.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . Scanner ;

public   class   Dock   extends   Thing   {
    
     public   Dock ( Scanner  sc )   {
         super ( sc );
     }

     protected   Ship  ship ;
    
    @ Override
     public   String  toString ()   {
        
         return   " Dock: "   +  name  +   " "   +  index  +   "\n"   +  ship . toString ();
     }
}

SeaPorts/src/edu/umuc/cmsc335/beans/Job.java

SeaPorts/src/edu/umuc/cmsc335/beans/Job.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . ArrayList ;
import  java . util . Scanner ;

public   class   Job   extends   Thing   {
     private   double  duration ;
     protected   ArrayList   < String >  requirements ;    // should be some of the skills of the persons
    
     public   Job ( Scanner  sc )   {
         super ( sc );
         if ( sc . hasNextDouble ()){
            duration  =  sc . nextDouble ();
         }
        
         if ( sc . hasNext ()){
            requirements  =   new   ArrayList < String > ();
             while ( sc . hasNext ()){
                 this . requirements . add ( sc . next ());
             }

         }
        
     }
    
@ Override
public   String  toString ()   {

     // If the requirements aren't there don't try to output them
     if   ( requirements  ==   null ){
         return  name  +   " "   +  index  +   " " ;
     }
     // Return requirements as well. 
     return  name  +   " "   +  index  +   " "   +   "Requirements: "   +  requirements . toString ()   ;
}
}

SeaPorts/src/edu/umuc/cmsc335/beans/PassengerShip.java

SeaPorts/src/edu/umuc/cmsc335/beans/PassengerShip.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . Scanner ;

public   class   PassengerShip   extends   Ship   {
     private   int  numberOfOccupiedRooms ;
     private   int  numberOfPassengers ;
     private   int  numberOfRooms ;
    
     public   PassengerShip ( Scanner  sc )   {
         super ( sc );
        
         if ( sc . hasNextInt ()){
            numberOfPassengers  =  sc . nextInt ();
         }
        
         if ( sc . hasNextInt ()){
            numberOfRooms  =  sc . nextInt ();
         }
        
         if ( sc . hasNextInt ()){
            numberOfOccupiedRooms  =  sc . nextInt ();
         }
     }
    
    @ Override
     public   String  toString ()   {
         String  st  =   "  Ship: Passenger ship: "   +   super . toString ();
           if   ( jobs . size ()   ==   0 )
              return  st ;
           for   ( Job  mj :  jobs )  st  +=   "\n       - "   +  mj ;
           return  st ;
     }
}

SeaPorts/src/edu/umuc/cmsc335/beans/Person.java

SeaPorts/src/edu/umuc/cmsc335/beans/Person.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . Scanner ;

public   class   Person   extends   Thing   {
     protected   String  skill ;
    
     public   Person ( Scanner  sc )   {
         super ( sc );
        
         if ( sc . hasNext ()){
             this . skill  =  sc . next ();
         }
     }
    
    @ Override
     public   String  toString ()   {
         return   "Person: "   +   super . toString ()   +   " "   +  skill ;
     }
}

SeaPorts/src/edu/umuc/cmsc335/beans/PortTime.java

SeaPorts/src/edu/umuc/cmsc335/beans/PortTime.java

package  edu . umuc . cmsc335 . beans ;

public   class   PortTime   {
     private   int  time ;
    
    @ Override
     public   String  toString ()   {
        
         return   "Port Time is: "   +  time ;  
     }
}

SeaPorts/src/edu/umuc/cmsc335/beans/SeaPort.java

SeaPorts/src/edu/umuc/cmsc335/beans/SeaPort.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . ArrayList ;
import  java . util . Scanner ;

public   class   SeaPort   extends   Thing   {

     protected   ArrayList   < Dock >  docks ;
     protected   ArrayList   < Ship >  queue ;   // the list of ships waiting to dock
     protected   ArrayList   < Ship >  ships ;   // a list of all the ships at this port
     protected   ArrayList   < Person >  persons ;   // people with skills at this port
    
     public   SeaPort ( Scanner  sc ){
         super ( sc );
        docks  =   new   ArrayList < Dock > ();
        queue  =   new   ArrayList < Ship > ();
        ships  =   new   ArrayList < Ship > ();
        persons  =   new   ArrayList < Person > ();
     }
    @ Override
     public   String  toString ()   {
         String  st  =   "\n\nSeaPort: "   +   super . toString ();
         for   ( Dock  md :  docks )  st  +=   "\n"   +  md ;
        st  +=   "\n\n --- List of all ships in queue:" ;
         for   ( Ship  ms :  queue  )  st  +=   "\n   > "   +  ms ;
        st  +=   "\n\n --- List of all ships:" ;
         for   ( Ship  ms :  ships )  st  +=   "\n   > "   +  ms ;
        st  +=   "\n\n --- List of all persons:" ;
         for   ( Person  mp :  persons )  st  +=   "\n   > "   +  mp ;
         return  st ;
     }

}

SeaPorts/src/edu/umuc/cmsc335/beans/Ship.java

SeaPorts/src/edu/umuc/cmsc335/beans/Ship.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . ArrayList ;
import  java . util . Scanner ;

public   class   Ship   extends   Thing   {

     private   PortTime  arrivalTime ;
     private   PortTime  dockTime ;
    
     private   double  draft ;
     private   double  length ;
     private   double  weight ;  
     private   double  width ;
    
     protected   ArrayList   < Job >  jobs ;
    
     public   Ship   ( Scanner  sc ){
         super ( sc );
        
         if ( sc . hasNextDouble ()){
            weight  =  sc . nextDouble ();
         }
         if ( sc . hasNextDouble ()){
            length  =  sc . nextDouble ();
         }
         if ( sc . hasNextDouble ()){
            width  =  sc . nextDouble ();
         }
         if ( sc . hasNextDouble ()){
            draft  =  sc . nextDouble ();
         }
        jobs  =   new   ArrayList < Job > ();
     }
    
    @ Override
     public   String  toString ()   {
         return   "\t"   +  name  +   " "   +  index  +   "\t"   +   "Weight: "   +  weight  + "\t"   +   "length: "   +  length  + "\t"   +   "width: "   +  width  + "\t"   +   "draft: "   +  draft ;

// TODO Print out all jobs?
/*      String st = "\n\nSeaPort: " + super.toString();
        for (Dock md: docks) st += "\n" + md;
        st += "\n\n --- List of all ships in queue:";
        for (Ship ms: queue ) st += "\n   > " + ms;
        st += "\n\n --- List of all ships:";
        for (Ship ms: ships) st += "\n   > " + ms;
        st += "\n\n --- List of all persons:";
        for (Person mp: persons) st += "\n   > " + mp;
        return st; */

     }

     public   double  getDraft ()   {
         return  draft ;
     }

     public   double  getLength ()   {
         return  length ;
     }

     public   double  getWeight ()   {
         return  weight ;
     }

     public   double  getWidth ()   {
         return  width ;
     }
    
    

}

SeaPorts/src/edu/umuc/cmsc335/beans/Thing.java

SeaPorts/src/edu/umuc/cmsc335/beans/Thing.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . Scanner ;

public   class   Thing   implements   Comparable < Thing >   {
     protected   int  index ;
     protected   String  name ;
     protected   int  parent ;
    
    

     public   Thing ( Scanner  sc )   {
         if ( sc . hasNext ()){
             this . name  =  sc . next ();
         }
        
         if ( sc . hasNextInt ()){
             this . index  =  sc . nextInt ();
         }
        
         if ( sc . hasNextInt ()){
             this . parent  =  sc . nextInt ();
         }
     }

     public   Thing ( String  name ,   int  index ,   int  parent )   {
         this . name  =  name ;
         this . index  =  index ;
         this . parent  =  parent ;
     }

    @ Override
     public   int  compareTo ( Thing  arg0 )   {
         // TODO Auto-generated method stub
         return   0 ;
     }

/*  public int compareTo(Thing t) {
        int lastCmp = name.compareTo(n.name);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }*/

    @ Override
     public   String  toString ()   {
         return  name  +   " "   +  index ;
     }

     public   String  getName ()   {
         return  name ;
     }

    
}

SeaPorts/src/edu/umuc/cmsc335/beans/World.java

SeaPorts/src/edu/umuc/cmsc335/beans/World.java

package  edu . umuc . cmsc335 . beans ;

import  java . util . ArrayList ;
import  java . util . Collections ;
import  java . util . HashMap ;
import  java . util . Scanner ;

import  edu . umuc . cmsc335 . comparator . ShipDraftComparator ;
import  edu . umuc . cmsc335 . comparator . ShipLengthComparator ;
import  edu . umuc . cmsc335 . comparator . ShipWeightComparator ;
import  edu . umuc . cmsc335 . comparator . ShipWidthComparator ;
import  edu . umuc . cmsc335 . comparator . ThingNameComparator ;

public   class   World   extends   Thing   {

     private   ArrayList   < SeaPort >  ports ;
     private   PortTime  time ;  
     private   HashMap < Integer ,   Thing >  hms ;
    
     public   World ( Scanner  sc )   {
         super ( sc );
     }
    
     public   World   ( String  name ,   int  index ,   int  parent ){
         super ( name ,  index ,  parent );
        ports  =   new   ArrayList <> ();
        time  =   new   PortTime ();
        hms  =   new   HashMap < Integer ,   Thing > ();
        hms . put ( this . index ,   this );
     }
    
    @ Override
     public   String  toString ()   {
         return  ports . toString ();
     }
    
     public   String  searchByName ( String  search )   {
         String  results  =   "" ;

         if   ( this . name . toLowerCase (). equals ( search ))
            results  +=  className ( this );
         for ( SeaPort  port  :  ports ){
             if   ( port . name . toLowerCase (). equals ( search ))
                results  +=  className ( port );
             for ( Dock  dock  :  port . docks ){
                 if   ( dock . name . toLowerCase (). equals ( search ))
                    results  +=  className ( dock );
             }
             for ( Person  person  :  port . persons ){
                 if   ( person . name . toLowerCase (). equals ( search ))
                    results  +=  className ( person );
             }
             for ( Ship  ship  :  port . ships ){
                 if   ( ship . name . toLowerCase (). equals ( search ))
                    results  +=  className ( ship );
                 for ( Job  job  :  ship . jobs ){
                     if   ( job . name . toLowerCase (). equals ( search ))
                        results  +=  className ( job );
                 }
             }
         }
         if   ( results . isEmpty ())
            results  =   "No results found." ;

         return  results ;
     }

     private   String  className ( Thing  thing )   {
         // Helper method for searchByName()
         return  thing . getClass (). getName (). substring ( thing . getClass (). getName (). lastIndexOf ( '.' )   +   1 )   +   ": "   +  thing . name  +   "\n" ;
     }

     public   String  searchByIndex ( String  search )   {
         String  results  =   "No results found." ;
         Thing  thing ;
         try   {
             int  sIndex  =   Integer . parseInt ( search );
            thing  =  hms . get ( sIndex );
            
             if ( thing  !=   null ){
                results  =  className ( thing );
             }
         }   catch   ( NumberFormatException  e )   {
            results  =   "Search by index must be an integer" ;
         }
         return  results ;
     }

     public   String  searchBySkill ( String  search )   {
         String  results  =   "" ;
        
         for ( SeaPort  port  :  ports ){
             for ( Person  person  :  port . persons ){
                 if   ( person . skill . toLowerCase (). equals ( search ))
                    results  +=  className ( person );
             }
             for ( Ship  ship  :  port . ships ){
                 for ( Job  job  :  ship . jobs ){
                     if   ( job . toString (). toLowerCase (). contains ( search ))
                        results  +=  className ( job );
                 }
             }
         }
         if   ( results . isEmpty ())
            results  =   "No results found." ;

         return  results ;
     }

     public   void  process  ( String  st )   {  
       System . out . println  ( "Processing >"   +  st  +   "<" );
         Scanner  sc  =   new   Scanner   ( st );
         if   ( ! sc . hasNext ())   {
            sc . close ();
             return ;
         }
         switch   ( sc . next ())   {
         case   "port"     :  addPort       ( sc );
            break ;
         case   "dock"     :  addDock       ( sc );
             break ;
         case   "pship"     :  addPassengerShip      ( sc );
             break ;
         case   "cship"     :  addCargoShip      ( sc );
             break ;
         case   "person"   :  addPerson ( sc );
             break ;
         case   "job"   :  addJob ( sc );
             break ;
         }

     }

     private   Job  getJobByIndex ( int  parent )   {
         for ( SeaPort  port  :  ports ){
             for ( Ship  ship  :  port . ships ){
                 for ( Job  job  :  ship . jobs ){
                     if ( job . index  ==  parent ){
                         return  job ;
                     }
                 }
             }
         }
         return   null ;
     }

     private   Person  getPersonByIndex ( int  parent )   {
         for ( SeaPort  port  :  ports ){
             for ( Person  person  :  port . persons ){
                 if ( person . index  ==  parent ){
                     return  person ;
                 }
             }
         }
         return   null ;
     }

     private   Ship  getShipByIndex ( int  parent )   {
         for ( SeaPort  port  :  ports ){
             for ( Ship  ship  :  port . ships ){
                 if ( ship . index  ==  parent ){
                     return  ship ;
                 }
             }
         }
         return   null ;
     }

     private   Dock  getDockByIndex ( int  parent )   {
         for ( SeaPort  port  :  ports ){
             for ( Dock  dock  :  port . docks ){
                 if ( dock . index  ==  parent ){
                     return  dock ;
                 }
             }
         }
         return   null ;
     }

     public   SeaPort  getSeaPortByIndex ( int  parent )   {
         for ( SeaPort  port  :  ports ){
             if ( port . index  ==  parent ){
                 return  port ;
             }
         }
         return   null ;
     }

     private   void  addJob ( Scanner  sc )   {
         Job  job  =   new   Job ( sc );
         Dock  dock  =  getDockByIndex ( job . parent );
         if ( dock  !=   null ){
             if   ( dock . ship  !=   null )   {
                dock . ship . jobs . add ( job );
                hms . put ( job . index ,  job );
             }
         }
     }

     private   void  addPerson ( Scanner  sc )   {
         Person  person  =   new   Person ( sc );
         SeaPort  port  =  getSeaPortByIndex ( person . parent );
         if ( port  !=   null ){
            port . persons . add ( person );
            hms . put ( person . index ,  person );
         }
     }

     private   void  addCargoShip ( Scanner  sc )   {
         CargoShip  cShip  =   new   CargoShip ( sc );
         Dock  dock  =  getDockByIndex ( cShip . parent );
        
         if ( dock  ==   null ){
            getSeaPortByIndex ( cShip . parent ). ships . add ( cShip );
            getSeaPortByIndex ( cShip . parent ). queue . add ( cShip );
             return ;
         }
        
        dock . ship  =  cShip ;
        getSeaPortByIndex ( dock . parent ). ships . add ( cShip );
        hms . put ( cShip . index ,  cShip );
     }

     private   void  addPassengerShip ( Scanner  sc )   {
         PassengerShip  pShip  =   new   PassengerShip ( sc );
         Dock  dock  =  getDockByIndex ( pShip . parent );
        
         if ( dock  ==   null ){
            getSeaPortByIndex ( pShip . parent ). ships . add ( pShip );
            getSeaPortByIndex ( pShip . parent ). queue . add ( pShip );
             return ;
         }
        
        dock . ship  =  pShip ;
        getSeaPortByIndex ( dock . parent ). ships . add ( pShip );
        hms . put ( pShip . index ,  pShip );
     }

     private   void  addDock ( Scanner  sc )   {
         Dock  dock  =   new   Dock ( sc );
         SeaPort  port  =  getSeaPortByIndex ( dock . parent );
         if ( port  !=   null ){
            port . docks . add ( dock );
            hms . put ( dock . index ,  dock );
         }
     }

     private   void  addPort ( Scanner  sc )   {
         SeaPort  seaPort  =   new   SeaPort ( sc );
        
         if ( ! ports . contains ( seaPort )){
            ports . add ( seaPort );
            hms . put ( seaPort . index ,  seaPort );
         }
     }

     public   void  sortByName ()   {
         Collections . sort ( ports ,   new   ThingNameComparator ());
         for ( SeaPort  port  :  ports ){
             Collections . sort ( port . docks ,   new   ThingNameComparator ());
             Collections . sort ( port . queue ,   new   ThingNameComparator ());
             Collections . sort ( port . ships ,   new   ThingNameComparator ());
             Collections . sort ( port . persons ,   new   ThingNameComparator ());
         }
     }

     public   void  sortShipsByWeight ()   {
         for ( SeaPort  port  :  ports ){
             Collections . sort ( port . queue ,   new   ShipWeightComparator ());
             Collections . sort ( port . ships ,   new   ShipWeightComparator ());
                    
         }
     }

     public   void  sortShipsByLength ()   {
         for ( SeaPort  port  :  ports ){
             Collections . sort ( port . queue ,   new   ShipLengthComparator ());
             Collections . sort ( port . ships ,   new   ShipLengthComparator ());
                    
         }
     }

     public   void  sortShipsByWidth ()   {
         for ( SeaPort  port  :  ports ){
             Collections . sort ( port . queue ,   new   ShipWidthComparator ());
             Collections . sort ( port . ships ,   new   ShipWidthComparator ());
                    
         }
        
     }

     public   void  sortShipsByDraft ()   {
         for ( SeaPort  port  :  ports ){
             Collections . sort ( port . queue ,   new   ShipDraftComparator ());
             Collections . sort ( port . ships ,   new   ShipDraftComparator ());
                    
         }
        
     }
}

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipDraftComparator.java

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipDraftComparator.java

package  edu . umuc . cmsc335 . comparator ;

import  java . util . Comparator ;

import  edu . umuc . cmsc335 . beans . Ship ;

public   class   ShipDraftComparator   implements   Comparator < Ship >   {

    @ Override
     public   int  compare ( Ship  o1 ,   Ship  o2 )   {
         double  draft1  =  o1 . getDraft ();
         double  draft2  =  o2 . getDraft ();
        
         return   Double . compare ( draft1 ,  draft2 );
     }
    

}

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipLengthComparator.java

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipLengthComparator.java

package  edu . umuc . cmsc335 . comparator ;

import  java . util . Comparator ;

import  edu . umuc . cmsc335 . beans . Ship ;

public   class   ShipLengthComparator   implements   Comparator < Ship >   {

    @ Override
     public   int  compare ( Ship  o1 ,   Ship  o2 )   {
         double  length1  =  o1 . getLength ();
         double  length2  =  o2 . getLength ();
         return   Double . compare ( length1 ,  length2 );
     }
    

}

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipWeightComparator.java

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipWeightComparator.java

package  edu . umuc . cmsc335 . comparator ;

import  java . util . Comparator ;

import  edu . umuc . cmsc335 . beans . Ship ;

public   class   ShipWeightComparator   implements   Comparator < Ship >   {

    @ Override
     public   int  compare ( Ship  o1 ,   Ship  o2 )   {
         double  weight1  =  o1 . getWeight ();
         double  weight2  =  o2 . getWeight ();
         return   Double . compare ( weight1 ,  weight2 );
     }
    
}

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipWidthComparator.java

SeaPorts/src/edu/umuc/cmsc335/comparator/ShipWidthComparator.java

package  edu . umuc . cmsc335 . comparator ;

import  java . util . Comparator ;

import  edu . umuc . cmsc335 . beans . Ship ;

public   class   ShipWidthComparator   implements   Comparator < Ship >   {

    @ Override
     public   int  compare ( Ship  o1 ,   Ship  o2 )   {
         double  width1  =  o1 . getWidth ();
         double  width2  =  o2 . getWidth ();
         return   Double . compare ( width1 ,  width2 );
     }
    

}

SeaPorts/src/edu/umuc/cmsc335/comparator/ThingNameComparator.java

SeaPorts/src/edu/umuc/cmsc335/comparator/ThingNameComparator.java

package  edu . umuc . cmsc335 . comparator ;

import  java . util . Comparator ;

import  edu . umuc . cmsc335 . beans . Thing ;

public   class   ThingNameComparator   implements   Comparator < Thing >   {

    @ Override
     public   int  compare ( Thing  o1 ,   Thing  o2 )   {
         return  o1 . getName (). compareTo ( o2 . getName ());
     }
    
}

SeaPorts/src/edu/umuc/cmsc335/ui/SeaPortListener.java

SeaPorts/src/edu/umuc/cmsc335/ui/SeaPortListener.java

package  edu . umuc . cmsc335 . ui ;

import  java . awt . event . ActionEvent ;
import  java . awt . event . ActionListener ;
import  java . io . File ;
import  java . io . FileNotFoundException ;
import  java . util . Scanner ;

import  javax . swing . JComboBox ;
import  javax . swing . JFileChooser ;
import  javax . swing . JOptionPane ;

import  edu . umuc . cmsc335 . beans . World ;

public   class   SeaPortListener   implements   ActionListener   {
     static   SeaPortProgram  seaPortProgram  =   null ;
    
     public   SeaPortListener ( SeaPortProgram  seaPortProgram ){
         this . seaPortProgram  =  seaPortProgram ;
     }

    @ Override
     public   void  actionPerformed ( ActionEvent  event )   {
         String  actionCommand  =  event . getActionCommand ();
        
         switch   ( actionCommand )   {
         case   SeaPortProgram . OPEN_FILE :
            openFileActionPerformed ( event );
             break ;
         case   SeaPortProgram . SEARCH :
            searchActionPerformed ( event );
             break ;
         case   SeaPortProgram . SORT :
            sortActionPerformed ( event );
             break ;
         default :
             break ;
         }

     }

     private   void  sortActionPerformed ( ActionEvent  event )   {
         JComboBox < String >  combo  =   ( JComboBox < String > )  event . getSource ();
         String  currentSortCondition  =   ( String )  combo . getSelectedItem ();
        
         switch   ( currentSortCondition )   {
         case   "All By Name" :
            seaPortProgram . world . sortByName ();
             break ;
         case   "Ships by Weight" :
            seaPortProgram . world . sortShipsByWeight ();
             break ;
         case   "Ships by length" :
            seaPortProgram . world . sortShipsByLength ();
             break ;
         case   "Ships by width" :
            seaPortProgram . world . sortShipsByWidth ();
             break ;
         case   "Ships by draft" :
            seaPortProgram . world . sortShipsByDraft ();
             break ;

         default :
             break ;
         }
        seaPortProgram . getOutPutArea (). setText ( seaPortProgram . world . toString ());
     }

     private   void  openFileActionPerformed ( ActionEvent  event )   {
         JFileChooser  fileChooser  =   new   JFileChooser ( "." );
         int  result  =  fileChooser . showOpenDialog ( fileChooser );
         if ( result  ==   JFileChooser . APPROVE_OPTION ){
            
             File  selectedFile  =  fileChooser . getSelectedFile ();
             try ( Scanner  sc  =   new   Scanner ( selectedFile )){
                 while ( sc . hasNextLine ()){
                    seaPortProgram . world . process ( sc . nextLine ());
                 }
                
             }   catch   ( FileNotFoundException  e )   {
                 JOptionPane . showMessageDialog ( null ,   "File can not be opened" ,   "File Open Error" ,   JOptionPane . ERROR_MESSAGE );
             }
            
            seaPortProgram . getOutPutArea (). setText ( seaPortProgram . world . toString ());
         }
        
     }

     private   void  searchActionPerformed ( ActionEvent  event )   {
         if   ( ! seaPortProgram . searchField . getText (). isEmpty ())   {
             String  searchText  =  seaPortProgram . searchField . getText ();
            searchText  =  searchText . toLowerCase ();
             if   ( seaPortProgram . rbName . isSelected ())   {
                seaPortProgram . getOutPutArea (). setText ( seaPortProgram . world . searchByName ( searchText ));
             }   else   if   ( seaPortProgram . rbIndex . isSelected ())   {
                seaPortProgram . getOutPutArea (). setText ( seaPortProgram . world . searchByIndex ( searchText ));              
             }   else   if   ( seaPortProgram . rbSkill . isSelected ())   {
                seaPortProgram . getOutPutArea (). setText ( seaPortProgram . world . searchBySkill ( searchText ));              
             }
         }
     }
}

SeaPorts/src/edu/umuc/cmsc335/ui/SeaPortProgram.java

SeaPorts/src/edu/umuc/cmsc335/ui/SeaPortProgram.java

package  edu . umuc . cmsc335 . ui ;

import  java . awt . BorderLayout ;
import  java . awt . Dimension ;

import  javax . swing . ButtonGroup ;
import  javax . swing . Icon ;
import  javax . swing . JButton ;
import  javax . swing . JComboBox ;
import  javax . swing . JFrame ;
import  javax . swing . JPanel ;
import  javax . swing . JRadioButton ;
import  javax . swing . JScrollPane ;
import  javax . swing . JTextArea ;
import  javax . swing . JTextField ;

import  edu . umuc . cmsc335 . beans . World ;

@ SuppressWarnings ( "serial" )
public   class   SeaPortProgram   extends   JFrame   {
    
     public   World  world ;
     private   static   final   String  TITLE  =   "Sea Port Program" ;
     public   static   final   String  OPEN_FILE  =   "Open File" ;
     public   static   final   String  SEARCH  =   "Search" ;
     public   static   final   String  SORT  =   "Sort" ;
     public   static   final   String   []  SORT_OPTION  =   { "All By Name" ,   "Ships by Weight" ,   "Ships by length" ,   "Ships by width" ,   "Ships by draft"   };
    

     //variables used by the GUI interface
     //JFileChooser
    
     //JButton
     JButton  openFileButton  =   null ;
     JButton  searchButton  =   null ;
    
     //JRadioButton
     ButtonGroup  group  =   null ;
     JRadioButton  rbName ,  rbIndex ,  rbSkill ;
     //JTextArea
    
     JTextArea  outPutArea  =   null ;
     JScrollPane  scrollPane  =   null ;
    
     //Jpanel 
     JPanel  buttonsPanel  =   null ;
     JPanel  comboButtonPanel  =   null ;
    
     //JTextField
     JTextField  searchField  =   null ;
    
     //JComboBox
     JComboBox < String >  sortComboBox  =   null ;
    
     public   SeaPortProgram (){
        world  =   new   World ( "Earth" ,   0 ,   0 )   ;    // TODO Move this so loading a new file recreates the world
         //make a frame
         super . setTitle ( SeaPortProgram . TITLE );
         super . setLayout ( new   BorderLayout ());
         super . setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE );
        
         //make the widget
        buttonsPanel  =  getButtonspanel ();
        outPutArea  =  getOutPutArea ();
        scrollPane  =  getScrollPane ( outPutArea );
        
        
         //add the widget  to the frame
        
         super . add ( buttonsPanel ,   BorderLayout . PAGE_START );
         super . add ( scrollPane );
         super . pack ();
        
         //display the frame
         super . setVisible ( true );
         super . validate ();
         super . setLocationRelativeTo ( null );
        
     }
    




     public   JTextArea  getOutPutArea ()   {
         if ( outPutArea  ==   null ){
            outPutArea  =   new   JTextArea ( "Select \" Open File\" to load the file" );
            outPutArea . setEditable ( false );
                        
         }
         return  outPutArea ;
     }



     private   JScrollPane  getScrollPane (   JTextArea  outPutArea2 )   {
         if ( scrollPane  ==   null ){
            scrollPane  =   new   JScrollPane ( outPutArea2 );
            scrollPane . setPreferredSize ( new   Dimension ( 500 ,   300 ));
         }
         return  scrollPane ;
     }



     private   JTextField  getSearchField ()   {
         if ( searchField  ==   null ){
            searchField  =   new   JTextField ();
         }
         return  searchField ;
     }

     private   JPanel  getComboButtonPanel ()   {
         if   ( comboButtonPanel  ==   null )   {
            comboButtonPanel  =   new   JPanel ();
            group  =   new   ButtonGroup ();
            rbName  =   new   JRadioButton ( "Name" );
            rbIndex  =   new   JRadioButton ( "Index" );
            rbSkill  =   new   JRadioButton ( "Skill" );
            group . add ( rbName );
            group . add ( rbIndex );
            group . add ( rbSkill );
            comboButtonPanel . add ( rbName );
            comboButtonPanel . add ( rbIndex );
            comboButtonPanel . add ( rbSkill );
         }
         return  comboButtonPanel ;
     }

     private   JPanel  getButtonspanel ()   {
         if ( buttonsPanel  ==   null ){
            buttonsPanel  =   new   JPanel ();
            buttonsPanel . setLayout ( new   BorderLayout ());
            
            openFileButton  =  getOpenFileButton ();
            searchButton  =  getSearchButton ();
            searchField  =  getSearchField ();
            comboButtonPanel  =  getComboButtonPanel ();
            sortComboBox  =  getSortComboBox ();
            
            buttonsPanel . add ( openFileButton ,   BorderLayout . WEST );
            buttonsPanel . add ( searchButton ,   BorderLayout . EAST );
            buttonsPanel . add ( comboButtonPanel ,   BorderLayout . SOUTH );
            buttonsPanel . add ( searchField ,   BorderLayout . CENTER );
            buttonsPanel . add ( sortComboBox ,   BorderLayout . NORTH );
            
         }
         return  buttonsPanel ;
     }



     private   JButton  getSearchButton ()   {
         if ( searchButton  ==   null ){
            searchButton  =   new   JButton ( SeaPortProgram . SEARCH );
            searchButton . addActionListener ( new   SeaPortListener ( this ));
            searchButton . setActionCommand ( SeaPortProgram . SEARCH );
         }
        
         return  searchButton ;
     }



     private   JButton  getOpenFileButton ()   {
         if ( openFileButton   ==   null ){
            openFileButton  =   new   JButton ( SeaPortProgram . OPEN_FILE );
            openFileButton . addActionListener ( new   SeaPortListener ( this )   );
            openFileButton . setActionCommand ( SeaPortProgram . OPEN_FILE );
         }
         return  openFileButton ;
     }

     public   JComboBox <   String >  getSortComboBox (){
         if ( sortComboBox  ==   null ){
            sortComboBox  =   new   JComboBox <> ( SORT_OPTION );
            sortComboBox . addActionListener ( new   SeaPortListener ( this )   );
            sortComboBox . setActionCommand ( SeaPortProgram . SORT );
         }
         return  sortComboBox ;
     
     }

     public   static   void  main  ( String []  args ){
         JFrame . setDefaultLookAndFeelDecorated ( true );
         SeaPortProgram  gui  =   new   SeaPortProgram ();
     }
}