package com.wiley.compbooks.brose.chapter10.office;

/**
 * RoomImpl.java
 */

import java.util.Vector;
import java.io.*;
import org.omg.CORBA.*;
import com.wiley.compbooks.brose.chapter10.office.RoomPackage.*;

public class RoomImpl 
    extends RoomPOA 
    implements java.io.Serializable
{
    private String name;
    transient Building site;
    private String siteIOR;

    public transient boolean dirty = false;
    public transient ORB orb;

    /** the meetings, indexed by year and month */
    private Diary diary;

    // constructor

    public RoomImpl( String name, Building building, ORB orb ) 
    {
	this.orb = orb;
        this.name = name;
	this.site = building;

        diary = new Diary(orb);
    }

    public void init( ORB orb )
    {
	this.orb = orb;
	diary.init(orb);
	this.site = BuildingHelper.narrow( orb.string_to_object( siteIOR ));
	
    }

    // attributes

    public String name() 
    {
        return name; 
    }
       
    public Building site() 
    {
        return site; 
    }

    private void writeObject(java.io.ObjectOutputStream out)
	throws IOException
    {
	/*
	 * For serialization, object references are transformed
	 * into strings
	 */

	if( this.site == null )
	    System.out.println(" writeObject === site null");
	else
	    System.out.println(" writeObject === ok ");

	siteIOR = orb.object_to_string( (org.omg.CORBA.Object) site );
	out.defaultWriteObject();
    }

        
    /* operations */

    public String[] viewDayBookings (int year, Month month, short day) 
    {
	java.lang.Object[] bookings = 
	    diary.getDay( year, month, day );
	String[] meetings = 
	    new String[bookings.length];
	System.arraycopy(bookings, 0, meetings, 0, bookings.length);
        return meetings;
    }

    public String[] viewBookings() 
    {
	java.lang.Object[] bookings = 
	    diary.getToday();
	String[] meetings = 
	    new String[bookings.length];
	System.arraycopy(bookings,0,meetings,0, bookings.length);
        return meetings;
    }


    public void book( Date slot, String meeting_description )
        throws SlotAlreadyTaken 
    {
	try
	{
	    diary.enter( slot, slot.the_hour + 
				"h: " +  meeting_description );
	    dirty = true;
	}
	catch( AlreadyEngaged ae )
	{
	    throw new SlotAlreadyTaken();
	}
    }

    public void cancelBooking( Date slot )
        throws NoMeetingAtThisTime 
    {
	java.lang.Object o = diary.remove( slot );
	if( o == null )	    
            throw new NoMeetingAtThisTime();
	dirty = true;
    }


}

