<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FSession_Pattern</id>
		<title>Java/Design Pattern/Session Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FSession_Pattern"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Session_Pattern&amp;action=history"/>
		<updated>2026-04-16T14:02:51Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Session_Pattern&amp;diff=7831&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Session_Pattern&amp;diff=7831&amp;oldid=prev"/>
				<updated>2010-06-01T06:51:01Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:51, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Session_Pattern&amp;diff=7830&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Session_Pattern&amp;diff=7830&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Session Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.net.MalformedURLException;&lt;br /&gt;
import java.rmi.Naming;&lt;br /&gt;
import java.rmi.NotBoundException;&lt;br /&gt;
import java.rmi.Remote;&lt;br /&gt;
import java.rmi.RemoteException;&lt;br /&gt;
import java.rmi.server.UnicastRemoteObject;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
public class RunSessionPattern {&lt;br /&gt;
  public static void main(String[] arguments) {&lt;br /&gt;
    System.out.println(&amp;quot;Example for the Session pattern&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;This demonstration will show how a Session can be used&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; to organize a series of actions between a client and&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; server.&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;In this case, clients will use sessions to coordinate&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; edits of Contact addresses.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Running the RMI compiler (rmic)&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    try {&lt;br /&gt;
      Process p1 = Runtime.getRuntime().exec(&amp;quot;rmic SessionServerImpl&amp;quot;);&lt;br /&gt;
      p1.waitFor();&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Unable to run rmic utility. Exiting application.&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    } catch (InterruptedException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Threading problems encountered while using the rmic utility.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Starting the rmiregistry&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    Process rmiProcess = null;&lt;br /&gt;
    try {&lt;br /&gt;
      rmiProcess = Runtime.getRuntime().exec(&amp;quot;rmiregistry&amp;quot;);&lt;br /&gt;
      Thread.sleep(15000);&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Unable to start the rmiregistry. Exiting application.&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    } catch (InterruptedException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Threading problems encountered when starting the rmiregistry.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Creating the SessionServer and two SessionClient objects&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    SessionServer serverObject = new SessionServerImpl();&lt;br /&gt;
    SessionClient clientOne = new SessionClient();&lt;br /&gt;
    SessionClient clientTwo = new SessionClient();&lt;br /&gt;
    System.out.println(&amp;quot;Creating sample Contacts and Addresses&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    Contact firstContact = new ContactImpl(&amp;quot;First&amp;quot;, &amp;quot;Contact&amp;quot;, &amp;quot;primo&amp;quot;,&lt;br /&gt;
        &amp;quot;OOI&amp;quot;, null);&lt;br /&gt;
    Contact secondContact = new ContactImpl(&amp;quot;Second&amp;quot;, &amp;quot;Contact&amp;quot;, &amp;quot;secondo&amp;quot;,&lt;br /&gt;
        &amp;quot;OOI&amp;quot;, null);&lt;br /&gt;
    Address workAddress = new AddressImpl(&amp;quot;Work address&amp;quot;, &amp;quot;5440 Division&amp;quot;,&lt;br /&gt;
        &amp;quot;Fargo&amp;quot;, &amp;quot;ND&amp;quot;, &amp;quot;54321&amp;quot;);&lt;br /&gt;
    Address homeAddress = new AddressImpl(&amp;quot;Home address&amp;quot;, &amp;quot;40 Planar Way&amp;quot;,&lt;br /&gt;
        &amp;quot;Paris&amp;quot;, &amp;quot;TX&amp;quot;, &amp;quot;84301&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Adding a contact. Both clients will attempt to edit&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; the same contact at first, which will result in a&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; SessionException.&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
      clientOne.addContact(firstContact);&lt;br /&gt;
      clientTwo.addContact(firstContact);&lt;br /&gt;
    } catch (SessionException exc) {&lt;br /&gt;
      System.err.println(&amp;quot;Exception encountered:&amp;quot;);&lt;br /&gt;
      System.err.println(exc);&lt;br /&gt;
    }&lt;br /&gt;
    try {&lt;br /&gt;
      System.out&lt;br /&gt;
          .println(&amp;quot;Adding a different contact to the second client&amp;quot;);&lt;br /&gt;
      clientTwo.addContact(secondContact);&lt;br /&gt;
      System.out&lt;br /&gt;
          .println(&amp;quot;Adding addresses to the first and second clients&amp;quot;);&lt;br /&gt;
      clientTwo.addAddress(workAddress);&lt;br /&gt;
      clientOne.addAddress(homeAddress);&lt;br /&gt;
      clientTwo.addAddress(workAddress);&lt;br /&gt;
      clientTwo.addAddress(homeAddress);&lt;br /&gt;
      System.out.println(&amp;quot;Removing address from a client&amp;quot;);&lt;br /&gt;
      clientTwo.removeAddress(homeAddress);&lt;br /&gt;
      System.out.println(&amp;quot;Finalizing the edits to the contacts&amp;quot;);&lt;br /&gt;
      clientOne.rumitChanges();&lt;br /&gt;
      clientTwo.rumitChanges();&lt;br /&gt;
      System.out.println(&amp;quot;Changes finalized&amp;quot;);&lt;br /&gt;
      clientTwo.addContact(firstContact);&lt;br /&gt;
    } catch (SessionException exc) {&lt;br /&gt;
      System.err.println(&amp;quot;Exception encountered:&amp;quot;);&lt;br /&gt;
      System.err.println(exc);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;The following lines will show the state&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; of the server-side delegate, which in this&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; example represents a persistent data store.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Contact list:&amp;quot;);&lt;br /&gt;
    System.out.println(SessionServerDelegate.getContacts());&lt;br /&gt;
    System.out.println(&amp;quot;Address list:&amp;quot;);&lt;br /&gt;
    System.out.println(SessionServerDelegate.getAddresses());&lt;br /&gt;
    System.out.println(&amp;quot;Edit contacts:&amp;quot;);&lt;br /&gt;
    System.out.println(SessionServerDelegate.getEditContacts());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Address extends Serializable {&lt;br /&gt;
  public static final String EOL_STRING = System&lt;br /&gt;
      .getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public static final String COMMA = &amp;quot;,&amp;quot;;&lt;br /&gt;
  public String getType();&lt;br /&gt;
  public String getDescription();&lt;br /&gt;
  public String getStreet();&lt;br /&gt;
  public String getCity();&lt;br /&gt;
  public String getState();&lt;br /&gt;
  public String getZipCode();&lt;br /&gt;
  public void setType(String newType);&lt;br /&gt;
  public void setDescription(String newDescription);&lt;br /&gt;
  public void setStreet(String newStreet);&lt;br /&gt;
  public void setCity(String newCity);&lt;br /&gt;
  public void setState(String newState);&lt;br /&gt;
  public void setZipCode(String newZip);&lt;br /&gt;
}&lt;br /&gt;
class AddressImpl implements Address {&lt;br /&gt;
  private String type;&lt;br /&gt;
  private String description;&lt;br /&gt;
  private String street;&lt;br /&gt;
  private String city;&lt;br /&gt;
  private String state;&lt;br /&gt;
  private String zipCode;&lt;br /&gt;
  public AddressImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public AddressImpl(String newDescription, String newStreet, String newCity,&lt;br /&gt;
      String newState, String newZipCode) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
    city = newCity;&lt;br /&gt;
    state = newState;&lt;br /&gt;
    zipCode = newZipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public String getType() {&lt;br /&gt;
    return type;&lt;br /&gt;
  }&lt;br /&gt;
  public String getDescription() {&lt;br /&gt;
    return description;&lt;br /&gt;
  }&lt;br /&gt;
  public String getStreet() {&lt;br /&gt;
    return street;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCity() {&lt;br /&gt;
    return city;&lt;br /&gt;
  }&lt;br /&gt;
  public String getState() {&lt;br /&gt;
    return state;&lt;br /&gt;
  }&lt;br /&gt;
  public String getZipCode() {&lt;br /&gt;
    return zipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public void setType(String newType) {&lt;br /&gt;
    type = newType;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDescription(String newDescription) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
  }&lt;br /&gt;
  public void setStreet(String newStreet) {&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
  }&lt;br /&gt;
  public void setCity(String newCity) {&lt;br /&gt;
    city = newCity;&lt;br /&gt;
  }&lt;br /&gt;
  public void setState(String newState) {&lt;br /&gt;
    state = newState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setZipCode(String newZip) {&lt;br /&gt;
    zipCode = newZip;&lt;br /&gt;
  }&lt;br /&gt;
  public boolean equals(Object o) {&lt;br /&gt;
    if (!(o instanceof AddressImpl)) {&lt;br /&gt;
      return false;&lt;br /&gt;
    } else {&lt;br /&gt;
      AddressImpl address = (AddressImpl) o;&lt;br /&gt;
      if (street.equals(address.street) &amp;amp;&amp;amp; city.equals(address.city)&lt;br /&gt;
          &amp;amp;&amp;amp; state.equals(address.state)&lt;br /&gt;
          &amp;amp;&amp;amp; zipCode.equals(address.zipCode)) {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return street + EOL_STRING + city + COMMA + SPACE + state + SPACE&lt;br /&gt;
        + zipCode + EOL_STRING;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SessionServerImpl implements SessionServer {&lt;br /&gt;
  private static final String SESSION_SERVER_SERVICE_NAME = &amp;quot;sessionServer&amp;quot;;&lt;br /&gt;
  public SessionServerImpl() {&lt;br /&gt;
    try {&lt;br /&gt;
      UnicastRemoteObject.exportObject(this);&lt;br /&gt;
      Naming.rebind(SESSION_SERVER_SERVICE_NAME, this);&lt;br /&gt;
    } catch (Exception exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Error using RMI to register the SessionServerImpl &amp;quot;&lt;br /&gt;
              + exc);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public long addContact(Contact contact, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    return SessionServerDelegate.addContact(contact, sessionID);&lt;br /&gt;
  }&lt;br /&gt;
  public long addAddress(Address address, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    return SessionServerDelegate.addAddress(address, sessionID);&lt;br /&gt;
  }&lt;br /&gt;
  public long removeAddress(Address address, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    return SessionServerDelegate.removeAddress(address, sessionID);&lt;br /&gt;
  }&lt;br /&gt;
  public long finalizeContact(long sessionID) throws SessionException {&lt;br /&gt;
    return SessionServerDelegate.finalizeContact(sessionID);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface SessionServer extends Remote {&lt;br /&gt;
  public long addContact(Contact contact, long sessionID)&lt;br /&gt;
      throws RemoteException, SessionException;&lt;br /&gt;
  public long addAddress(Address address, long sessionID)&lt;br /&gt;
      throws RemoteException, SessionException;&lt;br /&gt;
  public long removeAddress(Address address, long sessionID)&lt;br /&gt;
      throws RemoteException, SessionException;&lt;br /&gt;
  public long finalizeContact(long sessionID) throws RemoteException,&lt;br /&gt;
      SessionException;&lt;br /&gt;
}&lt;br /&gt;
class SessionServerDelegate {&lt;br /&gt;
  private static final long NO_SESSION_ID = 0;&lt;br /&gt;
  private static long nextSessionID = 1;&lt;br /&gt;
  private static ArrayList contacts = new ArrayList();&lt;br /&gt;
  private static ArrayList addresses = new ArrayList();&lt;br /&gt;
  private static HashMap editContacts = new HashMap();&lt;br /&gt;
  public static long addContact(Contact contact, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    if (sessionID &amp;lt;= NO_SESSION_ID) {&lt;br /&gt;
      sessionID = getSessionID();&lt;br /&gt;
    }&lt;br /&gt;
    if (contacts.indexOf(contact) != -1) {&lt;br /&gt;
      if (!editContacts.containsValue(contact)) {&lt;br /&gt;
        editContacts.put(new Long(sessionID), contact);&lt;br /&gt;
      } else {&lt;br /&gt;
        throw new SessionException(&lt;br /&gt;
            &amp;quot;This contact is currently being edited by another user.&amp;quot;,&lt;br /&gt;
            SessionException.CONTACT_BEING_EDITED);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      contacts.add(contact);&lt;br /&gt;
      editContacts.put(new Long(sessionID), contact);&lt;br /&gt;
    }&lt;br /&gt;
    return sessionID;&lt;br /&gt;
  }&lt;br /&gt;
  public static long addAddress(Address address, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    if (sessionID &amp;lt;= NO_SESSION_ID) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;A valid session ID is required to add an address&amp;quot;,&lt;br /&gt;
          SessionException.SESSION_ID_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    Contact contact = (Contact) editContacts.get(new Long(sessionID));&lt;br /&gt;
    if (contact == null) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;You must select a contact before adding an address&amp;quot;,&lt;br /&gt;
          SessionException.CONTACT_SELECT_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    if (addresses.indexOf(address) == -1) {&lt;br /&gt;
      addresses.add(address);&lt;br /&gt;
    }&lt;br /&gt;
    contact.addAddress(address);&lt;br /&gt;
    return sessionID;&lt;br /&gt;
  }&lt;br /&gt;
  public static long removeAddress(Address address, long sessionID)&lt;br /&gt;
      throws SessionException {&lt;br /&gt;
    if (sessionID &amp;lt;= NO_SESSION_ID) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;A valid session ID is required to remove an address&amp;quot;,&lt;br /&gt;
          SessionException.SESSION_ID_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    Contact contact = (Contact) editContacts.get(new Long(sessionID));&lt;br /&gt;
    if (contact == null) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;You must select a contact before removing an address&amp;quot;,&lt;br /&gt;
          SessionException.CONTACT_SELECT_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    if (addresses.indexOf(address) == -1) {&lt;br /&gt;
      throw new SessionException(&amp;quot;There is no record of this address&amp;quot;,&lt;br /&gt;
          SessionException.ADDRESS_DOES_NOT_EXIST);&lt;br /&gt;
    }&lt;br /&gt;
    contact.removeAddress(address);&lt;br /&gt;
    return sessionID;&lt;br /&gt;
  }&lt;br /&gt;
  public static long finalizeContact(long sessionID) throws SessionException {&lt;br /&gt;
    if (sessionID &amp;lt;= NO_SESSION_ID) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;A valid session ID is required to finalize a contact&amp;quot;,&lt;br /&gt;
          SessionException.SESSION_ID_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    Contact contact = (Contact) editContacts.get(new Long(sessionID));&lt;br /&gt;
    if (contact == null) {&lt;br /&gt;
      throw new SessionException(&lt;br /&gt;
          &amp;quot;You must select and edit a contact before committing changes&amp;quot;,&lt;br /&gt;
          SessionException.CONTACT_SELECT_REQUIRED);&lt;br /&gt;
    }&lt;br /&gt;
    editContacts.remove(new Long(sessionID));&lt;br /&gt;
    return NO_SESSION_ID;&lt;br /&gt;
  }&lt;br /&gt;
  private static long getSessionID() {&lt;br /&gt;
    return nextSessionID++;&lt;br /&gt;
  }&lt;br /&gt;
  public static ArrayList getContacts() {&lt;br /&gt;
    return contacts;&lt;br /&gt;
  }&lt;br /&gt;
  public static ArrayList getAddresses() {&lt;br /&gt;
    return addresses;&lt;br /&gt;
  }&lt;br /&gt;
  public static ArrayList getEditContacts() {&lt;br /&gt;
    return new ArrayList(editContacts.values());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Contact extends Serializable {&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public static final String EOL_STRING = System&lt;br /&gt;
      .getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
  public String getFirstName();&lt;br /&gt;
  public String getLastName();&lt;br /&gt;
  public String getTitle();&lt;br /&gt;
  public String getOrganization();&lt;br /&gt;
  public ArrayList getAddresses();&lt;br /&gt;
  public void setFirstName(String newFirstName);&lt;br /&gt;
  public void setLastName(String newLastName);&lt;br /&gt;
  public void setTitle(String newTitle);&lt;br /&gt;
  public void setOrganization(String newOrganization);&lt;br /&gt;
  public void addAddress(Address address);&lt;br /&gt;
  public void removeAddress(Address address);&lt;br /&gt;
}&lt;br /&gt;
class ContactImpl implements Contact {&lt;br /&gt;
  private String firstName;&lt;br /&gt;
  private String lastName;&lt;br /&gt;
  private String title;&lt;br /&gt;
  private String organization;&lt;br /&gt;
  private ArrayList addresses = new ArrayList();&lt;br /&gt;
  public ContactImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public ContactImpl(String newFirstName, String newLastName,&lt;br /&gt;
      String newTitle, String newOrganization, ArrayList newAddresses) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
    if (newAddresses != null) {&lt;br /&gt;
      addresses = newAddresses;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public String getFirstName() {&lt;br /&gt;
    return firstName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getLastName() {&lt;br /&gt;
    return lastName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getTitle() {&lt;br /&gt;
    return title;&lt;br /&gt;
  }&lt;br /&gt;
  public String getOrganization() {&lt;br /&gt;
    return organization;&lt;br /&gt;
  }&lt;br /&gt;
  public ArrayList getAddresses() {&lt;br /&gt;
    return addresses;&lt;br /&gt;
  }&lt;br /&gt;
  public void setFirstName(String newFirstName) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLastName(String newLastName) {&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setTitle(String newTitle) {&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
  }&lt;br /&gt;
  public void setOrganization(String newOrganization) {&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public void addAddress(Address address) {&lt;br /&gt;
    if (!addresses.contains(address)) {&lt;br /&gt;
      addresses.add(address);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void removeAddress(Address address) {&lt;br /&gt;
    addresses.remove(address);&lt;br /&gt;
  }&lt;br /&gt;
  public boolean equals(Object o) {&lt;br /&gt;
    if (!(o instanceof ContactImpl)) {&lt;br /&gt;
      return false;&lt;br /&gt;
    } else {&lt;br /&gt;
      ContactImpl contact = (ContactImpl) o;&lt;br /&gt;
      if (firstName.equals(contact.firstName)&lt;br /&gt;
          &amp;amp;&amp;amp; lastName.equals(contact.lastName)&lt;br /&gt;
          &amp;amp;&amp;amp; organization.equals(contact.organization)&lt;br /&gt;
          &amp;amp;&amp;amp; title.equals(contact.title)) {&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return firstName + SPACE + lastName + EOL_STRING + addresses;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SessionClient {&lt;br /&gt;
  private static final String SESSION_SERVER_SERVICE_NAME = &amp;quot;sessionServer&amp;quot;;&lt;br /&gt;
  private static final String SESSION_SERVER_MACHINE_NAME = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
  private long sessionID;&lt;br /&gt;
  private SessionServer sessionServer;&lt;br /&gt;
  public SessionClient() {&lt;br /&gt;
    try {&lt;br /&gt;
      String url = &amp;quot;//&amp;quot; + SESSION_SERVER_MACHINE_NAME + &amp;quot;/&amp;quot;&lt;br /&gt;
          + SESSION_SERVER_SERVICE_NAME;&lt;br /&gt;
      sessionServer = (SessionServer) Naming.lookup(url);&lt;br /&gt;
    } catch (RemoteException exc) {&lt;br /&gt;
    } catch (NotBoundException exc) {&lt;br /&gt;
    } catch (MalformedURLException exc) {&lt;br /&gt;
    } catch (ClassCastException exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void addContact(Contact contact) throws SessionException {&lt;br /&gt;
    try {&lt;br /&gt;
      sessionID = sessionServer.addContact(contact, 0);&lt;br /&gt;
    } catch (RemoteException exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void addAddress(Address address) throws SessionException {&lt;br /&gt;
    try {&lt;br /&gt;
      sessionServer.addAddress(address, sessionID);&lt;br /&gt;
    } catch (RemoteException exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void removeAddress(Address address) throws SessionException {&lt;br /&gt;
    try {&lt;br /&gt;
      sessionServer.removeAddress(address, sessionID);&lt;br /&gt;
    } catch (RemoteException exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void commitChanges() throws SessionException {&lt;br /&gt;
    try {&lt;br /&gt;
      sessionID = sessionServer.finalizeContact(sessionID);&lt;br /&gt;
    } catch (RemoteException exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SessionException extends Exception {&lt;br /&gt;
  public static final int CONTACT_BEING_EDITED = 1;&lt;br /&gt;
  public static final int SESSION_ID_REQUIRED = 2;&lt;br /&gt;
  public static final int CONTACT_SELECT_REQUIRED = 3;&lt;br /&gt;
  public static final int ADDRESS_DOES_NOT_EXIST = 4;&lt;br /&gt;
  private int errorCode;&lt;br /&gt;
  public SessionException(String cause, int newErrorCode) {&lt;br /&gt;
    super(cause);&lt;br /&gt;
    errorCode = newErrorCode;&lt;br /&gt;
  }&lt;br /&gt;
  public SessionException(String cause) {&lt;br /&gt;
    super(cause);&lt;br /&gt;
  }&lt;br /&gt;
  public int getErrorCode() {&lt;br /&gt;
    return errorCode;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>