package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.rmi.Remote;

/**
 * Metody biznesowe udostepniane przez komponent Cennik.
 *
 * Zdefiniowany tu interfejs lokalny jest przeznaczony
 * dla klientow zdalnych operujacych na komponencie. Interfejs ten
 * bedzie implementowany przez kontener; implementowany obiekt jest nazywany
 * lokalnym obiektem EJB, ktory jest odpowiedzialny za delegacje
 * wywolan do instancji klasy komponentu encyjnego.
 */
public interface Cennik extends EJBObject {

	/**
	 * Oblicza cene zbioru towarow.
	 */
	public void cena(Koszyk koszyk) throws RemoteException, CennikException;
}
package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;

/**
 * Jest to lokalny interfejs domowy dla komponentu Cennik.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywolywany przez lokalny obiekt domowy
 * i sluzy jako producent dla obiektow lokalnych EJB.
 */
public interface CennikDom extends EJBHome {

   /*
    * Metoda tworzy obiekt EJB.
    *
    * @return Nowo utworzony obiekt EJB.
    */
  Cennik create() throws RemoteException, CreateException;
}
package przyklady;

/**
 * Wyjatki zglaszane przez komponent Cennik.
 */
public class CennikException extends Exception {

	public CennikException() {
		super();
	}

	public CennikException(Exception e) {
		super(e.toString());
	}

	public CennikException(String s) {
		super(s);
	}
}
package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.util.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;

/**
 * Bezstanowy komponent sesyjny obliczajacy ceny.
 * Bazuje on na zbiorze regul, ktore sa instalowane razem z
 * komponentem jako wlasciwosci srodowiska.
 */

public class CennikKomponent implements SessionBean {

    // Stale wykorzystywane do odczytu wlasciwosci
    public static final String SR_RABAT = "java:comp/env/CennikWlasc/RABAT_";
    public static final String SR_PROC_PODATEK = "java:comp/env/CennikWlasc/PROC_PODATEK";

  /*
   * Choc jest to bezstanowy komponent sesyjny, posiada on stan -
   * kontekst sesji. Nalezy pamietac, ze bezstanowe
   * komponenty sesyjne moga przechowywac stan, nie moga jedynie
   * przechowywac stanu na rzecz okreslonego klienta.
   */
    private SessionContext ctx;

    //----------------------------------------------------
    // Poczatek metod biznesowych
    //----------------------------------------------------

    /**
     * Oblicza calkowita wartosc koszyka. Zawiera ona sume wartosci
     * i podatkow. Ustawia odpowiednie pola koszyka.
     * Udostepniamy te ogolna metode, aby uniknac dodatkowego
     * ruchu w sieci dla wyceniania poszczegolnych towarow w koszyku.
     */
    public void cena(Koszyk koszyk) throws CennikException, RemoteException {
        obliczCena(koszyk);
        obliczPodatek(koszyk);
    }

    /**
     * Oblicza cene zbioru towarow, ktorymi jest zainteresowany klient.
     * Cena ta zawiera cene kazdego wybranego przez klienta towaru,
     * ilosc tych towarow i wszystkie rabaty jakie otrzymal klient.
     * Cena ta nie zawiera podatkow.
     *
     * @param koszyk Dane potrzebne do wyliczenia ceny
     */
    private void obliczCena(Koszyk koszyk) throws CennikException, RemoteException {
      System.out.println("Wywolano CennikKomponent.obliczCena()");

      /*
       * Rabat otrzymuja klienci o okreslonych nazwach.
       * Reguly rabatowania sa zapisane we wlasciwosciach srodowiska
       * komponentu.
       *
       * Pobranie nazwy klienta.
       */
      Uzytkownik uzytkownik = pobierzUzytkownik(koszyk.pobierzWlasciciel());
      String nazwaKlienta = uzytkownik.pobierzIDKlienta();
      double procentRabat = 0;
      boolean znacznik=true;
      int i=0;
      try {
      Context kontPocz = new InitialContext();
      while(znacznik) {

        /*
         * Pobranie nastepnego zapisu rabatu ze zmiennych
         * srodowiska. Zapis ten ma postac
         * "<nazwa>=<% rabatu>". Na przyklad,
         * "Jan Kowalski=50" co oznacza, ze
         * klient Jan Kowalski ma 50% rabatu.
         */
        String rabat = (String) kontPocz.lookup(SR_RABAT + i++);
        System.out.println("Rabat:"+rabat);

        /*
         * Podzial ciagu na nazwe klienta i jego rabat.
         */
        StringTokenizer token = new StringTokenizer(rabat, "=", false);
        String nazwaKlientaRabat = token.nextToken();
        procentRabat = Double.valueOf(token.nextToken()).doubleValue();

        /*
         * Jezeli rabat odnosi sie do biezacego klienta
         * zatrzymujemy analize. W przeciwnym przypadku
         * przechodzimy do nastepnego zapisu rabatu.
         */
        if (nazwaKlientaRabat.equals(nazwaKlienta)) {
          break;
        }
        System.out.println("Cennik.obliczCena(): " + nazwaKlienta + " otrzymuje " + procentRabat + "% rabatu.");
      }
        }catch(javax.naming.NameNotFoundException ne){
      znacznik=false;
    }catch (Exception e) {
      e.printStackTrace();
      System.out.println("Cennik.obliczCena(): " + nazwaKlienta + " nie otrzymal rabatu.");
    }

        /*
         * Obliczony zostal rabat dla klienta.
         * Nastepnym krokiem jest obnizenie ceny wszystkich towarow
         * jakie klient posiada w koszyku.
         *
         * Musimy pobrac cene i ilosc kazdego towaru
         * w koszyku. Obiekt Koszyk zawiera te dane w
         * kolejnych obiektach WierszElement.
         * Zawieraja one cene i ilosc dla kazdego towaru.
         */

        /*
         * Na poczatek pobieramy wszystkie obiekty WierszElement
         * z koszyka.
         */
        Enumeration wierszElementy = Collections.enumeration(koszyk.pobierzWszystkie());

        /*
         * Obliczenie wartosci.
         */
        double wartosc = 0;
        try {
            /*
             * Dla kazdego elementu wiersza...
             */
            while (wierszElementy.hasMoreElements()) {
                WierszElement wiersz = (WierszElement) wierszElementy.nextElement();

                /*
                 * Pobranie ceny z elementu wiersza...
                 */
                double cenaPodst = wiersz.pobierzCena();

                /*
                 * Zastosowanie rabatu dla tego elementu wiersza...
                 */
                wiersz.ustawRabat(cenaPodst * (procentRabat/100));
            
                /*
                 * Zastosowanie globalnego rabatu...
                 */
                double cenaZRabatem =
                cenaPodst - (cenaPodst * procentRabat/100);

                /*
                 * Obliczanie wartosci calkowitej.
                 */
                wartosc += cenaZRabatem;
            }

            koszyk.ustawWartosc(wartosc);
        }catch (Exception e) {
            throw new CennikException(e.toString());
        }
    }

  /**
   * Metoda wykorzystuje komponent sesyjny ZarzadcaUzytk do odczytania danych uzytkownika.
   * Obiekt Uzytkownik zawiera identyfikator klienta, nazwe, haslo i adres klienta.
   *@param IDKlienta Identyfikator klienta
   */
  private Uzytkownik pobierzUzytkownik(String IDKlienta){
      try{
        Context ctx = new InitialContext();
        ZarzadcaUzytkDom zarzUzytkDom = (ZarzadcaUzytkDom)
          PortableRemoteObject.narrow(
            ctx.lookup("ZarzadcaUzytkDom"), ZarzadcaUzytkDom.class);
        ZarzadcaUzytk zarzadcaUzytk=zarzUzytkDom.create();

        /*
         * Obiekt ZarzadcaUzytk zwraca obiekt uzytkownika o podanym identyfikatorze.
         */
        Uzytkownik uzytkownik=zarzadcaUzytk.pobierzUzytkownik(IDKlienta);
        return uzytkownik;
      }catch (Exception e) {
        throw new EJBException(e);
      }
  }
      
    /**
     * Oblicza podatek z wartosci koszyka.
     * Poniewaz sa one obliczane z wartosci, nalezy upewnic sie
     * ze zostala ona juz policzona.
     */
    private void obliczPodatek(Koszyk koszyk) throws CennikException, RemoteException {
        System.out.println("Wywolano CennikKomponent.obliczPodatek()");

        /*
         * Obliczenie podatku.
         */
        try {
            Context konPocz = new InitialContext();
            String ciagPodatek = (String) konPocz.lookup(SR_PROC_PODATEK);
            double podatekProcent = Double.valueOf(ciagPodatek).doubleValue();
            System.out.println("Procent podatku:"+podatekProcent);
            double wart = koszyk.pobierzWartosc();
            koszyk.ustawPodatek((podatekProcent/100) * wart);
        }
        catch (Exception e) {
            e.printStackTrace();
            throw new CennikException(e.toString());
        }
    }

    //----------------------------------------------------
    // Koniec metod biznesowych
    //----------------------------------------------------

    //-----------------------------------------------
    // Poczatek metod wymaganych przez EJB.
    // Metody te sa wywolywane przez kontener i nigdy
    // nie moga byc wywolane przez kod klienta.
    //-----------------------------------------------


    public void ejbCreate() throws RemoteException {
        System.out.println("Wywolano ejbCreate()");
    }

    public void ejbRemove() {
        System.out.println("Wywolano ejbRemove()");
    }
     public void ejbActivate() {
        System.out.println("Wywolano ejbActivate()");
    }

    public void ejbPassivate() {
        System.out.println("ejbPassivate()");
    }


    public void setSessionContext(SessionContext ctx) {
        System.out.println("Wywolano setSessionContext()");
        this.ctx = ctx;
    }

    //----------------------------------------------------
    // Koniec metod wymaganych przez EJB
    //----------------------------------------------------
}
package przyklady;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;

/**
 * Serwlet ten pozwala na wyswietlenie katalogu towarow.
 *
 * W momencie wywolania tego serwletu uzytkownik musi byc zalogowany
 * (poprzez serwlet logowania) i posiadac uruchomiony koszyk
 * (komponent Koszyk). Poniewaz serwlet ten jest buforowany i
 * wykorzystywany do obslugi wywolan pochodzacych od roznych
 * uzytkownikow, kod serwletu nie zapisuje zadnych danych specyficznych
 * dla uzytkownika. Zamiast tego w globalnym obiekcie HttpSession
 * zapamietywana jest referencja do komponentu Koszyk. Obiekt ten jest
 * dostepny dla wszystkich klientow.
 */
public class SerwletKatalog extends HttpServlet {

        private KatalogDom katalogDom = null;

        /**
         * Mechanizmy obslugi serwletow wywoluja te metode jeden raz
         * w celu inicjalizacji instancji serwletu.
         *
         * W metodzie tej musimy pobrac obiekt domowy Katalog.
         */
        public void init(ServletConfig konfiguracja) throws ServletException {

                super.init(konfiguracja);

                try {
                        /*
                         * Pobranie wlasciwosci instalacji z obiektu konfiguracyjnego
                         * Parametry inicjujace JNDI sa zapamietane poza serwletem
                         * w celu umozliwienia uzytkownikom dynamicznej
                         * konfiguracji srodowiska bez potrzeby
                         * ponownej kompilacji aplikacji.
                         */
                        String kontekstPoczProd = getInitParameter(Context.INITIAL_CONTEXT_FACTORY);
                        String URLDostawcy = getInitParameter(Context.PROVIDER_URL);

                        /*
                         * Dodanie parametrow inicjalizujacych JNDI
                         * do obiektu wlasciwosci.
                         */
                        Properties srod = new Properties();
                        srod.put(Context.INITIAL_CONTEXT_FACTORY, kontekstPoczProd);
                        srod.put(Context.PROVIDER_URL, URLDostawcy);

                        /*
                         * Pobranie kontekstu poczatkowego JNDI
                         * przy wykorzystaniu z powyzszych parametrow startowych.
                         */
                        Context kontekst = new InitialContext(srod);

                        /*
                         * Wyszukanie obiektu domowego Katalog.
                         */
                        katalogDom = (KatalogDom ) kontekst.lookup("KatalogDom");
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        /**
         * Mechanizm obslugi serwletow wywoluje te metode gdy przegladarka uzytkownika
         * wysle zadanie HTTP.
         */
        public void service (HttpServletRequest zadanie, HttpServletResponse odpowiedz)
        throws ServletException, IOException {
        Vector  towary=null;
                try {

                        /*
                         * Pobranie obiektu sesji uzytkownika, HttpSession, a z niego
                         * biezacego koszyka uzytkownika.
                         */
                        HttpSession sesja = zadanie.getSession(false);
                        if (sesja == null) {
                                /*
                                 * Przekierowanie uzytkownika do strony lokowania
                                 * jezeli nie zostala otwarta sesja.
                                 */
                                odpowiedz.sendRedirect(odpowiedz.encodeRedirectURL("/jasmin/login"));
                                return;
                        }

                        Object obj = sesja.getAttribute("koszyk");
                        if (obj == null) {
                                /*
                                 * Przekierowanie uzytkownika do strony lokowania
                                 * jezeli nie zostala otwarta sesja.
                                 */
                                odpowiedz.sendRedirect(odpowiedz.encodeRedirectURL("/jasmin/login"));
                                return;
                        }
                        Koszyk koszyk = (Koszyk) obj;
                        String IDTowaruDoDodania = zadanie.getParameter("Kup");
                        towary=(Vector)sesja.getAttribute("towary");
                        String IDTowaru=(String)zadanie.getParameter("IDTowaru");

                        /*
                         * Jezeli uzytkownik chce kupic towar (poprzez parametr URL
                         * 'Kup'), dodaj zadany towar do koszyka.
                         */

                        if (IDTowaruDoDodania != null) {
                
            /*
             * Tworzy WierszElement i dodaje go do koszyka.
             */
                        try {
                TowarElement element=pobiezTowarElement(towary,IDTowaruDoDodania);
                koszyk.dodaj(new WierszElement(element,1,0));
                // Ustawienie znacznika, aby w pliku JSP mozna bylo odczytac informacje o zakupie
                zadanie.setAttribute("ZakupTowaru", element.pobierzNazwa());
                // Przeslanie zadania do pliku JSP z katalogiem
                this.getServletContext().getRequestDispatcher("/katalog.jsp").forward(zadanie, odpowiedz);
                return;
                        } catch (Exception e) {
                throw new ServletException(e.toString());
            }                                
                        }
            /*
                         * Jezeli uzytkownik chce przegladac szczegoly towaru
                         * (poprzez parametr URL 'IDTowaru')
                         */
            else if(IDTowaru!=null){
                //Odczytuje towar z wektora towarow i przekazuje go do obiektu zadanie.
                zadanie.setAttribute("towarElement",pobiezTowarElement(towary,IDTowaru));
                // Przesyla zadanie do strony JSP z opisem towaru.
                this.getServletContext().getRequestDispatcher("/informacjaTowar.jsp").forward(zadanie, odpowiedz);
                return;
                }
            /*
             * Jezeli wektor towarow jest rowny null, odczytuje obiekty WierszElement z bezstanowego komponentu sesyjnego Katalog
             * i umieszcza je w obiekcie HttpSession. Mozemy tworzyc ten wektor na poziomie aplikacji zamiast sesji.
             */
            else {
                if(towary==null){
                    Katalog katalog=katalogDom.create();
                        towary=katalog.pobierzListaTowarElement();
                        sesja.setAttribute("towary", towary);
                }
                // Przeslanie zadania o JSP katalogu.
                this.getServletContext().getRequestDispatcher("/katalog.jsp").forward(zadanie, odpowiedz);
                return;
                        }
                }catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Zwraca obiekt TowarElement dla podanego identyfikatora towaru, o ile znajduje sie w wektorze.
     */

    private TowarElement pobiezTowarElement(Vector towary,String IDTowaruDoDodania){
        int size=towary.size();
        for(int i=0; i<size; i++){
            TowarElement element=(TowarElement)towary.elementAt(i);
            if(element.pobierzIDTowaru().equals(IDTowaruDoDodania)){
               return element;
            }
       }
       return null;
   }
        public String getServletInfo() {
                return "Serwlet katalogi dodaje towary do koszyka " +
                "uzytkownika i wyswietla katalog.";

        }
}
package przyklady;

import java.io.*;
import java.util.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;

/**
 * Serwlet umozliwia przeglad i modyfikacje wybranych towarow.
 *
 * Gdy zostanie wywolany ten serwlet, uzytkownik musi byc zalogowany,
 * (poprzez serwlet logowania) i musi miec utworzony koszyk (komponent Koszyk)
 * Poniewaz serwlet ten jest buforowany i ponownie wykorzystywany
 * przez roznych uzytkownikow, w jego kodzie nie sa zapamietywane
 * zadne dane specyficzne dla uzytkownika. Zamiast tego, w obiekcie HttpSession
 * zapamietywana jest referencja do koszyka uzytkownika. Obiekt ten jest dostepny
 * dla wszystkich serwletow.
 */
public class SerwletKoszyk extends HttpServlet {

        // Obiekt EJB Cennik do wyliczania wartosci koszyka.
        private Cennik cennik;

        /**
         * Mechanizmy obslugi serwletow wywoluja te metode jeden raz
         * w celu inicjalizacji instancji serwletu.
         *
         * W metodzie tej musimy pobrac obiekt domowy Koszyk.
         */
        public void init(ServletConfig konfig) throws ServletException {

                /*
                 * Wywolanie metody z klasy bazowej w celu zapamietania obiektu
                 * konfiguracyjnego, dzieki czemu moze ja zwrocic metoda getServletConfig().
                 */
                super.init(konfig);

                try {
                        /*
                         * Pobranie wlasciwosci instalacji z obiektu konfiguracyjnego
                         * Parametry inicjujace JNDI sa zapamietane poza serwletem
                         * w celu umozliwienia uzytkownikom dynamicznej
                         * konfiguracji srodowiska bez potrzeby
                         * ponownej kompilacji aplikacji.
                         */
                        String kontekstPoczProd = getInitParameter(Context.INITIAL_CONTEXT_FACTORY);
                        String URLDostawcy = getInitParameter(Context.PROVIDER_URL);

                        /*
                         * Dodanie parametrow inicjalizujacych JNDI
                         * do obiektu wlasciwosci.
                         */
                        Properties srod = new Properties();
                        srod.put(Context.INITIAL_CONTEXT_FACTORY, kontekstPoczProd);
                        srod.put(Context.PROVIDER_URL, URLDostawcy);

                        /*
                         * Pobranie kontekstu poczatkowego JNDI
                         * przy wykorzystaniu powyzszych parametrow startowych.
                         */
                        Context kontekst = new InitialContext(srod);

                        /*
                         * Wyszukanie obiektu domowego Cennik.
                         */
                        CennikDom cennikDom = (CennikDom) kontekst.lookup("CennikDom");

                        /*
                         * Tworzenie obiektu EJB Cennik.
                         */
                        cennik = cennikDom.create();
                } catch (Exception e) {
                        log(e);
                        throw new ServletException(e.toString());
                }
        }

        /**
         * Mechanizm obslugi serwletow wywoluje te metode gdy przegladarka uzytkownika
         * wysle zadanie HTTP.
         */
        public void service (HttpServletRequest zadanie, HttpServletResponse odpowiedz)
        throws ServletException, IOException {

              /*
               * Pobranie obiektu sesji uzytkownika, HttpSession, a z niego
               * biezacego koszyka uzytkownika.
               */
                HttpSession sesja = zadanie.getSession(false);
                if (sesja == null) {
              /*
               * Przekierowanie uzytkownika do strony lokowania
               * jezeli nie zostala otwarta sesja.
               */
                  odpowiedz.sendRedirect(odpowiedz.encodeRedirectURL("/jasmin/login"));
                  return;
                }

                Object obj = sesja.getAttribute("koszyk");
                if (obj == null) {
              /*
               * Przekierowanie uzytkownika do strony lokowania
               * jezeli nie zostala otwarta sesja.
               */
                    odpowiedz.sendRedirect(odpowiedz.encodeRedirectURL("/jasmin/login"));
                    return;
                }
                Koszyk koszyk = (Koszyk) obj;

                /*
                 * Jezeli uzytkownik kliknal przycisk 'Zamowienie'
                 * nalezy wykonac zamowienie z zawartosci koszyka.
                 * Przekierowujemy zadanie do serwletu obslugujacego zamowienia.
                 */
                if (zadanie.getParameter("Zamowienie") != null) {
                    /*
                     * Na poczatek zamiana koszyka na zamowienie.
                     */
                        String IDZamowienia = koszyk.zakup();
                    /*
                     * Zapamietanie identyfikatora zamowienia, aby miala do niego dostep strona JSP.
                     */
                        zadanie.setAttribute("IDZamowienia", IDZamowienia );
                        koszyk.usunWszystkie();
                        this.getServletContext().getRequestDispatcher("/potwierdzenie.jsp").forward(zadanie, odpowiedz);
                        return;
                }
              /*
               * Nastepnie sprawdzamy ktory przycisk zostal klikniety.
               * Sprawdzmy to poprzez parametry formularza.
               * Przegladamy wszystkie parametry i interpretujemy je.
               */
                Enumeration nazwyParametr = zadanie.getParameterNames();
                while (nazwyParametr.hasMoreElements()) {
                        String nazwaParametr = (String) nazwyParametr.nextElement();
                        String wartoscParametr = zadanie.getParameter(nazwaParametr);

                        /*
                         * Jezeli uzytkownik kliknal przycisk 'Zmiana',
                         * nalezy zmienic ilosci poszczegolnych towarow.
                         * Ponizej znajduje sie obsluga zmiany ilosci towarow.
                         */
                        if (nazwaParametr.equals("Zmiana")) {
                        }

                        /*
                         * Jezeli uzytkownik chce wyczyscic formularz.
                         */
                        else if (nazwaParametr.equals("Czyszczenie")) {
                                koszyk.usunWszystkie();
                                this.getServletContext().getRequestDispatcher("/czyscKoszyk.jsp").forward(zadanie, odpowiedz);
                                return;
                        }

                        /*
                         * Jezeli parametr reprezentuje ilosc okreslonych
                         * towarow, ktore chce zamowic uzytkownik,
                         * nalezy zmienic ilosc towarow na nowa wartosc.
                         */
                        else {
                /*
                * Konwersja ilosci na typ int i ustawienie nowej ilosci.
                */
                try {
                    int ilosc = Integer.parseInt(wartoscParametr);
                    koszyk.zmien(nazwaParametr, ilosc);
                                } catch (NumberFormatException e) {
                    throw new ServletException("Nieprawidlowy parametr serwletu: " + nazwaParametr + ", " + wartoscParametr);
                                } catch (Exception e) {
                    throw new ServletException(e.toString());
                }
            }
        }

                /*
                 * Przeliczenie wartosci na podstawie nowych ilosci.
                 */
                try {
                        cennik.cena(koszyk);
                } catch (Exception e) {
                        log(e);
                        throw new ServletException(e.toString());
                }

                /*
                 * Powtorne wyswietlenie koszyka.
                 */
                Vector wierszElementy = koszyk.pobierzWszystkie();
                if (wierszElementy.size() > 0) {
                        /*
                         * Przeslanie danych o towarze do atrybutow.
                         */
            zadanie.setAttribute("wierszElementy", wierszElementy);
            zadanie.setAttribute("suma", new Double(koszyk.pobierzWartosc()));
            zadanie.setAttribute("podatek", new Double(koszyk.pobierzPodatek()));
            zadanie.setAttribute("wartosc", new Double(koszyk.pobierzWartoscCalkowita()));
            // Przekierowanie do JSP wyswietlajacego koszyk.
            this.getServletContext().getRequestDispatcher("/pokazKoszyk.jsp").forward(zadanie, odpowiedz);
            return;
        }
                /*
                 * Jezeli nie ma towarow, wyswietlenie komunikatu o pustym koszyku.
                 */
                else {
                        this.getServletContext().getRequestDispatcher("/pustyKoszyk.jsp").forward(zadanie, odpowiedz);
                        return;
                }
        }
        /**
         * Formatowanie kwot zgodnie z ustawieniami regionalnymi.
         */
        private String format(double d) {
                NumberFormat nf = NumberFormat.getCurrencyInstance();
                return nf.format(d);
        }

        private void log(Exception e) {
                e.printStackTrace();
        }

        public String getServletInfo() {
                return "Serwlet koszyka zwraca dane na temat towarow" +
                "ktore uzytkownik chce zamowic.";
        }
}
package przyklady;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;

/**
 * Jest to pierwszy serwlet na ktorym pracuje klient.
 * Jest to serwlet zapewniajacy autoryzacje klienta. Pyta on uzytkownika
 * o nazwe i haslo, a nastepnie przekazuje je do bezstanowego komponentu 
 * sesyjnego UserManager weryfikujacego te dane. 
 * Jezeli autoryzacja uzytkownika przebiegla poprawnie, w obiekcie 
 * HttpSession zapisywana jest referencja do nowego Koszyka i uzytkownik
 * moze zaczac do niego dodawac towary.
 */
public class SerwletLogowania extends HttpServlet {

 /*
  * Obiekt bazowy UserManager do autoryzacji uzytkownikow.
  */
 private ZarzadcaUzytkDom zarzadcaUzytkDom;

 /*
  * Obiekt bazowy Koszyk sluzacy do tworzenia nowych koszykow po zalogowaniu
  * uzytkownika.
  */
 private KoszykDom koszykDom;

 /**
  * Mechanizm obslugi serwletow wywoluje te metode jednokrotnie
  * w celu inicjalizacji instancji serwletu.
  *
  * W tej metodzie pobieramy wszystkie obiekty domowe EJB, ktore
  * beda pozniej wykorzystywane.
  */
 public void init(ServletConfig konfig) throws ServletException {

  super.init(konfig);

  try {
   /*
    * Pobranie parametrow inicjalizujacych JNDI.
    * Przesuwamy te ustawienia do wlasciwosci serwletu,
    * aby umozliwic dynamiczna rekonfiguracje
    * srodowiska, bez potrzeby rekompilacji.
    */
   String poczKontekstFact =
    getInitParameter(Context.INITIAL_CONTEXT_FACTORY);
   
   String adrDostawca =
    getInitParameter(Context.PROVIDER_URL);

   /*
    * Dodanie parametrow inicjujacych JNDI
    * do obiektu wlasciwosci.
    */
   Properties srodowisko = new Properties();
   srodowisko.put(Context.INITIAL_CONTEXT_FACTORY, poczKontekstFact);
   srodowisko.put(Context.PROVIDER_URL, adrDostawca);

   /*
    * Pobranie poczatkowego kontekstu JNDI, przy wykorzystaniu
    * parametrow startowych.
    */
   Context kontekst = new InitialContext(srodowisko);

   /*
    * Wyszukanie potrzebnych obiektow bazowych ZarzadcaUzytk i Koszyk
    * poprzez JNDI.
    */
   
   koszykDom = (KoszykDom) kontekst.lookup("KoszykDom");

   zarzadcaUzytkDom = (ZarzadcaUzytkDom)
    kontekst.lookup("ZarzadcaUzytkDom");
  }
  catch (Exception e) {
   log(e);
   throw new ServletException(e.toString());
  }
 }

 /**
  * Mechanizm serwletow wywoluje te metode, gdy przegladarka uzytkownika
  * wysle zadanie HTTP.
  */
 public void service(HttpServletRequest zadanie,
                     HttpServletResponse odp)
                     throws ServletException, IOException {

  /*
   * Ustawienie sesji uzytkownika HttpSession.
   */
  HttpSession sesja = zadanie.getSession(true);

  /*
   * Pobranie nazwy uzytkownika i hasla z ciagu URL.
   */
  String uzytkownik = zadanie.getParameter("Uzytk");
  String haslo = zadanie.getParameter("Haslo");
  boolean zalogowany=false;
  
  /*
   * Jezeli uzytkownik nie probowal sie jeszcze logowac, wyswietlenie
   * ekranu logowania.
   */
  if ((uzytkownik == null) || (haslo == null)) {
   zapiszFormularz(zadanie, odp, false);
  }

  /*
   * W przeciwnym razie, uzytkownik byl juz na tej stronie i wprowadzil
   * jakies dane.
   * Weryfikacja wprowadzonych danych.
   */
  else {
   /*
    * Wykorzystanie bezstanowego komponentu sesyjnego UserManager do
    * autoryzacji danych uzytkownika.
    */
   try {
    ZarzadcaUzytk  zarzadcaUzytk = zarzadcaUzytkDom.create();
    zalogowany= zarzadcaUzytk.sprawdzUzytkownik(uzytkownik, haslo);
   }
   catch (Exception e) {
    zapiszFormularz(zadanie, odp, true);
    e.printStackTrace();
    return;
   }
   /*
    * Jezeli haslo jest prawidlowe, tworzony jest komponent sesyjny Koszyk
    * i jest dodawany do obiektu HttpSession uzytkownika. Gdy uzytkownik
    * przejdzie do innych serwletow, moga one odwolac sie do obiektu
    * HttpSession i pobrac koszyk uzytkownika.
    */
   if (zalogowany) {
    try {
     Koszyk koszyk = koszykDom.create(uzytkownik);
     sesja.setAttribute("koszyk", koszyk);
     
     /*
      * Wywolanie strony glownej.
      */
     RequestDispatcher disp =
      this.getServletContext().getRequestDispatcher("/glowna.jsp");
     disp.forward(zadanie, odp);
     
     return;
    }
    catch (Exception e) {
     log(e);
     throw new ServletException(e.toString());
    }
   }
  }
  
  /*
   * Jezeli haslo nie pasuje, uzytkownik nie jest autoryzowany.
   * Wyswietlany jest znow ekran logowania, z wyswietlonym komunikatem 
   * komunikujacym o bledzie logowania.
   */
  zapiszFormularz(zadanie, odp, true);
 }

 /**
  * Zapisuje ekran logowania (tylko do uzytku prywatnego).
  *
  * @param pokazBlad = true oznacza pokazywanie bledow autoryzacji
  *        ostatnich klienta
  */
 private void zapiszFormularz(HttpServletRequest zadanie,
                        HttpServletResponse odp,
                        boolean pokazBlad)
                        throws ServletException, IOException {

  /*
   * Ustawienie zmiennej wskazujacej, czy logowanie sie powiodlo.
   * Strona JSP moze odczytac ta zmienna.
   */
  zadanie.setAttribute("bladLogowania", new Boolean(pokazBlad));
    
  /*
   * Przeslanie zadanie do JSP logowania.
   */
  RequestDispatcher disp =
   this.getServletContext().getRequestDispatcher("/login.jsp");
  disp.forward(zadanie, odp);
 }

 private void log(Exception e) {
  e.printStackTrace();
 }

 public String getServletInfo() {
  return "Serwlet Login weryfikujacy dane uzytkownika.";
 }
}
<%-- Kontener JSP przekazuje wywolania do tego pliku jezeli zostanie zgloszony wyjatek --%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<html>
   <head><title> Strona bdu Jamin </title></head>
   <body>
        <jsp:include page="tytul.jsp" />
        <p>Wystpi bd podczas przetwarzania twojego dania.
        <p>Prosz skontaktowa si z administratorem systemu
        <p><i><a href="/jasmin/glowna.jsp">Powrt do strony gwnej.</a></i>
   </body>
</html>

<%-- Gdy uzytkownik kliknie przycisk czyszczenia koszyka, serwlet przesyla zadanie do tego pliku JSP -%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<html>
    <head><title>Strona czyszczenia koszyka</title></head>

    <BODY>
        <jsp:include page="tytul.jsp" />
        <font size="+2"><strong>Towary z koszyka zostay usunite!</strong></font>
        <br>&nbsp;
        <br>
        <center>
            <a href="/jasmin/glowna.jsp">Powrt do strony gwnej</a>
        </center>
    </BODY>
</html>
<%-- Ta strona JSP wyswietla glowny ekran witryny Jasmin.
   Klient moe przejsc do katalogu oraz do strony koszyka.
--%>
<%@page contentType="text/html; charset=iso-8859-2"%>

<html>
  <head><title> Strona gwna firmy Jamin</title></head>
  <body>
    <jsp:include page="tytul.jsp" />
    <jsp:directive.page errorPage="blad.jsp" />
    <h3><A href="/jasmin/katalog"><b>Katalog</b></A><h3>
    <h4><p> Wybierz co z naszego szerokiego asortymentu czci komputerowych.</p><br></h4>
    <h3><A href="/jasmin/pokazKoszyk"><b>Koszyk</b></A></h3>
    <h4><p> Zajrzyj do koszyka, aby sprawdzi co ju wybrae.</p><h4>
  </body>
</html>
<%--JSP wyswetlajacy opis wybranego towaru.
    Klienci moga dodawa towary do koszyka poprzez kliknicie lacza dodania do koszyka.
    Klienci moga przejsc do katalogu lub do koszyka.
 --%>
<%@ page import="przyklady.TowarElement" %>
<%@page contentType="text/html; charset=iso-8859-2"%>

<html>
    <head><title> Strona informacyjna o towarach firmy Jamin</title></head>
    <body>
        <jsp:include page="tytul.jsp" />
        <jsp:directive.page errorPage="blad.jsp" />

        <%
         // Pobiera obiekt TowarElement z obiektu zadania i wyswietla go na stronie.
         TowarElement element=(TowarElement)request.getAttribute("towarElement");
        %>

      <b><%=element.pobierzNazwa()%><b>
      <h4> Opis:</h4>
       <%=element.pobierzOpis()%>
      <h4>Cena podstawowa (bez rabatw):<%=element.pobierzCena()%></h4>

      <center>
      <A href="/jasmin/katalog?Kup=<%=element.pobierzIDTowaru()%>">Dodaj do koszyka</A><br>
      <A href="/jasmin/katalog">Powrt do katalogu</A><br>
      <A href="/jasmin/pokazKoszyk">Podgld koszyka</A>
     </center>
   </body>
</html>
<%-- Ten plik JSP odczytuje wektor towarow z obiektu HttpSession i wyswietla go w postaci tabeli.
     Informacja o towarze zawiera nazwe towaru i jego cen podstawowa. Uzytkownik moze podgladac
     opis towaru poprzez klikniecie na nazwe towaru. Uzytkownik moze rwniez dodac towar do swojego
     koszyka poprzez kliknicie na lacze koszyka. Gdy uzytkownik kliknie na lacze dodawania do koszyka,
     towar jest dodawany do koszyka i informacja o tym jest wyswietlana na dole strony.

--%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<%@ page import="przyklady.TowarElement" %>
<html>
    <head><title> Katalog firmy Jamin </title></head>
    <body>
        <jsp:include page="tytul.jsp" />
        <h3><A HREF="/jasmin/pokazKoszyk">Przegldanie koszyka</A></h3>
        <h3>Prosz wybra towary</h3>
        <center><table>
        <%
        // Odczytuje wektor towarow z obiektu HttpSession i wyswietla go w postaci tabeli.
        session = request.getSession(false);
        Vector towary=(Vector)session.getAttribute("towary");
        int rozmiar=towary.size();
        TowarElement element=null;
        for(int i=0; i<rozmiar;i++){
            element=(TowarElement)towary.elementAt(i);
            %>
            <tr>
                <td bgcolor="#ffffaa"><a href="/jasmin/katalog?IDTowaru=<%=element.pobierzIDTowaru()%>"><b><%=element.pobierzNazwa()%><b></td>
                <td align="right" bgcolor="#ffffaa"><%=element.pobierzCena()%></td>
                <td bgcolor="#ffffaa"> <A HREF="/jasmin/katalog?Kup=<%=element.pobierzIDTowaru()%>">  Dodaj do koszyka</A></td>
            </tr>
        <%}%>
        </table></center>
        <P>
            <%
            // Wyswietla nazwe towaru dodanego do koszyka w dolnej czesci strony.
            String nazwaTowaru = (String) request.getAttribute("ZakupTowaru");
            if (nazwaTowaru != null) {
            %>
                <i> <%=nazwaTowaru%></i> zosta dodany do koszyka.
         <% } %>
    </body>
</html>
<%--
 Ten plik JSP wyswietla strone logowania. Po podaniu danych logowania
 uzytkownik przesyla je do serwletu logowania
 ktory weryfikuje wprowadzone dane wywolujac komponenty EJB.

 Jezeli weryfikacja nie powiedzie sie, serwlet logowania powtornie
 wyswietli te strone, pozwalajac na ponowne podanie danych.

 Jezeli weryfikacja sie powiedzie, wyswietlana jest glowna strona sklepu
 Jasmin.
--%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<html>
<head>
 <title>Strona logowania firmy Jamin</title>
</head>

<body>

<%-- Dolaczenie tytulu, "Czesci komputerowe Jasmin"--%>
<jsp:include page="tytul.jsp" />

<%-- Wskazanie strony wyswietlanej w przypadku wystapienia bledu --%>
<jsp:directive.page errorPage="blad.jsp" />

<%-- Wyswietlenie formularza logowania --%>
<h4>Prosz poda uytkownika i haso<h4>
<p>
<form action="/jasmin/login" method="get">
 <table>
  <tr>
   <td><b>Uytkownik:</b></td>
   <td>
    <input type="text" name="Uzytk" value="Ed Roman" size="19">
   </td>
  </tr>
  <tr>
   <td><b>Haso:</b></td>
   <td>
    <input type="text" name="Haslo" value="haslo" size="19">
   </td>
  </tr>
  <tr>
   <td></td>
   <td>
    <input type="submit" value="Wylij dane">
   </td>
  </tr>
 </table>
</form>

<%
 // Sprawdzenie, czy uzytkownikowi udalo sie zalogowac.
 Boolean blad = (Boolean) request.getAttribute("bladLogowania");
 if (blad != null) {
  if (blad.booleanValue() == true) {
%>
  <p>
  <strong>Bd logowania!  Prosz sprbowa jeszcze raz.</strong>
  <p>
<%
  }
 }
%>

</body>
</html>
<%--Strona JSP wyswietlajaca szczegolowe dane na temat towarow w koszyku.
    Dane te zawieraja nazwe towaru, ilosc, cene podstawowa, rabat i wartosc
    kazdego wiersza koszyka. Wyswietlana jest rowniez suma wartosci towarow,
    podatkow i calkowita wartosc koszyka. Klient moze zmienic ilosc zamowionych
    towarow, zamowic wybrane towary lub oproznic koszyk.

--%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<HTML>
    <head><title> Koszyk towarw firmy Jamin </title></head>
    <body>
        <jsp:include page="tytul.jsp" />
        <jsp:directive.page errorPage="blad.jsp" />
        <%@ page import="przyklady.TowarElement" %>
        <%@ page import="przyklady.WierszElement" %>
        <%@ page import="java.text.NumberFormat" %>
        <form action="/jasmin/pokazKoszyk" method="get">
                <center><table>
                    <tr>
                        <th align=left> Nazwa </TH>
                        <th align=left> Ilo </TH>
                        <th align=left> Cena podstawowa </TH>
                        <th align=left> Rabat </TH>
                        <th align=left><strong> Suma </strong></TH>
                        <th align=left>Zmiana iloci</TH>
                    </tr>
                    <%
                    // Pobranie elementow wierszy z obiektu zadania i wyswietlenie ich w postaci tabeli.
                    Enumeration wierszElementy = ((Vector) request.getAttribute("wierszElementy")).elements();
                    double suma=((Double)request.getAttribute("suma")).doubleValue();
                    double podatek=((Double)request.getAttribute("podatek")).doubleValue();
                    double wartosc=((Double)request.getAttribute("wartosc")).doubleValue();

                    while (wierszElementy.hasMoreElements()) {
                        WierszElement wiersz = (WierszElement) wierszElementy.nextElement();
                        int ilosc            = wiersz.pobierzIlosc();
                        double rabat         = wiersz.pobierzRabat();
                        TowarElement towar   = wiersz.pobierzTowarElement();
                        String IDTowaru      = towar.pobierzIDTowaru();
                        double cenaBazowa    = towar.pobierzCena();
                    %>
                    <tr>
                        <td bgcolor="#ffffaa"><a href="/jasmin/katalog?IDTowaru=<%=towar.pobierzIDTowaru()%>"><b><%=towar.pobierzNazwa()%><b></td>
                        <td align="right" bgcolor="#ffffff"><%=ilosc%></td>
                        <td bgcolor="#ffffaa" align="right"><%=NumberFormat.getCurrencyInstance().format(cenaBazowa)%></td>
                        <td bgcolor="#ffffaa" align="right"><%=NumberFormat.getCurrencyInstance().format(rabat)%></td>
                        <td bgcolor="#ffffaa" align="right"><%=NumberFormat.getCurrencyInstance().format((cenaBazowa * ilosc) - rabat )%></td>
                        <td><input type="text" name="<%=IDTowaru%>" value="<%=ilosc%>"></td>
                    </tr>
                    <% } %>
                </table></center>
                <br>
                <center><table>
                    <tr>
                        <td colspan="2" align="right" bgcolor="#ffffff"> Warto:</td>
                        <td bgcolor="#ffffaa" align="right"> <%=NumberFormat.getCurrencyInstance().format(suma)%></td>
                        <td> <br></td>          
                    </tr>
                    <tr>
                        <td colspan="2" align="right" bgcolor="#ffffff">Podatek: </td>
                        <td bgcolor="#ffffaa" align="right"><%=NumberFormat.getCurrencyInstance().format(podatek)%></td>
                        <td><br></td>
                    </tr>
                    <tr>
                        <td colspan="2" align="right" bgcolor="ffffff"> <font color="ff0000"> <strong>Razem:</strong></font> </td>
                        <td bgcolor="#ffffaa" align="right"><%=NumberFormat.getCurrencyInstance().format(wartosc)%></td>
                        <td><br></td>
                    </tr>
                </table></center>
                <!--
                    Tworzenie laczy i przyciskow interfejsu uzytkownika.
                    Gdy uzytkownik kliknie przycisk (na przykad realizacja zamowienia),
                    wysylane jest zadanie do serwletu.
                //-->
                <p>
                <A href="/jasmin/katalog">Przejcie do katalogu</A>
                <input type="reset" value="Powrt"> &nbsp; &nbsp; &nbsp;
                <input type="submit" name="Zmiana" value="Zmiana"> &nbsp; &nbsp; &nbsp;
                <input type="submit" name="Zamowienie" value="Zamwienie"> &nbsp; &nbsp; &nbsp;
                <input type="submit" name="Czyszczenie" value="Czyszczenie"> &nbsp; &nbsp; &nbsp;
        </form>
    </body>
</html>
<%--Strona wyswietlajaca  potwierdzenie zamowienia. Gdy uzytkownik kliknie przycisk zamowienia,
  w bazie danych tworzone jest zamowienie, a jego numer jest wyswietlany na stronie z potwierdzeniem.
 --%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<html>
   <head><title> Strona potwierdzenia zamwienia firmy Jamin</title></head>
   <body>
    <jsp:include page="tytul.jsp" />
  <jsp:directive.page errorPage="blad.jsp" />
  <%-- Pobranie identyfikatora zamowienia z obiektu zadania i jego wyswietlenie.--%>
    <h3>Dzikujemy za zakupy.
    <p>Numer Twojego zamwienia to: <%=request.getAttribute("IDZamowienia")%>
    <p>Zapraszamy ponownie!
    </h3>
    <p><i><a href="/jasmin/glowna.jsp">Powrt do strony gwnej.</a></i>
   </body>
</html>

<%-- Jezeli koszyk jest pusty a uzytkownik kliknie lacze koszyka, serwlet przekierowuje zgloszenie do tego JSP --%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<html>
 <head><title> Strona z pustym koszykiem</title></head>
    <BODY>
         <jsp:include page="tytul.jsp" />
        <font size="+2">Koszyk jest pusty.</font>
        <br>&nbsp;
        <br>
        <center>
            <a href="/jasmin/glowna.jsp">Powrt do strony gwnej.</a>
        </center>
    </BODY>
</html>
<%-- Wyswietla tytul --%>
<%@page contentType="text/html; charset=iso-8859-2"%>
<hr><br><br>
 <center><h1> Czci komputerowe Jamin</h1></center>
<br><hr>package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.rmi.Remote;
import java.util.*;

/**
 * Jest to zdalny interfejs komponentu Katalog.
 *
 * Interfejs ten pozwala klientom na wykonywanie
 * metod obiektu EJB.  Interfejs ten jest implementowany
 * przez producenta kontenera; implementowany obiekt jest
 * obiektem EJB, delegujacym wywolania do aktualnego
 * komponentu.
 */
public interface Katalog extends EJBObject {
        /**
     * Zwraca liste obiektow TowarElement.
     */
    public Vector pobierzListaTowarElement()throws RemoteException;
    /**
     * zwraca obiekt TowarElement dla odpowiedniego identyfikatora towaru.
     */
    public TowarElement pobierzTowarElement(String IDTowaru) throws RemoteException;
        
}


package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;

/**
 * Jest to lokalny interfejs domowy dla komponentu Katalog.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywolywany przez lokalny obiekt domowy
 * i sluzy jako producent dla obiektow lokalnych EJB.
 */
public interface KatalogDom extends EJBHome {

   /*
    * Tworzy instancje komponentu EJB.
    */
    Katalog create() throws RemoteException, CreateException;
}
package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.util.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
/**
 * Bezstanowy komponent sesyjny katalogu pobiera liste obiektow TowarElement.
 * TowarElement zawiera IDTowaru, nazwe i opis.
 */
public class KatalogKomponent implements SessionBean {
    
    /*
     * Chociaz jest to bezstanowy komponent sesyjny, posiada on stan -
     * kontekst sesji. Nalezy pamietac, ze bezstanowe
     * komponenty sesyjne moga przechowywac stan, nie moga jedynie
     * przechowywac stanu na rzecz okreslonego klienta.
     */
        private SessionContext ctx;
    
    /**
     * Zwraca obiekt TowarElement dla podanego identyfikatora towaru.
     */
    public TowarElement pobierzTowarElement(String IDTowaru){
        try{
                Context ctx = new InitialContext();
                TowarDom towarDom = (TowarDom)
                    PortableRemoteObject.narrow(
                        ctx.lookup("TowarDom"), TowarDom.class);
                Towar towar=towarDom.findByPrimaryKey(IDTowaru);
                /*
                 * Tworzy i zwraca obiekt TowarElement.
                 */
                return new TowarElement(towar.getProductID(),towar.getName(),
                                towar.getBasePrice(),towar.getDescription());
            }catch (Exception e) {
                throw new EJBException(e);
            }
    }
    
    /**
     * Zwraca liste obiektow TowarElement.
     */
    public Vector pobierzListaTowarElement(){
        try{
                Context ctx = new InitialContext();
                TowarDom towarDom = (TowarDom)
                    PortableRemoteObject.narrow(
                            ctx.lookup("TowarDom"), TowarDom.class);
                Collection towary = towarDom.findWszystkieTowary();
                Enumeration elementy = Collections.enumeration(towary);
                Vector towarElement=new Vector();
                    while (elementy.hasMoreElements()) {
                        Towar towar= (Towar) elementy.nextElement();
                        /*
                         * Tworzy nowy obiekt TowarElement.
                         */
                        TowarElement p=new TowarElement(towar.getProductID(),towar.getName(),
                                towar.getBasePrice(),towar.getDescription());
                        towarElement.add(p);
                    }
                /*
                 * Zwraca wektor obiektow TowarElement.
                 */
                return towarElement;
            }catch (Exception e) {
                throw new EJBException(e);
            }
    }
        
  //-----------------------------------------------
  // Poczatek metod wymaganych przez EJB.
  // Metody te sa wywolywane przez kontener i nigdy
  // nie moga byc wywolane przez kod klienta.
  //-----------------------------------------------
   
        public void ejbCreate() throws RemoteException {
                System.out.println("Wywolano ejbCreate().");
        }
  
        public void ejbRemove() {
                System.out.println("Wywolano ejbRemove().");
        }

        public void ejbActivate() {
                System.out.println("Wywolano ejbActivate().");
        }

        public void ejbPassivate() {
                System.out.println("Wywolano ejbPassivate().");
        }
   
    /**
     * Laczy instancje komponentu z okreslonym kontekstem.
     */
        public void setSessionContext(SessionContext ctx) {
                System.out.println("Wywolano setSessionContext().");
                this.ctx = ctx;
        }
  //----------------------------------------------------
  // Koniec metod wymaganych przez EJB
  //----------------------------------------------------
}
package przyklady;

import javax.ejb.*;

/**
 * Metody biznesowe udostepniane przez komponent Klient.
 *
 * Zdefiniowany tu interfejs lokalny jest przeznaczony
 * dla klientow zdalnych operujacych na komponencie. Interfejs ten
 * bedzie implementowany przez kontener; implementowany obiekt jest nazywany
 * lokalnym obiektem EJB, ktory jest odpowiedzialny za delegacje
 * wywolan do instancji klasy komponentu encyjnego.
 */
public interface Klient extends EJBLocalObject {


    /**
     * Zwraca identyfikator klienta.
     */
        public String getCustomerID();

    /**
     * Zwraca nazwe klienta.
     */
        public String getName();

    /**
     * Ustawia nazwe klienta.
     */
        public void setName(String nazwa);

    /**
     * Zwraca haslo klienta.
     */
        public String getPassword();

    /**
     * Ustawia haslo klienta.
     */
        public void setPassword(String haslo);

    /**
     * Zwraca adres klienta.
     */
        public String getAddress();

    /**
     * Ustawia adres klienta.
     */
        public void setAddress(String adres);
}

package przyklady;

import javax.ejb.*;
import java.util.Collection;

/**
 * Jest to lokalny interfejs domowy dla komponentu Klient.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywolywany przez lokalny obiekt domowy
 * i sluzy jako producent dla obiektow lokalnych EJB.
 */
public interface KlientDom extends EJBLocalHome {

    /*
     * Metoda tworzy obiekt EJB.
     *
     * Nalezy zwrocic uwage, ze interfejs domowy zwraca
     * obiekt EJB, natomiast komponent zwraca klucz glowny.
     * Dzieje sie tak, poniewaz kontener EJB jest odpowiedzialny za
     * wygenerowanie obiektu EJB, natomiast komponent jest
     * odpowiedzialny za inicjalizacje.
     *
     * @param identyfikator klienta
     * @param nazwa klienta
     * @param haslo klienta
     * @param adres klienta
     */
         
        Klient create(String IDKlienta, String nazwa, String haslo, String adres) throws CreateException;

    // Metody wyszukujace sa implementowane przez kontener, poniewaz jest to komponent CMP.
    /**
     * Zwraca lokalny obiekt klienta.
     * @param identyfikator klienta
     */
        public Klient findByPrimaryKey(String klucz) throws FinderException;
    
    /**
     * Zwraca kolekcje lokalnych obiektow klienta dla podanej nazwy.
     * @param nazwa klienta
     */
        public Collection findWgNazwy(String nazwa) throws FinderException;

    /**
     * Zwraca kolekcje lokalnych obiektow klienta dla podanego adresu.
     * @param adres klienta
     */
        public Collection findWgAdresu(String adres) throws FinderException;

    /**
     * Zwraca kolekcje wszystkich lokalnych obiektow klienta.
     */
        public Collection findWszyscyKlienci() throws FinderException;

        // Metody biznesowe niezalezne od instancji.
        // public double pobierzCalkowitaIloscKlientow();

}

package przyklady;

import java.sql.*;
import javax.sql.DataSource;
import javax.naming.*;
import javax.ejb.*;
import java.util.*;

/**
 * Komponent encyjny o trwalosci zarzadzanej przez kontener
 * reprezentujacy dane o kliencie.
 */
public abstract class KlientKomponent implements EntityBean {

        protected EntityContext kontekst;

    /**
     * Zwraca identyfikator klienta.
     */
        public abstract String getCustomerID();

    /**
     * Ustawia identyfikator klienta.
     */
        public abstract void setCustomerID(String customerId);

    /**
     * Zwraca nazwe klienta.
     */
        public abstract String getName();

    /**
     * Ustawia nazwe klienta.
     */
        public abstract void setName(String nazwa);

    /**
     * Zwraca haslo klienta.
     */
        public abstract String getPassword();

    /**
     * Ustawia haslo klienta.
     */
        public abstract void setPassword(String haslo);

    /**
     * Zwraca adres klienta.
     */
        public abstract String getAddress();

    /**
     * Ustawia adres klienta.
     */
        public abstract void setAddress(String adres);

    /**
     * Laczy instancje komponentu z okreslonym kontekstem.
     * Po wykonaniu tej operacji mozna skorzystac z kontekstu do
     * odczytania danych srodowiska, na przyklad inicjalizacji komponentu poprzez
     * wlasciwosci srodowiska.
     */
        public void setEntityContext(EntityContext kontekst) {
                System.out.println("Wywolano Klient.setEntityContext().");
                this.kontekst = kontekst;
        }

        /**
         * Odlacza instancje komponentu od kontekstu.
         */
        public void unsetEntityContext() {
                System.out.println("Wywolano Klient.unsetEntityContext()");
                this.kontekst = null;
        }

        /**
         * Metoda wywolywana przez kontener bezposrednio po
         * aktywacji tej instancji. Powinna zajmowac wszystkie
         * potrzebne zasoby.
         */
        public void ejbActivate() {
                System.out.println("Wywolano Klient.ejbActivate().");
        }

        /**
         * Metoda wywolywana przez kontener bezposrednio przed
         * pasywacja tej instancji. Powinna zwalniac
         * wszystkie zasoby zajete w metodzie ejbActivate().
         */
        public void ejbPassivate() {
                System.out.println("Wywolano Klient.ejbPassivate().");
        }

        /**
         * Aktualizuje baze danych
         * aby odpowiadala biezacym wartosciom komponentu encyjnego
         * reprezentujacego te same dane.
         *
         * Poniewaz wykorzystujemy zarzadzanie trwaloscia przez kontener,
         * kontener EJB automatycznie zapisze odpowiednie wartosci w podklasie.
         */
        public void ejbStore() {
                System.out.println("Wywolano Klient.ejbStore().");
        }

        /**
         * Aktualizuje komponent encyjny, aby odpowiadal wartosciom
         * zapisanym w bazie danych.
         *
         * Poniewaz wykorzystujemy zarzadzanie trwaloscia przez kontener,
         * kontener EJB automatycznie zaladuje odpowiednie wartosci w podklasie.
         * Nastepnie wykonujemy dalsze przetwarzanie danych.
         */
        public void ejbLoad() {
                System.out.println("Wywolano Klient.ejbLoad().");
        }

        /**
         * Wywolywana podczas tworzenia nowych rekordow w bazie danych.
         *
         * Gdy klient wywoluje metode create() z obiektu domowego,
         * wywoluje on metode ejbCreate().
         *
         * W metodzie tej inicjowany jest stan komponentu przy pomocy
         * zestawu metod abstrakcyjnych i parametrow przekazanych do metody.
         * Kontener na podstawie stanu komponentu tworzy (INSERT) odpowiednie
         * rekordy w bazie danych.
         */
        public String ejbCreate(String id, String nazwa, String haslo, String adres)
        throws CreateException {
            System.out.println("Wywolano Klient.ejbCreate().");
            setCustomerID(id);
            setName(nazwa);
            setAddress(adres);
            setPassword(haslo);

        /*
         * Metoda ejbCreate() komponentu encyjnego CMP zawsze zwraca null.
         * Metoda ejbCreate() posiada sygnature rozna od null,
         * dzieki czemu pasuje ona do komponentu encyjnego BMP,
         * ktory dziedziczy po komponencie encyjnym CMP.
         */
            return null;
    }

        /**
         * Metoda ta jest wywolywana przez kontener po ejbCreate().
         * Instancja komponentu jest skojarzona z obiektem EJB
         * Referencje do tego obiektu EJB mozna uzyskac poprzez
         * kontekst. Referencja do tego obiektu moze byc przekazana jako
         * referencja do biezacego obiektu.
         * Ustawia pola CMR klienta.
         */
        public void ejbPostCreate(String id, String nazwa, String haslo, String adres )
        throws CreateException {
            System.out.println("Wywolano Klient.ejbPostCreate().");
   }

        /**
         * Wywolana przed usunieciem przez kontener danych komponentu
         * encyjnego z bazy danych. Wywolywana gdy klient wywola
         * dom.remove().
         */
        public void ejbRemove() throws RemoveException {
                System.out.println("Wywolano Klient.ejbRemove().");
        }

}
package przyklady;

import java.util.Collection;
import java.rmi.RemoteException;
import java.util.*;
/**
 * Jest to zdalny interfejs komponentu KoszykKomponent.
 *
 * Interfejs ten pozwala klientom na wykonywanie
 * metod obiektu EJB.  Interfejs ten jest implementowany
 * przez producenta kontenera; implementowany obiekt jest
 * obiektem EJB, delegujacym wywolania do aktualnego
 * komponentu.
 */
public interface Koszyk extends javax.ejb.EJBObject {

    /**
     * Dodaje element do koszyka.
     */
    public void dodaj(WierszElement element) throws RemoteException;
    
    /**
     * Zmienia ilosc towarow w koszyku.
     */
    public void zmien(String IDTowaru, int ilosc) throws Exception, RemoteException;

    /**
     * Zwraca wszystkie towary umieszczone w koszyku.
     *
     * @return Kolekcja obiektow WierszElement z Koszyk
     */
    public Vector pobierzWszystkie() throws RemoteException;

    /**
     * Oproznia koszyk.
     */
    public void usunWszystkie() throws RemoteException;

    /**
     * Metody pobierz i ustaw dla wlasciciela koszyka.
     */
    public String pobierzWlasciciel() throws RemoteException;
    public void ustawWlasciciel(String owner) throws RemoteException;

    /**
     * Przeprowadza zakup towarow z koszyka. Koszyk jest przeksztalcany 
     * na zamowienie zapisane w bazie danych.
     *
     * @return Numer potwierdzenia
     */
    public String zakup() throws RemoteException;    
    
   /**
    * Zwraca wartosc koszyka, poprzednio ustawiona za pomoca 
    * metody ustawWartosc().
    * @return wartosc towarow koszyka
    */ 
   public double pobierzWartosc() throws RemoteException;

   /**
    * Ustawia wartosc koszyka.
    * Za obliczenie wartosci odpowiedzialny jest 
    * zewnetrzny komponent Cennik.  Wartosc jest obliczana
    * z wykorzystaniem upustow klienta (i moze byc rozszerzona
    * przez dodanie kolejnych regul).
   */
   public void ustawWartosc(double subTotal) throws RemoteException;

  /**
   * Zwraca wartosc podatku dla biezacej wartosci.
   */
   public double pobierzPodatek() throws RemoteException;
        
  /**
   * Ustawia wartosc podatku dla biezacej wartosci.
   */
   public void ustawPodatek(double podatek) throws RemoteException;

  /**
   * Zwraca calkowita wartosc towarow w koszyku.  Wartosc ta jest 
   * wyliczana przez zsumowanie:
   * 1) wartosci koszyka
   * 2) podatku.
   */   
   public double pobierzWartoscCalkowita() throws RemoteException;
   

}
package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
/**
 * Interfejs domowy dla KoszykKomponent.  Ten interfejs jest implementowany
 * przez kod narzedziowy serwera EJB - implementowany obiekt
 * jest nazywany obiektem domowym i sluzy on jako producent
 * obiektow EJB.
 *
 * W tym interfejsie domowym znajduje sie jedna metoda - create() 
 * ktora wspoldziala z metoda ejbCreate() w KoszykKomponent.
 */

public interface KoszykDom extends javax.ejb.EJBHome {
    /*
     * Tworzy komponent Koszyk z wlascicielem przekazanym jako parametr.
     */
    Koszyk create(String owner) throws java.rmi.RemoteException,
        javax.ejb.CreateException;
}
package przyklady;

import java.util.*;
import javax.naming.*;
import javax.rmi.*;

/**
 * Kod przykladowego klienta.
 */
public class KoszykKlient {
    public static String url="t3://localhost:7001";
    public static void main(String[] args)  {
        /*
         * Pobranie wlasciwosci systemu niezbednych do inicjalizacji JNDI.
         * Pobranie poczatkowego kontekstu.
         */
        // Context ctx = new InitialContext(System.getProperties());
        try{
          Context ctx = pobierzKontekstPocz();
         // System.out.println("Kontekst:"+ctx.lookup("KoszykDom"));
        /*
         * Pobranie referencji do obiektu domowego - producenta
         * obiektow EJB.
         */
        KoszykDom home = (KoszykDom) PortableRemoteObject.narrow(
            ctx.lookup("KoszykDom"), KoszykDom.class);

        // Tworzenie koszyka, dodanie do niego towarow, jego wydrukowanie i usuniecie.
        Koszyk koszyk1 = home.create("00001");
        // koszyk1.dodaj("1", 1);
        // koszyk1.dodaj("2", 1);
        // koszyk1.dodaj("3", 1);
        // koszyk1.zakup();
        //  drukujKoszyk(koszyk1);
        koszyk1.remove();

        // Tworzenie pustego koszyka i jego drukowanie.
        // Koszyk koszyk2 = home.create("Jan Kowalski");
       // drukujKoszyk(koszyk2);
        }catch(Throwable th){
            th.printStackTrace();
        }
        
    }

    /**
     * Wydrukowanie zawartosci koszyka.
     */
    public static void drukujKoszyk(Koszyk koszyk) throws Exception {
        String wlasciciel = koszyk.pobierzWlasciciel();
        Collection towary = koszyk.pobierzWszystkie();
        Iterator i = towary.iterator();
        if (!i.hasNext()) {
            System.out.println("Koszyk '" + wlasciciel + "' jest pusty:");
        }
        else {
            System.out.println("Koszyk '" + wlasciciel + "' zawiera:");
            while (i.hasNext()) {
                WierszElement towar = (WierszElement) i.next();
             //   System.out.println("+ " + towar.pobierzTowar().getProductID());
            }
        }
        System.out.println();
    }
    /**
   * Wykorzystanie obiektu Properties pozwala dzialac z klientami JDK 1.1.x i Java2.
   */
  private static Context pobierzKontekstPocz() throws Throwable {
    
    try {
      // Pobranie kontekstu poczatkowego.
      Properties h = new Properties();
      h.put(Context.INITIAL_CONTEXT_FACTORY,
        "weblogic.jndi.WLInitialContextFactory");
      h.put(Context.PROVIDER_URL, url);
      return new InitialContext(h);
    } catch (NamingException ne) {
      System.out.println("Nie mozna uzyskac polaczenia z serwerem WebLogic z adresu "+url);
      System.out.println("Prosze sprawdzic, czy serwer jest uruchomiony.");
      throw ne;
    }catch(Throwable th){
        th.printStackTrace();
        throw th;
    }
  }


}
package przyklady;

import java.util.*;
import javax.ejb.*;
import java.rmi.RemoteException;
import javax.rmi.PortableRemoteObject;
import javax.naming.*;

/**
 *
 * Ten komponent sesji ze stanem reprezentuje koszyk
 * na ktorym pracuje klient. Koszyk stanowi zbior towarow, 
 * ktorymi klient jest zainteresowany, ale ich zakup 
 * nie jest jeszcze zatwierdzony.  Komponent ten reprezentuje
 * sklepowy koszyk na zakupy - przegladajac witryne firmy Jasmin, klient
 * zapamietuje w nim towary ktorymi jest zainteresowany, wraz z ilosciami.
 *
 * Klient sklada sie z wierszy-towarow. Kazdy wiersz przechowuje
 * jeden okreslony towar, ktorym klient jest zainteresowany,
 * ilosc tego towaru oraz upust na ten towar.
 *
 * Roznica pomiedzy koszykiem a zamowieniem jest taka, ze 
 * koszyk jest uworzony jedynie w pamieci (jako komponent
 * sesyjny ze stanem), natomiast zamowienie jest trwalym zapisem
 * (jako komponent encyjny).  Ten komponent koszyka 
 * posiada funkcje przeksztalcania sie na zamowienie
 * (poprzez metode zakup()).
 * 
 */

public class KoszykKomponent implements javax.ejb.SessionBean {

    /* 
     * Wlasciciel koszyka.
     */
        private String wlasciciel;

    /**
     * Zawartosc koszyka - wektor obiektow WierszElement.
     */
        private Vector zawartosc;

    /**
     * Kontekst sesji.
     */
        private SessionContext ctx;
    
    /*
     * Wartosc (bez podatku) towarow.
     */
        private double wartosc;

    /*
     * Podatek dla towarow.
     */
        private double podatek;

        //
        // Metody biznesowe.
        //
   
    /**
     * Metoda pobierz dla nazwy wlasciciela koszyka.
     * @return wlasciciel koszyka
     */
        public String pobierzWlasciciel() { return wlasciciel;}
    
    /**
     * Metoda ustaw dla wlasciciela koszyka.
     * 
     * @param wlasciciel koszyka
     */
        public void ustawWlasciciel(String wlasciciel) { this.wlasciciel = wlasciciel;}
  
    /**
     * Dodanie elementu do koszyka.
     * 
     * @param element koszyka
         */
        public void dodaj(WierszElement element) {

        /*
         * Wyszukuje element w koszyku, ktory odpowiada przekazanej wartosci
         * productID. Jezeli zostanie znaleziony, wiersz ten jest modyfikowany.
         */
        Iterator i = zawartosc.iterator();
        try{
            while (i.hasNext()) {
                WierszElement el = (WierszElement) i.next();
                TowarElement towar=el.pobierzTowarElement();
                if (towar!=null && towar.pobierzIDTowaru().equals(element.pobierzTowarElement().pobierzIDTowaru())) {
                    el.ustawIlosc(el.pobierzIlosc() + element.pobierzIlosc());
                    return;
                }
            }
             
            /*
             * Nie znaleziono, dodanie nowego wiersza.
             */
            zawartosc.add(element);
        }catch (Exception e) {
            throw new EJBException(e);
        }
    }

    /**
     * Zmiana ilosci w zawartosci koszyka.
     * 
     * @param ID towaru
     * @param Ilosc towarow.
     */
        public void zmien(String IDTowaru, int ilosc) throws Exception {
                System.out.println("KoszykKomponent.zmien()");

                /*
                 * Wyszukanie w koszyku towaru o podanym identyfikatorze.
                 * Jezeli zostanie znaleziony, nastepuje zmiana ilosci tego towaru.
                 */
                Iterator i = zawartosc.iterator();
                while (i.hasNext()) {
            WierszElement element = (WierszElement) i.next();
            TowarElement towar=element.pobierzTowarElement();
            if (towar!=null && towar.pobierzIDTowaru().equals(IDTowaru)) {
                element.ustawIlosc(ilosc);
                if (ilosc == 0) {
                    i.remove();
                }
                return;
            }
        }
        throw new Exception("KoszykKomponent.zmien() blad: Nie mozna znalezc towaru " + IDTowaru);
    }
    
    /**
     * Laduje komponent encyjny dla podanego identyfikatora towaru.
     * 
     * @param Identyfikator towaru
     * @return Zdalny obiekt komponentu encyjnego towaru
     */
    private Towar pobierzTowar(String IDTowaru){
        try{
            Context ctx = new InitialContext();
            TowarDom towarDom = (TowarDom)
                PortableRemoteObject.narrow(
                    ctx.lookup("TowarDom"), TowarDom.class);
            Towar towar=towarDom.findByPrimaryKey(IDTowaru);
            return towar;
            }catch (Exception e) {
                throw new EJBException(e);
            }
    }
            

        /**
         * Zwraca wszystkie wiersze z koszyka.
         *
         * @return Kolekcja obiektow WierszElement z koszyka
         */
        public Vector pobierzWszystkie() {
                System.out.println("KoszykKomponent.pobierzWszystkie()");
                return zawartosc;
        }
        
        
     /**
         * Zwraca wartosc towarow, ustawiona wczesniej przez
         * metode setWartosc().
         */ 
        public double pobierzWartosc() throws RemoteException {
                return wartosc;
        }
    /**
         * Ustawia wartosc towarow.
         *
         * Nasz zewnetrzny komponent cennika jest odpowiedzialny za wyliczenie wartosci.
         * Jego wyliczenie bierze pod uwage upusty klienta (moze byc rowniez
         * rozszerzony, aby bral pod uwage inne reguly).
         */
        public void ustawWartosc(double wartosc) throws RemoteException {
                this.wartosc = wartosc;
        }

        /**
         * Zwraca wartosc podatku dla towarow znajdujacych sie w koszyku.
         */
        public double pobierzPodatek() throws RemoteException {
                return podatek;
        }

        /**
         * Ustawia wartosc podatkow dla towarow z tego koszyka.
         */
        public void ustawPodatek(double podatek) throws RemoteException {
                this.podatek = podatek;
        }

        /**
         * Zwraca calkowita wartosc towarow w koszyku.  Wartosc ta jest 
         * wyliczana przez zsumowanie:
         * 1) wartosci koszyka
         * 2) podatku.
         */     
        public double pobierzWartoscCalkowita() throws RemoteException {
                return wartosc + podatek;
        }


        /**
         * Oproznienie koszyka.
         */
        public void usunWszystkie() {
                System.out.println("usunWszystkie()");
                zawartosc.clear();
        }

        /**
         * Zakup zawartosci koszyka. W bazie danych tworzone zostaje zamowienie
         * identyczne z zawartoscia koszyka.
         *
         * @return Numer potwierdzenia zamowienia
         */
        public String zakup() {
          try {
            /*
             * Wyszukanie obiektu domowego zamowienia.
             */
            ZamowienieDom domowy=pobierzDomZamowienie();
            /*
             * Tworzenie zamowienia.
             */
            String IDZamowienia = tworzUnikatID();
            Zamowienie zamowienie=domowy.create(IDZamowienia, wlasciciel,"niezweryfikowane",wartosc,podatek);
            /*
             * Tworzy wiersze zamowienia.
             */
            Vector wierszeZamowienia=dodajWierszeZamowienia(zamowienie);
            /*
             * Ustawia wiersze w zamowieniu.
             */
            zamowienie.setLineItems(wierszeZamowienia);
            /*
             * Wysyla komunikat JMS.
             */
            wyslijKomunikat(IDZamowienia);
            /*
             * Zwraca identyfikator zamowienia.
             */
            return IDZamowienia;
          } catch (Exception e) {
          throw new EJBException(e);
      }
    }
     
    /**
     * Wysyla komunikat JMS.
     *
     *@param Komunikat JMS, w tym przypadku identyfikator zamowienia
     */
    private void wyslijKomunikat(String komunikat) throws Exception{
        try{
             WyslKomunikat wysyl=new WyslKomunikat();
             wysyl.wyslijKomunikat(komunikat);
            }catch(Exception ex){
                 throw ex;
            }
    }
    
    /**
     * Tworzy wiersze zamowienia.
     */
    private Vector dodajWierszeZamowienia(Zamowienie zamowienie){
        try{
            Context ctx = new InitialContext();
            WierszZamowieniaDom wierszZamowieniaDom = (WierszZamowieniaDom)
                PortableRemoteObject.narrow(
                    ctx.lookup("WierszZamowieniaDom"), WierszZamowieniaDom.class);
            TowarDom towarDom = (TowarDom)
                PortableRemoteObject.narrow(
                    ctx.lookup("TowarDom"), TowarDom.class);                
            Vector wierszeZamowienia=new Vector();
            for (int i=0; i < zawartosc.size(); i++) {
                
                /*
                 * Pobranie pol z wiersza koszyka.
                 */
                WierszElement element =(WierszElement) zawartosc.elementAt(i);
                /*
                 * Zaladowanie komponentu encyjnego towaru.
                 */  
                Towar towar=towarDom.findByPrimaryKey(element.pobierzTowarElement().pobierzIDTowaru());
                String id = tworzUnikatID();
                /*
                 * Przeniesienie pol do nowych
                 * wierszy zamowienia.
                 */
                WierszZamowienia wierszZamowienia = wierszZamowieniaDom.create(id, zamowienie, towar, element.pobierzIlosc(),element.pobierzRabat()) ;
                wierszeZamowienia.add(wierszZamowienia);
            }
            return wierszeZamowienia;
           } catch (Exception e) {
               throw new EJBException(e);
           }
    }
    
    /**
     * Zwraca unikatowy identyfikator wykorzystujacy biezacy czas.
     */
    private String tworzUnikatID(){
            return new Long(System.currentTimeMillis()).toString();
    }
 
    /**
     * Zwraca obiekt domowy zamowienia.
     */
    private ZamowienieDom pobierzDomZamowienie(){
        try{
             Context ctx = new InitialContext();
                ZamowienieDom dom = (ZamowienieDom)
                    PortableRemoteObject.narrow(
                        ctx.lookup("ZamowienieDom"), ZamowienieDom.class);
             return dom;
           } catch (Exception e) {
               throw new EJBException(e);
           }
    }
    
    
        //
        // metody wymagane przez EJB
        //

    /**
     * Kojarzy instancje komponentu z okreslonym kontekstem.
     */
        public void setSessionContext(SessionContext ctx) {
                System.out.println("setSessionContext()");
                this.ctx = ctx;
        }

    /**
     * Jest to metoda inicjujaca, skojarzona z metoda create()
     * w interfejsie domowym.
     *
     * Gdy klient wywoluje metode create() obiektu domowego, 
     * obiekt ten wywoluje te metode 
     * ejbCreate().
     */
    public void ejbCreate(String wlasciciel) {
                System.out.println("ejbCreate(" + wlasciciel + ")");
                this.wlasciciel = wlasciciel;
                zawartosc = new Vector();
        }

    /**
     * Metoda wywolywana przez kontener bezposrednio po
     * aktywacji tej instancji. Powinna zajmowac wszystkie
     * potrzebne zasoby.
     */ 
        public void ejbActivate() {
                System.out.println("ejbActivate()");
        }
   
    /**
     * Metoda wywolywana przez kontener bezposrednio przed
     * pasywacja tej instancji. Powinna zwalniac
     * wszystkie zasoby zajete w metodzie ejbActivate().
     */
        public void ejbPassivate() {
                System.out.println("ejbPassivate()");
        }
    
    /**
     * Usuwa ten komponent, usuwajac jednoczesnie wszystkie dane stanu
     * specyficzne dla klienta.
     *
     * W naszym przykladzie nie ma sposobu na 'przerwanie'
     * przez klienta dzialania komponentu, wiec kontener EJB
     * wywola te metode po uplynieciu czasu nieaktywnosci sesji.
     */
        public void ejbRemove() {
                System.out.println("ejbRemove()");
        }
}
package przyklady;

import javax.ejb.*;
import javax.jms.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;

/**
 * Ten komponent sterowany komunikatami pobiera komunikaty JMS
 * do przetwarzania zamowien.  Nastepnie realizuje przetwarzanie
 * zamowienia.
 */
public class PrzetwZamowienKomponent implements MessageDrivenBean, MessageListener {

  protected MessageDrivenContext ctx;

  /**
   * Jedyna metoda biznesowa jaka posiada komponent sterowany zdarzeniami.
   * Wykonujemy tu przetwarzanie zamowienia.
   */
  public void onMessage(Message komun) {
    TextMessage komTekst = (TextMessage) komun;
    try {
      String IDZamowienia = komTekst.getText();
      System.out.println("Przetwarzanie zamowienia " + IDZamowienia);
      Context ctx = new InitialContext();
      ZamowienieDom dom = (ZamowienieDom)
        PortableRemoteObject.narrow(
          ctx.lookup("ZamowienieDom"), ZamowienieDom.class);
      Zamowienie zamowienie = dom.findByPrimaryKey(IDZamowienia);

      /*
       * W tym miejscu mozna wykonac wiele zadan:
       *
       * - Wywolanie do fimy autoryzujacej karty kredytowe (byc moze za pomoca
       *   uslug WWW) w celu sprawdzenia poprawnosci danych karty kredytowej 
       *   i obciazenia karty.
       *
       * - Sprawdzenie stanu magazynu w celu okreslenia dostepnosci towaru.
       *
       * - Sprawdzenie zaleglosci w realizacji wysylek
       *
       * - Wyslanie potwierdzenia e-mailem
       *
       * W tym przykladzie jedynie ustawimy status zamowienia na 
       * "zatwierdzone".
       */
      zamowienie.setStatus("zatwierdzone");
    }
    catch (Exception e) {
      e.printStackTrace();
      throw new EJBException(e);
    }
  }

  /**
   * Kojarzy komponent z wlasciwym kontekstem.
   * Pozniej mozna odczytac za posrednictwem tego kontekstu dane srodowiska.
   */
  public void setMessageDrivenContext(MessageDrivenContext ctx) {
    this.ctx = ctx;
  }

  /**
   * Kontener wywoluje te metode na poczatku zycia komponentu.
   * Powinnismy wykonac niezbedne inicjalizacje.
   */
  public void ejbCreate() {
    System.err.println("ejbCreate()");
  }

  /**
   * Kontener wywoluje te metode przed zniszczeniem komponentu.
   * Powinnismy wykonac niezbedne porzadki.
   */
  public void ejbRemove() {
    System.err.println("ejbRemove()");
  }
}
package przyklady;

import javax.ejb.*;

/**
 * Publiczne metody biznesowe dla komponentu Towar.
 *
 * Zdefiniowany tu interfejs lokalny jest przeznaczony
 * dla klientw zdalnych operujcych na komponencie. Interfejs ten 
 * bdzie implementowany przez kontener; implementowany obiekt jest nazywany 
 * lokalnym obiektem EJB, ktry jest odpowiedzialny za delegacj 
 * wywoa do instancji klasy komponentu encyjnego.
 */
public interface Towar extends EJBLocalObject {
    
    /**
     * Zwraca identyfikator towaru.
     */
    public String getProductID();
    
    /**
     * Zwraca nazw towaru.
     */
    public String getName();
    
    /**
     * Ustawia nazw towaru.
     */
    public void setName(String nazwa);
    
    /**
     * Zwraca opis towaru.
     */
    public String getDescription();
    
    /**
     * Ustawia opis towaru.
     */
    public void setDescription(String opis);
    
    /**
     * Zwraca podstawow cen towaru.
     */
    public double getBasePrice();
    
    /**
     * Ustawia podstawow cen towaru.
     */
    public void setBasePrice(double cena);
}
package przyklady;

import javax.ejb.*;
import java.util.Collection;

/**
 * Jest to lokalny interfejs domowy dla komponentu Towar.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywoywany przez lokalny obiekt domowy
 * i suy jako producent dla obiektw lokalnych EJB.
 * 
 * W interfejsie domowym znajduje si jedna metoda create() 
 * wspdziaajca z metod ejbCreate() w klasie komponentu.
 */
public interface TowarDom extends EJBLocalHome {

	/*
	 * Tworzy towar.
	 *
	 * @param IDTowaru Numer towaru (unikalny)
	 * @param nazwa Nazwa towaru
	 * @param opis Opis towaru
	 * @param cena Cena podstawowa towaru
	 *
	 * @return Nowo utworzony obiekt EJB.
	 */
	Towar create(String IDTowaru, String nazwa, String opis, double cena) throws CreateException;

	// Metody wyszukujce. S one implementowane przez kontener.
	// Ich dziaanie mona konfigurowa w deskryptorze instalacji
	// korzystajc z EJB-QL i narzdzi kontenera.

	/**
     * Zwraca obiekt EJB towaru o podanym identyfikatorze.
     */
    public Towar findByPrimaryKey(String klucz) throws FinderException;

    /**
     * Zwraca zbir obiektw EJB o podanej nazwie towaru.
     */
	public Collection findWgNazwy(String nazwa) throws FinderException;
    
    /**
     * Zwraca zbir obiektw EJB o podanym opisie towaru.
     */
	public Collection findWgOpisu(String opis) throws FinderException;
    
    /**
     * Zwraca zbir obiektw EJB o podanej cenie towaru.
     */
	public Collection findWgCeny(double cena) throws FinderException;
    
    /**
     * Zwraca zbir obiektw EJB dla towarw o cenie wikszej ni cena minimalna.
     */
	public Collection findDrogieTowary(double cenaMinimalna) throws FinderException;
    
     /**
     * Zwraca zbir obiektw EJB dla towarw o cenie mniejszej niz cena maksymalna.
     */
	public Collection findTanieTowary(double cenaMaksymalna) throws FinderException;

    /**
     * Zwraca zbir wszystkich obiektw EJB towarw.
     */
	public Collection findWszystkieTowary() throws FinderException;
}package przyklady;

import javax.ejb.*;

/**
 * Komponent encyjny, demonstrujcy obsug trwaoci zarzdzanej przez kontener.
 *
 * Jest to opis towaru. Posiada on identyfikator, nazw
 * opis i cen podstawow.
 */
public abstract class TowarKomponent implements EntityBean {

	protected EntityContext ctx;

	public TowarKomponent() {
	}

	//-----------------------------------------------
	// Poczatek abstrakcyjnych metod pobierz/ustaw
	//-----------------------------------------------

   
     /**
     * Zwraca nazw towaru.
     */
	public abstract String getName();
    
    /**
     * Ustawia nazw towaru.
     */
	public abstract void setName(String nazwa);
    
    /**
     * Zwraca opis towaru.
     */
	public abstract String getDescription();
    
    /**
     * Ustawia opis towaru.
     */
	public abstract void setDescription(String opis);
    
    /**
     * Zwraca podstawow cen towaru.
     */
	public abstract double getBasePrice();
    
     /**
     * Ustawia podstawow cen towaru.
     */
	public abstract void setBasePrice(double cena);
    
     /**
     * Zwraca identyfikator towaru.
     */
    public abstract String getProductID();
    
    /**
     * Ustawia identyfikator towaru.
     */
	public abstract void setProductID(String IDTowaru);

	//-----------------------------------------------
	// Koniec abstrakcyjnych metod pobierz/ustaw
	//-----------------------------------------------
	
	//-----------------------------------------------
	// Pocztek metod wymaganych przez EJB.
	// Metody te s wywoywane przez kontener i nigdy
	// nie mog by wywoane przez kod klienta.
	//-----------------------------------------------

	/**
	 * Wywoywana przez kontener.
	 * Implementacja moe zajmowa niezbdne zasoby.
	 */
	public void ejbActivate() {
		System.out.println("Wywoano ejbActivate().");
	}

	/**
	 * Kontener EJB wytwouje t metod bezporednio przed
	 * usuniciem komponentu encyjnego z bazy danych.
	 * Odpowiada wywoywanej przez klienta metodzie home.remove().
	 */
	public void ejbRemove() {
		System.out.println("Wywoano ejbRemove().");
	}

	/**
	 * Wywoywana przez kontener.
	 * Zwalnia zajte zasoby przed pasywacj.
	 */
	public void ejbPassivate() {
		System.out.println("Wywoano ejbPassivate ().");
	}

	/**
	 * Wywoywana przez kontener. Aktualizuje komponent encyjny
	 * aby odpowiada wartociom zapisanym w bazie danych.
	 *
	 * Poniewa wykorzystujemy zarzdzanie trwaoci przez kontener,
	 * pozostawiamy t metod pust. Kontener EJB
	 * automatycznie zaaduje odpowiednie wartoci w podklasie.
	 */
	public void ejbLoad() {
		System.out.println("Wywoano ejbLoad().");
	}

	/**
	 * Wywoywana przez kontener. Aktualizuje baz danych
	 * aby odpowidaa biecym wartociom komponentu encyjnego
	 * reprezentujacego te same dane.
	 *
	 * Poniewa wykorzystujemy zarzdzanie trwaoci przez kontener,
	 * pozostawiamy t metod pust. Kontener EJB
	 * automatycznie zapisze odpowiednie wartoci w podklasie.
	 */
	public void ejbStore() {
		System.out.println("Wywoano ejbStore().");
	}

	/**
	 * Wywoywana przez kontener. Kojarzy t instancj komponentu
	 * z okrelonym kontekstem. Po tej operacji mona odczyta
	 * z kontekstu zmienne rodowiska.
	 */
	public void setEntityContext(EntityContext ctx) {
		System.out.println("Wywoano setEntityContext");
		this.ctx = ctx;
	}

	/**
	 * Wywoywana przez kontener. Odcza instancje komponentu 
	 * od okrelonego kontekstu i rodowiska.
	 */
	public void unsetEntityContext() {
		System.out.println("Wywoano unsetEntityContext");
		this.ctx = null; 
	}

	/**
	 * Wywoana po ejbCreate(). Komponent moe pobra
	 * swj obiekt EJBObject z kontekstu i przekaza go jako
	 * wskanik 'this'.
	 */
	public void ejbPostCreate(String IDTowaru, String nazwa, String opis, double cena) {
		System.out.println("Wywoano ejbPostCreate().");
	}

	/**
	 * Jest to metoda inicjujca, skojarzona z metod 
	 * create() w interfejsie domowym.
	 *
	 * Gdy klient wywouje metod create() z interfejsu domowego,
	 * obiekt domowy wywouje t metod ejbCreate().
	 *
	 * Musimy zainicjowa pola komponentu za pomoc wartoci
	 * parametrw przekazanych przez klienta, aby podklasa kontenera
	 * moga utworzy odpowiedni wpis w bazie danych po zakoczeniu
	 * tej metody.
	 */
	public String ejbCreate(String IDTowaru, String nazwa, String opis, double cena) throws CreateException {
		System.out.println("Wywoano ejbCreate().");

		setProductID(IDTowaru);
		setName(nazwa);
		setDescription(opis);
		setBasePrice(cena);

		/*
		 * Metoda ejbCreate() komponentu encyjnego CMP zawsze zwraca null.
		 * Metoda ejbCreate() posiada sygnatur rn od null, 
		 * dziki czemu pasuje ona do komponentu encyjnego BMP,
		 * ktry dziedziczy po komponencie encyjnym CMP.
		 */
		return null;
	}

	// Brak metod wyszukujcych 
	// (s one implementowane przez kontener).

	//-----------------------------------------------
	// Koniec metod wymaganych przez EJB
	//-----------------------------------------------
}
package przyklady;

import javax.ejb.*;

/**
 * Publiczne metody biznesowe dla komponentu WierszZamowieniaKomponent.
 *
 * Zdefiniowany tu interfejs lokalny jest przeznaczony
 * dla klientw zdalnych operujcych na komponencie. Interfejs ten
 * bdzie implementowany przez kontener; implementowany obiekt jest nazywany
 * lokalnym obiektem EJB, ktry jest odpowiedzialny za delegacj
 * wywoa do instancji klasy komponentu encyjnego.
 */
public interface WierszZamowienia extends EJBLocalObject {

    /**
     * Zwraca identyfikator klienta.
     */
    public String getOrderLineItemID();

    /**
     * Zwraca komponent encyjny zamwienia, ktrego czci jest biecy wiersz.
     */
    public Zamowienie getOrder();

    /**
     * Ustawia komponent encyjny zamwienia, ktrego czci jest biecy wiersz.
     */
    public void setOrder(Zamowienie o);

    /**
     * Zwraca ilo towarw.
     */
    public int getQuantity();

    /**
     * Ustawia ilo towarw.
     */
    public void setQuantity(int ilosc);

    /**
     * Zwraca towar skojarzony z biecym wierszem zamwienia.
     */
    public Towar getProduct();

    /**
     * Ustawia towar skojarzony z biecym wierszem zamwienia.
     */
    public void setProduct(Towar towar);

    /**
     * Zwraca rabat na biecy towar w zamwieniu.
     */
    public double getDiscount();
    /**
     * Ustawia rabat na biecy towar w zamwieniu.
     */
    public void setDiscount(double rabat);
}
package przyklady;

import javax.ejb.*;
import java.util.*;

/**
 * Interfejs domowy dla WierszZamowienia.  Ten interfejs jest implementowany
 * przez kod narzdziowy serwera EJB - implementowany obiekt
 * jest nazywany obiektem domowym i suy on jako producent
 * obiektw EJB.
 *
 * W tym interfejsie domowym znajduje si jedna metoda - create()
 * ktra wspdziaa z metod ejbCreate() w WierszZamowieniaKomponent.
 */
public interface WierszZamowieniaDom extends EJBLocalHome {

        /**
         * Metoda tworzy obiekt EJB.
         *
         * Naley zwrci uwag, e interfejs domowy zwraca
         * obiekt EJB, natomiast komponent zwraca klucz gwny.
         * Dzieje si tak, poniewa kontener EJB jest odpowiedzialny za
         * wygenerowanie obiektu EJB, natomiast komponent jest
         * odpowiedzialny za inicjalizacj.
         *
         * @param IDWierszZamowienia unikalny identyfikator wiersza zamwienia
         * @param towar Towar reprezentowany przez wiersz zamwienia
         * @param ilo Ilo towaru w tym wierszu
         *
         * @return Nowo utworzony obiekt EJB.
         */
        public WierszZamowienia create(String IDWierszZamowienia, Zamowienie zamowienie, Towar towar, int ilosc, double rabat) throws CreateException;

      /**
       * Metody wyszukujce. Wyszukanie istniejcych komponentw encyjnych.
       */
      /**
       * Zwraca obiekt EJB WierszZamowienia dla podanego identyfikatora wiersza zamwienia.
       */
        public WierszZamowienia findByPrimaryKey(String klucz) throws FinderException;

      /**
       * Zwraca zbior wierszy zamwienia dla podanego obiektu EJB zamwienia.
       */
        public Collection findWgZamowienia(Zamowienie zamowienie) throws FinderException;

      /**
       * Zwraca zbior wierszy zamwienia dla podanego obiektu EJB towaru.
       */
        public Collection findWgTowaru(Towar towar) throws FinderException;

      /**
       * Zwraca wszystkie wiersze zamwie.
       */
        public Collection findWszystkieWiersze() throws FinderException;
}
package przyklady;

import javax.naming.*;
import javax.ejb.*;
import java.util.*;

/**
 * Jest to komponent o trwaoci zarzdzanej przez kontener. Reprezentuje
 * wiersze zamwienia. Wiersz zamwienia zawiera ilos zamawianych pojedynczych towarw.
 * Zbir wielu wierszy zamwienia tworzy cae zamwienie.
 */
public abstract class WierszZamowieniaKomponent implements EntityBean {

        protected EntityContext kontekst;

        //------------------------------------------------
        // Pocztek metod biznesowych
        //------------------------------------------------

        public WierszZamowieniaKomponent() {
          System.out.println("Utworzono WierszZamowienia.");
        }

     /**
      * Numer identyfikacyjny biecego wiersza zamwienia.
      * Jest to jednoczenie klucz gwny.
      * Zwraca identyfikator wiersza.
      */
        public abstract String getOrderLineItemID();

     /**
      * Ustawia identyfikator wiersza.
      */
        public abstract void setOrderLineItemID(String id);

     /**
      * Zwraca komponent encyjny Zamowienie, ktrego czci jest biecy wiersz.
      */
        public abstract Zamowienie getOrder();

     /**
      * Ustawia komponent encyjny Zamowienie, ktrego czci jest biecy wiersz.
      */
        public abstract void setOrder(Zamowienie zamowienie);

     /**
      * Komponent encyjny zamawianego towaru.
      */
        public abstract Towar getProduct();

     /**
      * Ustawia skojarzony obiekt EJB towaru.
      */

        public abstract void setProduct(Towar towar);

     /**
      * Ilo biecego towaru w zamwieniu.
      */
        public abstract int getQuantity();
     /**
      * Ustawia ilo towarw.
      */
        public abstract void setQuantity(int quantity);

     /**
      * Rabat dla towarw w zamwieniu.
      */
        public abstract double getDiscount();

     /**
      * Ustawia rabat dla towaru.
      */
        public abstract void setDiscount(double rabat);

        //------------------------------------------------
        // Koniec metod biznesowych
        //------------------------------------------------

        //------------------------------------------------
        // Pocztek metod wymaganych przez EJB.
        //------------------------------------------------

        /**
         * czy biec instancj komponentu z okrelonym kontekstem.
         * Po wykonaniu tej operacji mona odczyta dane rodowiska
         * takie jak dane konfiguracyjne kopmponentu.
         */
        public void setEntityContext(EntityContext kontekst) {
                System.out.println("Wywoano WierszZamowienia.setEntityContext");
                this.kontekst = kontekst;
        }

        /**
         * Odcza instancj komponentu od kontekstu rodowiska.
         */
        public void unsetEntityContext() {
                System.out.println("Wywoano WierszZamowienia.unsetEntityContext");
                this.kontekst = null;
        }

       /**
        * Metoda wywoywana przez kontener bezporednio po
        * aktywacji tej instancji. Powinna zajmowa wszystkie
        * potrzebne zasoby.
        */
        public void ejbActivate() {
                System.out.println("Wywoano WierszZamowienia.ejbActivate().");
        }

       /**
        * Metoda wywoywana przez kontener bezporednio przed
        * pasywacj tej instancji. Powinna zwalnia
        * wszystkie zasoby zajte w metodzie ejbActivate().
        */
        public void ejbPassivate() {
                System.out.println("Wywoano WierszZamowienia.ejbPassivate().");
        }

       /**
        * Wywoywana przez kontener. Aktualizuje baz danych
        * aby odpowiadaa biecym wartociom komponentu encyjnego
        * reprezentujacego te same dane.
        *
        * Poniewa wykorzystujemy zarzdzanie trwaoci przez kontener,
        * pozostawiamy t metod pust. Kontener EJB
        * automatycznie zapisze odpowiednie wartoci w podklasie.
        */
        public void ejbStore() {
                System.out.println("Wywoano WierszZamowienia.ejbStore().");
        }

       /**
        * Wywoywana przez kontener. Aktualizuje komponent encyjny
        * aby odpowiada wartociom zapisanym w bazie danych.
        *
        * Poniewa wykorzystujemy zarzdzanie trwaoci przez kontener,
        * pozostawiamy t metod pust. Kontener EJB
        * automatycznie zaaduje odpowiednie wartoci w podklasie.
        */
        public void ejbLoad() {
                System.out.println("Wywoano WierszZamowienia.ejbLoad().");
        }

       /**
        * Wywoywana podczas tworzenia nowych zapisw w bazie danych.
        *
        * Gdy klient wywouje metod create() z interfejsu domowego,
        * obiekt domowy wywouje t metod ejbCreate().
        *
        * Musimy zainicjowa pola komponentu za pomoc wartoci
        * parametrw przekazanych przez klienta, aby podklasa kontenera
        * moga utworzy odpowiedni wpis w bazie danych po zakoczeniu
        * tej metody.
        */
        public String ejbCreate(String IDWierszZam, Zamowienie zamowienie, Towar towar, int ilosc, double rabat) throws CreateException {
                System.out.println("Wywoano ejbCreate(" + IDWierszZam + ").");

                setOrderLineItemID(IDWierszZam);
                setQuantity(ilosc);
                setDiscount(rabat);
              /*
               * Metoda ejbCreate() komponentu encyjnego CMP zawsze zwraca null.
               * Metoda ejbCreate() posiada sygnatur rn od null,
               * dziki czemu pasuje ona do komponentu encyjnego BMP,
               * ktry dziedziczy po komponencie encyjnym CMP.
               */
                return null;
        }

       /**
        * Wywoana po ejbCreate(). Komponent moe pobra
        * swj obiekt EJBObject z kontekstu i przekaza go jako
        * wskanik 'this'.
        */
        public void ejbPostCreate(String IDWierszZam, Zamowienie zamowienie, Towar towar, int ilosc, double rabat) throws CreateException {
                System.out.println("Wywoano WierszZamowienia.ejbPostCreate()");
                setProduct(towar);
                setOrder(zamowienie);

        }

       /**
        * Kontener EJB wytwouje t metod bezporednio przed
        * usuniciem komponentu encyjnego z bazy danych.
        * Odpowiada wywoywanej przez klienta metodzie home.remove().
        */
        public void ejbRemove() {
                System.out.println("Wywoano WierszZamowienia.ejbRemove().");
        }

        // Brak metod wyszukujcych - s one implementowane przez kontener.

        //------------------------------------------------
        // Koniec metod wymaganych przez EJB.
        //------------------------------------------------
}
package przyklady;

import java.util.*;
import javax.ejb.*;
import javax.naming.*;
import java.rmi.RemoteException;
import javax.rmi.PortableRemoteObject;

/**
 * Przykladowy klient testowy dla naszych komponentow handlu elektronicznego.
 */
public class Klient1 {

  public static void main(String args[]) throws Exception {
    Context ctx = new InitialContext(System.getProperties());
    
    KlientDom klientDom = (KlientDom)
      PortableRemoteObject.narrow(
        ctx.lookup("KlientDom"), Klient.class);

    Klient k = klientDom.create(generujKG(), "Jan Kowalski", "tajne_haslo", "Gliwice");
  }

  /**
   * Generacja klucza glownego.
   */
  private static String generujKG() throws Exception {
    String pk = new Long(System.currentTimeMillis()).toString();
    
    synchronized (pk) {
      Thread.sleep(100);
    }
    
    return pk;
  }
}
package przyklady;

import javax.ejb.*;
import javax.naming.*;
import java.rmi.*;
import javax.rmi.PortableRemoteObject;
import java.util.*;

/**
 * Aplikacja testujaca komponent Klient.
 */
public class KlientTest {

        public static void main(String[] args) {

                KlientDom dom = null;

                try {
                        /*
                         * Pobranie referencji do obiektu domowego - 
                         * producenta obiektow EJB.
                         */
                        Context ctx = new InitialContext(System.getProperties());
                        Object obiekt = ctx.lookup("KlientDom");
                        dom = (KlientDom)
                                PortableRemoteObject.narrow(obiekt, KlientDom.class);

                        /*
                         * Uzycie obiektu domowego do tworzenia obiektow EJB.
                         */
                        dom.create("123-456-7890", "Jan", "hasloJan", "Wiazowa 13");
                        dom.create("123-456-7891", "Darek", "hasloDarek", "Krotka 123");
                        dom.create("123-456-7892", "Janusz", "hasloJanusz", "Toszecka 102");

                        /*
                         * Wyszukanie komponentu i wypisanie jego opisu.
                         */
                        Collection c = dom.findWgAdresu("Toszecka 102");
                        Iterator i = c.iterator();
                        System.out.println("Przy Toszeckiej 102 pracuja nastepujacy klienci:");
                        while (i.hasNext()) {
                                Klient klient = (Klient)
                                        PortableRemoteObject.narrow(i.next(), Klient.class);
                                System.out.println(klient.getName());
                        }
                }
                catch (Exception e) {
                        e.printStackTrace();
                }
                finally {
                        if (dom != null) {
                                try {
                                        System.out.println("Usuwanie klientow...");

                                        /*
                                         * Wyszukanie wszystkich towarow.
                                         */
                                        Iterator i = dom.findWszyscyKlienci().iterator();
                                        while (i.hasNext()) {
                                                try {
                                                        Klient klient = (Klient)
                                                                PortableRemoteObject.narrow(i.next(), Klient.class);
                                                        if (klient.getCustomerID().toString().startsWith("123")) {
                                                                klient.remove();
                                                        }
                                                }
                                                catch (Exception e) {
                                                        e.printStackTrace();
                                                }
                                        }
                                }
                                catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }
}
package przyklady;

import java.sql.*;
import javax.naming.*;
import javax.ejb.*;
import java.util.*;
import java.rmi.RemoteException;
import javax.naming.*;

/**
 * Klasa informacji szczegolowych o towarze.
 *
 */

public class TowarElement implements java.io.Serializable {

    /*
     * Cena podstawowa towaru.
     */
    private double cena;

    /*
     * Nazwa towaru.
     */
    private String nazwa;

    /*
     * Opis towaru.
     */
    private String opis;

    /*
     * Identyfikator towaru.
     */
    private String IDTowaru;

    /**
     * Konstruktor.
     * @param IDTowaru
     * @param Nazwa towaru
     * @param Cena towaru
     * @param Opis towaru
     */
    public TowarElement(String IDTowaru, String nazwa, double cena, String opis) {
        System.out.println("Wywolano TowarElement(...).");
        this.IDTowaru = IDTowaru;
        this.cena = cena;
        this.nazwa = nazwa;
        this.opis = opis;
        }

    /**
     * Zwraca identyfikator towaru.
     */
    public String pobierzIDTowaru(){
        return IDTowaru;
    }

    /**
     * Ustawia identyfikator towaru.
     */
    public void ustawIDTowaru(String IDTowaru){
        this.IDTowaru = IDTowaru;
    }

    /**
     * Zwraca nazwe towaru.
     */
    public String pobierzNazwa(){
        return nazwa;
    }

    /**
     * Ustawia nazwe towaru.
     */
    public void ustawNazwa(String nazwa){
        this.nazwa = nazwa;
    }

    /**
     * Zwraca opis towaru.
     */
    public String pobierzOpis(){
        return opis;
    }

    /**
     * Ustawia opis towaru.
     */
    public void ustawOpis(String opis){
        this.opis = opis;
    }

    /**
     * Zwraca cene podstawowa towaru.
     */
    public double pobierzCena(){
        return cena;
    }

    /**
     * Ustawia cene podstawowa towaru.
     */
    public void ustawCena(double cena){
        this.cena = cena;
    }
                
}

package przyklady;

import javax.ejb.*;
import javax.naming.*;
import java.rmi.*;
import javax.rmi.PortableRemoteObject;
import java.util.*;

/**
 * Testowa aplikacja dla encyjnego komponentu CMP, Towar.
 */
public class TowarKlient {

  public static void main(String[] args) throws Exception {

    TowarDom dom = null;

    try {
      /*
       * Pobranie referencji do obiektu domowego Towar - 
       * producenta obiektow Towar.
       */
      Context ctx = new InitialContext(System.getProperties());
      dom = (TowarDom) PortableRemoteObject.narrow(
        ctx.lookup("TowarDom"), TowarDom.class);

      /*
       * Wykorzystanie producenta do utworzenia obiektow EJB Towar.
       */
      dom.create("123-456-7890", "P5-350", "350 Mhz Pentium", 200);
      dom.create("123-456-7891", "P5-400", "400 Mhz Pentium", 300);
      dom.create("123-456-7892", "P5-450", "450 Mhz Pentium", 400);
      dom.create("123-456-7893", "SD-64", "64 MB SDRAM", 50);
      dom.create("123-456-7894", "SD-128", "128 MB SDRAM", 100);
      dom.create("123-456-7895", "SD-256", "256 MB SDRAM", 200);

      /*
       * Wyszukanie towaru i wypisanie jego opisu.
       */
      Iterator i = dom.findWgNazwy("SD-64").iterator();
      System.out.println("Towary o nazwie SD-64:");
      while (i.hasNext()) {
        Towar prod = (Towar) PortableRemoteObject.narrow(
          i.next(), Towar.class);
        System.out.println(prod.getDescription());
      }

      /*
       * Wyszukanie wszystkich towarow o cenie 200.
       */
      System.out.println("Wyszukanie wszystkich towarow o cenie 200");
      i = dom.findWgCeny(200).iterator();

      while (i.hasNext()) {
        Towar prod = (Towar) PortableRemoteObject.narrow(
          i.next(), Towar.class);
        System.out.println(prod.getDescription());
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      if (dom != null) {
        System.out.println("Usuwanie towarow...");

        /*
         * Wyszukanie wszystkich towarow.
         */
        Iterator i = dom.findWszystkieTowary().iterator();
        while (i.hasNext()) {
          try {
            Towar prod = (Towar) PortableRemoteObject.narrow(
              i.next(), Towar.class);
            if (prod.getProductID().startsWith("123")) {
              prod.remove();
            }
          }
          catch (Exception e) {
            e.printStackTrace();
          }
        }
      }
    }
  }
}
package przyklady;

/**
 * Klasa Uzytkownik reprezentuje opis klienta.
 */
public class Uzytkownik implements java.io.Serializable{
    
    /*
     * Identyfikator klienta.
     */    
    private String IDKlienta;
    
    /**
     * Nazwa klienta.
     */
    private String nazwa;
    
    /**
     * Adres klienta.
     */
    private String adres;
    
    /**
     * Haslo klienta.
     */
    private String haslo;
    
    /**
     * Konstruktor.
     * @param Identyfikator klienta
     * @param nazwa klienta
     * @param haslo klienta
     * @param adres klienta
     */
    public Uzytkownik(String IDKlienta, String nazwa, String haslo, String adres){
        this.IDKlienta=IDKlienta;
        this.nazwa=nazwa;
        this.adres=adres;
        this.haslo=haslo;
    }
    
    /**
     * Zwraca identyfikator klienta.
     */
    public String pobierzIDKlienta(){
        return IDKlienta;
    }
    
    /**
     * Ustawia identyfikator klienta.
     */
    public void ustawIDKlienta(String IDKlienta){
       this.IDKlienta=IDKlienta;
    }
    
    /**
     * Zwraca nazwe klienta.
     */
        public String pobierzNazwa(){
        return nazwa;
    }
    
    /**
     * Ustawia nazwe klienta.
     */
        public void ustawNazwa(String nazwa){
        this.nazwa=nazwa;
    }
    
    /**
     * Zwraca haslo dla klienta.
     */
        public String pobierzHaslo(){
        return haslo;
    }
        
    /**
     * Ustawia haslo klienta.
     */
    public void ustawHaslo(String haslo){
        this.haslo=haslo;
    }
        
    /**
     * Zwraca adres klienta.
     */
    public String pobierzAdres(){
        return adres;
    }
    
    /**
     * Ustawia adres klienta.
     */
        public void ustawAdres(String adres){
        this.adres=adres;
    }
}


package przyklady;

import java.sql.*;
import javax.naming.*;
import javax.ejb.*;
import java.util.*;
import java.rmi.RemoteException;
import javax.naming.*;

/**
 * Element wiersza przechowuje ilosc pojedynczych towarow.
 * Zbior elementow wierszy tworzy zamowienie lub koszyk.
 */
public class WierszElement implements java.io.Serializable {

    /*
     * TowarElement posiada pola: identyfikator towaru, nazwa towaru, opis i cena towaru.
     */
    public TowarElement towarElement;
    /*
     * Ilosc elementow.
     */
    public int ilosc;
    /*
     * Rabat na kazdy element.
     */
    public double rabat;

        //------------------------------------------------
        // Poczatek metod biznesowych
        //------------------------------------------------
    /**
     * Konstruktor.
     * @param TowarElement
     * @param Ilosc elementow
     * @Param Rabat dla kazdego elementu
     */
        public WierszElement(TowarElement towarElement, int ilosc, double rabat) {
          System.out.println("Wywolano WierszElement(...)");
          this.towarElement = towarElement;
          this.ilosc = ilosc;
          this.rabat = rabat;
        }

    /**
     * Konstruktor.
     */
        public WierszElement() {
          System.out.println("Utworzono nowy obiekt WierszElement.");
        }

    /**
     * Zwraca obiekt towaru.
     * Obiekt ten zawiera identyfikator towaru, nazwe, opis i cene towaru.
     */
        public TowarElement pobierzTowarElement()  {
                System.out.println("Wywolano WierszElement.pobierzTowarElement().");
                return towarElement;
        }

    /**
     * Ustawia obiekt towaru.
     * Obiekt ten zawiera identyfikator towaru, nazwe, opis i cene towaru.
     **/
        public void ustawTowar(TowarElement towarElement)  {
                System.out.println("Wywolano WierszElement.ustawTowar().");
                this.towarElement = towarElement;
        }

    /**
     * Zwraca ilosc towaru.
     **/
        public int pobierzIlosc()  {
                System.out.println("Wywolano WierszElement.pobierzIlosc().");
                return ilosc;
        }

    /**
     * Ustawia ilosc towaru.
     **/
        public void ustawIlosc(int ilosc)  {
                System.out.println("Wywolano WierszElement.ustawIlosc().");
                this.ilosc = ilosc;
        }

        /**
         * Zwraca cene podstawowa towaru. Cena podstawowa jest
         * cena produktu pomnozona przez zamowiona ilosc.
         * Nie uwzglednia ona rabatow.
         */
    public double pobierzCena()  {
                System.out.println("Wywolano WierszElement.pobierzCena().");
                return ilosc * towarElement.pobierzCena();
        }

        /**
         * Zwraca rabat jaki klient otrzymal dla biezacego zamowienia.
         *
         * Uwaga: Rabat nie jest wartoscia procentowa.
         */
        public double pobierzRabat()  {
                System.out.println("Wywolano WierszElement.pobierzRabat().");
                return rabat;
        }

        /**
         * Ustawia rabat jaki klient otrzymal dla biezacego zamowienia.
         *
         * Uwaga: Rabat nie jest wartoscia procentowa.
         */
   public void ustawRabat(double rabat)  {
                System.out.println("Wywolano WierszElement.ustawRabat().");
                this.rabat = rabat;
        }

        //------------------------------------------------
        // Koniec metod biznesowych
        //------------------------------------------------
}
package przyklady;

import java.io.*;
import java.util.*;
import javax.transaction.*;
import javax.naming.*;
import javax.jms.*;

/**
 * Klasa ta wysyla komunikat tekstowy JMS do tematu, obecnie komponent koszyka cartbean uses this class to 
 * wykorzystuje te klase do wyslania komunikatu JMS.
 */
public class WyslKomunikat{
    
    /*
     * Producent dla kontekstu JNDI.
     */
    public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
    
    /*
     * Nazwa JNDI producenta polaczen JMS.
     */
    public final static String JMS_FACTORY="javax.jms.TopicConnectionFactory";
    
    /*
     * Nazwa JNDI tematu JMS.
     */
    public final static String TOPIC="testtopic";
    
    /*
     * URL serwera.
     */
    public final static String URL="t3://localhost:7001";
    
    /*
     * Producent polaczen JMS.
     */
    protected TopicConnectionFactory prodPolJMS;
    
    /*
     * Polaczenie dla tematu JMS
     */
    protected TopicConnection tematPol;
    
    /*
     * Sesja tematu JMS
     */
    protected TopicSession sesjaTemat;
    
    /*
     * Nadawca tematu JMS
     */
    protected TopicPublisher nadawcaTemat;
    
    /*
     *  Temat JMS
     */
    protected Topic temat;
    
    /*
     * Komunikat tekstowy JMS
     */
    protected TextMessage komunikat;
    
    /**
     * Tworzy wszystkie obiekty niezbedne do wysylania
     * komunikatow do tematu JMS.
     *
     * @param ctx kontenst poczatkowy JNDI
     * @param nazwaTemat nazwa tematu
     * @exception NamingExcpetion zglaszane w przypadku wystapienia probnlemu z interfejsem kontenstu JNDI
     * @exception JMSException zglaszane gdy z powodu bledu wewnetrznego nie uda sie zainicjowanie JMS
     *
     */
    public void inicjuj(Context ctx, String nazwaTemat)
       throws NamingException, JMSException{
           
            /*
             * Wyszukanie JNDI producenta polaczen tematow
             */
            prodPolJMS = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);

            /*
             * Tworzenie producenta polaczen tematow
             */
            tematPol = prodPolJMS.createTopicConnection();

            /*
             * Tworzenie sesji tematu
             */
            sesjaTemat  = tematPol.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

            /**
             * Wyszukanie tematu przez JNDI
             */
            temat = (Topic) ctx.lookup(nazwaTemat);

            /**
             * Tworzenie nadawcy
             */
            nadawcaTemat = sesjaTemat.createPublisher(temat);

            /**
             * Tworzenie komunikatu tekstowego
             */
            komunikat = sesjaTemat.createTextMessage();
            tematPol.start();
    }
    
    /**
     * Tworzenie wszystkich niezbednych obiektow JMS i wyslanie komunikatu do tematu JMS.
     *
     * @params komunikat Komunikat do wyslania
     * @exception JMSException Jezeli nie uda sie wyslanie komunikatow JMS z powodu bledu wewnetrznego
     *
     */
    public void wyslijKomunikat(String komunikat)  throws JMSException {
      try{
            InitialContext ctx = pobiezKontekstPocz(URL);
            inicjuj(ctx,TOPIC);
            wyslij(komunikat);
      }catch(Exception ex){
          throw new JMSException( ex.getMessage());
      }finally{
          zamknij();
      }
    }

    /**
     * Wyslanie komunikatu do tematu JMS.
     *
     * @params komunikat Komunikat do wyslania
     */
    public void wyslij(String kom)
       throws JMSException {
           komunikat.setText(kom);
           nadawcaTemat.publish(komunikat);
    }
    
    /**
     * Zamyka obiekt JMS.
     *
     * @exception JMSException jezeli nie uda sie zamkniecie obiektu JMS z powodu bledu wewnetrznego
     */
    public void zamknij()
       throws JMSException {
           nadawcaTemat.close();
           sesjaTemat.close();
           tematPol.close();
    }

    /**
     * Zwraca kontekst poczatkowy serwera aplikacji
     */

    protected static InitialContext pobiezKontekstPocz(String url)
       throws NamingException {
           Hashtable env = new Hashtable();
           env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
           env.put(Context.PROVIDER_URL, url);
           env.put("weblogic.jndi.createIntermediateContexts", "true");
           return new InitialContext(env);
    }
    /**
     * Metoda main().
     *
     * @param argumenty URL serwera WebLogic
     * @exception Exception Jezeli wystapi blad
     */
    public static void main(String[] argumenty)
        throws Exception{
            if (argumenty.length != 1) {
                System.out.println("Uzycie: java przyklady.jms.topic.TopicSend WebLogicURL");
                return;
            }
            InitialContext kont = pobiezKontekstPocz(argumenty[0]);
            WyslKomunikat wysylajacy = new WyslKomunikat();
            wysylajacy.inicjuj(kont, TOPIC);
            wysylajacy.wyslij("123456");
            wysylajacy.zamknij();
    }
    

}

package przyklady;

import javax.ejb.*;
import java.util.*;

/**
 * Publiczne metody biznesowe dla komponentu Zamowienie.
 *
 * Zdefiniowany tu interfejs lokalny jest przeznaczony
 * dla klientow zdalnych operujacych na komponencie. Interfejs ten 
 * bedzie implementowany przez kontener; implementowany obiekt jest nazywany 
 * lokalnym obiektem EJB, jest on odpowiedzialny za delegacje 
 * wywolan do instancji klasy komponentu encyjnego.
 */
public interface Zamowienie extends EJBLocalObject {

        public String getOrderID();

        /**
         * Zwraca zbior wierszy zamowienia skladajacych sie na 
         * biezace zamowienie. Kazdy element wiersza reprezentuje
         * okreslony towar i ilosc jaka zostala zamowiona.
         */
        public Collection getLineItems();
    
    /**
     * Ustawia zbior elementow wierszy.
     */
        public void setLineItems(Collection wiersze);

        /**
         * Metody pobierz - ustaw dla klienta skladajacego zamowienie.
         */
        public Klient getCustomer();
        public void setCustomer(Klient klient);

        /**
         * Zwraca wartosc zamowienia.
         * Wartosc ta stanowi sume cen poszczegolnych wierszy zamowienia.
         */
        public double pobierzCenaCalkowita();

        /**
         * Odczytuje date zlozenia zamowienia. Data ta jest ustawiana automatycznie
         * w czasie tworzenia nowego zamowienia.
         */
        public java.sql.Timestamp getOrderDate();
        public void setOrderDate(java.sql.Timestamp data);

        /**
         * Metody pobierz - ustaw dla statusu zamowienia.
         */
        public String getStatus();
        public void setStatus(String status);
}
package przyklady;

import javax.ejb.*;
import java.util.*;

/**
 * Jest to lokalny interfejs domowy dla komponentu Zamowienie.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywolywany przez lokalny obiekt domowy
 * i sluzy jako producent dla obiektow lokalnych EJB.
 */
public interface ZamowienieDom extends EJBLocalHome {

    /*
     * Metoda tworzy obiekt EJB.
     *
     * Nalezy zwrocic uwage, ze interfejs domowy zwraca
     * obiekt EJB, natomiast komponent zwraca klucz glowny.
     * Dzieje sie tak, poniewaz kontener EJB jest odpowiedzialny za
     * wygenerowanie obiektu EJB, natomiast komponent jest
     * odpowiedzialny za inicjalizacje.
     *
     * @param IDZamowienia Unikatowy identyfikator zamowienia
     * @param klient Klient skladajacy zamowienie
     * @param wiersze Skladniki zamowienia - jest to kolekcja
     *        obiektow WierszElement
     *
     * @return Nowo utworzony obiekt EJB.
     */
    public Zamowienie create(String IDZamowienia, Klient klient, Collection wiersze) throws CreateException;
    
    /*
     * Metoda tworzy obiekt EJB.
     *
     * @param IDZamowienia Unikatowy identyfikator zamowienia
     * @param klient Klient skladajacy zamowienie
     * @param wiersze Skladniki zamowienia - jest to kolekcja
     *        obiektow WierszElement
     *
     * @return Nowo utworzony obiekt EJB.
     */
    
    public Zamowienie create(String IDZamowienia, String klient, Collection wiersze) throws CreateException;
    
    /*
     * Metoda tworzy obiekt EJB.
     *
     * @param IDZamowienia Unikatowy identyfikator zamowienia
     * @param klient Klient skladajacy zamowienie
     * @param status Status zamowienia
     * @param wartosc Wartosc zamowienia
     * @param podatek Podatek nalezny dla zamowienia
     * @return Nowo utworzony obiekt EJB.
     */
    public Zamowienie create(String IDZamowienia, String klient, String status, double wartosc, double podatek) throws CreateException;
    
    /*
     * Metoda tworzy obiekt EJB.
     *
     * @param IDZamowienia Unikatowy identyfikator zamowienia
     * @param klient Klient skladajacy zamowienie
     * @param status Status zamowienia
     * @param wartosc Wartosc zamowienia
     * @param podatek Podatek nalezny dla zamowienia
     * @return Nowo utworzony obiekt EJB.
     */
    public Zamowienie create(String IDZamowienia, Klient klient, String status, double wartosc, double podatek) throws CreateException;
    // Metody wyszukujace sa implementujace, poniewaz jest to komponent CMP.
    
    /**
     * Zwraca obiekt EJB Zamowienie, o podanym identyfikatorze zamowienia.
     * @param Identyfikator zamowienia
     */
        public Zamowienie findByPrimaryKey(String klucz) throws FinderException;
     
    /**
     * Zwraca kolekcje obiektow EJB Zamowienie dla podanego obiektu EJB Klient.
     * @param klient Obiekt EJB Klient
     */
        public Collection findWgKlienta(Klient klient) throws FinderException;
    
    /**
     * Zwraca kolekcje obiektow EJB Zamowienie dla podanej daty zamowienia.
     * @param data Data zamowienia
     */
        public Collection findWgDaty(java.sql.Timestamp data) throws FinderException;
    
    /**
     * Zwraca kolekcje obiektow EJB Zamowienie dla podanego statusu zamowienia.
     * @param status Status zamowienia
     */
        public Collection findWgStatusu(String status) throws FinderException;
    
    /**
     * Zwraca wszystkie obiekty EJB zamowien.
     *
     */
        public Collection findWszystkieZamowienia() throws FinderException;
}
package przyklady;

/**
 * Wyjatki zglaszane przez komponent Zamowienie.
 */
public class ZamowienieException extends Exception {

        public ZamowienieException() {
                super();
        }

        public ZamowienieException(Exception e) {
                super(e.toString());
        }

        public ZamowienieException(String s) {
                super(s);
        }
}
package przyklady;

import java.util.*;
import java.io.*;
import java.rmi.*;

import javax.naming.*;
import javax.ejb.*;

/**
 * Komponent encyjny o trwalosci zarzadzanej przez kontener,
 * ktory reprezentuje zamowienie towarow.
 *
 * Uwaga: Komponent ten moze byc latwo rozszerzony o nastepujace funkcje:
 * - Oplaty za przesylki
 * - Rozne adresy dostawy i fakturowania
 * - Data, kiedy zamowienie ma byc wyslane
 */
public abstract class ZamowienieKomponent implements EntityBean {

    protected EntityContext kontekst;

  //-------------------------------------------------------
  // Poczatek metod biznesowych
  //-------------------------------------------------------

  /**
   * Zwraca numer identyfikacyjny zamowienia. Stanowi on jednoczesnie
   * klucz glowny.
   * @return Identyfikator zamowienia
   */
    public abstract String getOrderID();
  
  /**
   * Ustawia identyfikator zamowienia.
   */
    public abstract void setOrderID(String id);
    
  /**
   * Zwraca zbior obiektow EJB reprezentujacych wiersze zamowienia.
   */
    public abstract Collection getLineItems();
  
  /**
   * Ustawia zbior obiektow EJB reprezentujacych wiersze zamowienia.
   */
    public abstract void setLineItems(Collection wiersze);
    
  /**
   * Klient (referencja obiektu EJB) ktory zlozyl
   * biezace zamowienie.
   */
    public abstract Klient getCustomer();
  
  /**
   * Ustawia klienta (referencje obiektu EJB) ktory zlozyl
   * biezace zamowienie.
   */
    public abstract void setCustomer(Klient klient);
    
  /**
   * Zwraca date zlozenia biezacego zamowienia.
   */
    public abstract java.sql.Timestamp getOrderDate();
  
  /**
   * Ustawia date zlozenia biezacego zamowienia.
   */
    public abstract void setOrderDate(java.sql.Timestamp timestamp);
    
  /**
   * Zwraca status zamowienia. Moze on miec wartosc: 
   * "wyslane", "zatwierdzone", "wyslane", "dostarczone",
   * lub "zwrot".
   */
    public abstract String getStatus();
  
  /**
   * Ustawia status zamowienia. Moze on miec wartosc: 
   * "wyslane", "zatwierdzone", "wyslane", "dostarczone",
   * lub "zwrot".
   */
    public abstract void setStatus(String status);
  
  /**
   * Zwraca wartosc zamowienia.
   */

    public abstract double getSubTotal();
   
  /**
   * Ustawia wartosc zamowienia.
   */
    public abstract void setSubTotal(double wartosc);
   
  /**
   * Zwraca wartosc podatkow od zamowienia.
   */
    public abstract double getTaxes();
   
  /**
   * Ustawia wartosc podatkow od zamowienia.
   */
    public abstract void setTaxes(double podatek);
    
  /**
   * Zwraca cene calego zamowienia.
   */
    public double pobierzCenaCalkowita() {
      double cenaCalkowita = 0;
      Iterator i = getLineItems().iterator();
        while (i.hasNext()) {
          WierszZamowienia element = (WierszZamowienia) i.next();
          cenaCalkowita += element.getProduct().getBasePrice();
        }
      return cenaCalkowita;
  }

  //-------------------------------------------------------
  // Koniec metod biznesowych
  //-------------------------------------------------------

  //-------------------------------------------------------
  // Poczatek metod wymaganych przez EJB
  //-------------------------------------------------------

  /**
   * Wywolywana przez kontener. Kojarzy te instancje komponentu
   * z okreslonym kontekstem. Po tej operacji mozna odczytac
   * z kontekstu zmienne srodowiska.
   */
    public void setEntityContext(EntityContext kontekst) {
        System.out.println("Wywolano Zamowienie.setEntityContext()");
        this.kontekst = kontekst;
    }

  /**
   * Odlacza instancje komponentu
   * od okreslonego kontekstu i srodowiska.
   */
    public void unsetEntityContext() {
        System.out.println("Wywolano Zamowienie.unsetEntityContext()");
        this.kontekst = null;
    }

  /**
   * Wywolywana bezposrednio po aktywacji instancji komponentu.
   * Powinna zajmowac wszystkie niezbedne zasoby.
   */
    public void ejbActivate() {
        System.out.println("Wywolano Zamowienie.ejbActivate().");
    }

  /**
   * Wywolywana bezposrednio przed pasywacja instancji komponentu.
   * Powinna zwalniac wszystkie zasoby zajete w metodzie ejbActivate().
   */
    public void ejbPassivate() {
        System.out.println("Wywolano Zamowienie.ejbPassivate().");
    }

  /**
   * Aktualizuje baze danych
   * aby odpowidala biezacym wartosciom komponentu encyjnego
   * reprezentujacego te same dane.
   *
   * Poniewaz wykorzystujemy zarzadzanie trwaloscia przez kontener,
   * kontener EJB automatycznie zapisze odpowiednie wartosci w podklasie.
   */
    public void ejbStore() {
        System.out.println("Wywolano Zamowienie.ejbStore().");
    }

  /**
   * Aktualizuje komponent encyjny, aby odpowiadal wartosciom 
   * zapisanym w bazie danych.
   *
   * Poniewaz wykorzystujemy zarzadzanie trwaloscia przez kontener,
   * kontener EJB automatycznie zaladuje odpowiednie wartosci w podklasie.
   * Nastepnie wykonujemy dalsze przetwarzanie danych.
     */
    public void ejbLoad() {
        System.out.println("Wywolano Zamowienie.ejbLoad().");
    }

  /**
   * Wywolywana podczas tworzenia nowych rekordow w bazie danych.
   *
   * Gdy klient wywoluje metode create() z obiektu domowego,
   * wywoluje on metode ejbCreate().
   *
   * W metodzie tej inicjowany jest stan komponentu przy pomocy
   * zestawu metod abstrakcyjnych i parametrow przekazanych do metody.
   * Kontener na podstawie stanu komponentu tworzy (INSERT) odpowiednie
   * rekordy w bazie danych.
   */
    public String ejbCreate(String IDZamowienia, Klient klient, Collection wiersze) throws CreateException {
      System.out.println("Wywolano Zamowienie.ejbCreate(" + IDZamowienia + ").");
      setOrderID(IDZamowienia);
      setOrderDate(new java.sql.Timestamp(System.currentTimeMillis()));
      setStatus("wyslane");
    /*
     * Metoda ejbCreate() komponentu encyjnego CMP zawsze zwraca null.
     * Metoda ejbCreate() posiada sygnature rozna od null,
     * dzieki czemu pasuje ona do komponentu encyjnego BMP,
     * ktory dziedziczy po komponencie encyjnym CMP.
     */
      return null;
    }

  /**
   * Wywolywana podczas tworzenia nowych rekordow w bazie danych.
   *
   * Gdy klient wywoluje metode create() z obiektu domowego,
   * wywoluje on metode ejbCreate().
   *
   * W metodzie tej inicjowany jest stan komponentu przy pomocy
   * zestawu metod abstrakcyjnych i parametrow przekazanych do metody.
   * Kontener na podstawie stanu komponentu tworzy (INSERT) odpowiednie
   * rekordy w bazie danych.
   */
    public String ejbCreate(String IDZamowienia, Klient klient, String status,double wartosc, double podatek) throws CreateException {
      System.out.println("Wywolano Zamowienie.ejbCreate(" + IDZamowienia + ").");
      setOrderID(IDZamowienia);
      setOrderDate(new java.sql.Timestamp(System.currentTimeMillis()));
      setStatus(status);
      setSubTotal(wartosc);
      setTaxes(podatek);

    /*
     * Metoda ejbCreate() komponentu encyjnego CMP zawsze zwraca null.
     * Metoda ejbCreate() posiada sygnature rozna od null,
     * dzieki czemu pasuje ona do komponentu encyjnego BMP,
     * ktory dziedziczy po komponencie encyjnym CMP.
     */
      return null;
    }

    /**
     * Ta metoda ejbCreate() pozwala na przekazanie nazwy klienta i wyszukuje komponent
     * klienta
     */
    public String ejbCreate(String IDZamowienia, String IDKlienta, Collection wiersze) throws CreateException {
      try {
        Context kontekst = new InitialContext();
        KlientDom dom = (KlientDom)
          javax.rmi.PortableRemoteObject.narrow(
            kontekst.lookup("KlientDom"), KlientDom.class);
        Klient c = dom.findByPrimaryKey(IDKlienta);
        return this.ejbCreate(IDZamowienia, c, wiersze);
      }catch (Exception e) {
        e.printStackTrace();
        throw new EJBException(e);
    }
  }

    /**
     * Ta metoda ejbCreate() pozwala na przekazanie nazwy klienta i wyszukuje komponent
     * klienta
     */
    public String ejbCreate(String IDZamowienia, String IDKlienta, String status, double wartosc, double podatek) throws CreateException {
      try {
        Context kontekst = new InitialContext();
        KlientDom dom = (KlientDom)
          javax.rmi.PortableRemoteObject.narrow(
            kontekst.lookup("KlientDom"), KlientDom.class);
        Klient c = dom.findByPrimaryKey(IDKlienta);
        return this.ejbCreate(IDZamowienia, c, status, wartosc, podatek);
    } catch (Exception e) {
        e.printStackTrace();
        throw new EJBException(e);
      }
  }

    /**
     * Metoda ta jest wywolywana przez kontener po ejbCreate().
     * Instancja komponentu jest skojarzona z obiektem EJB.
     * Referencje do tego obiektu EJB mozna uzyskac poprzez
     * kontekst. Referencja do tego obiektu moze byc przekazana jako
     * referencja do biezacego obiektu.
     * Ustawia pola CMR klienta.
     */
    public void ejbPostCreate(String IDWierszaZamowienia, Klient klient, Collection wiersze) throws CreateException {
      System.out.println("Wywolano Zamowienie.ejbPostCreate() 1.");
      setCustomer(klient);
  }

    /**
     * Metoda ta jest wywolywana przez kontener po ejbCreate().
     * Instancja komponentu jest skojarzona z obiektem EJB.
     * Referencje do tego obiektu EJB mozna uzyskac poprzez
     * kontekst. Referencja do tego obiektu moze byc przekazana jako
     * referencja do biezacego obiektu.
     * Ustawia pola CMR klienta.
     */
    public void ejbPostCreate(String IDWierszaZamowienia, String IDKlienta, Collection wiersze) throws CreateException {
      System.out.println("Wywolano Zamowienie.ejbPostCreate().");
      try{
        Context kontekst = new InitialContext();
        KlientDom dom = (KlientDom)
          javax.rmi.PortableRemoteObject.narrow(
            kontekst.lookup("KlientDom"), KlientDom.class);
        Klient klient = dom.findByPrimaryKey(IDKlienta);
        setCustomer(klient);
      }catch (Exception e) {
        e.printStackTrace();
        throw new EJBException(e);
      }
    }

    /**
     * Metoda ta jest wywolywana przez kontener po ejbCreate().
     * Instancja komponentu jest skojarzona z obiektem EJB.
     * Referencje do tego obiektu EJB mozna uzyskac poprzez
     * kontekst. Referencja do tego obiektu moze byc przekazana jako
     * referencja do biezacego obiektu.
     * Ustawia pola CMR klienta.
     */
    public void ejbPostCreate(String IDWierszaZamowienia, Klient klient, String status, double wartosc, double podatek)
    throws CreateException {
      System.out.println("Wywolano Zamowienie.ejbPostCreate() 1.");
        setCustomer(klient);
    }

    /**
     * Metoda ta jest wywolywana przez kontener po ejbCreate().
     * Instancja komponentu jest skojarzona z obiektem EJB.
     * Referencje do tego obiektu EJB mozna uzyskac poprzez
     * kontekst. Referencja do tego obiektu moze byc przekazana jako
     * referencja do biezacego obiektu.
     * Ustawia pola CMR klienta.
     */
    public void ejbPostCreate(String IDWierszaZamowienia, String IDKlienta, String status, double wartosc, double podatek)
    throws CreateException {
        System.out.println("Wywolano Zamowienie.ejbPostCreate().");
     try{
        Context kontekst = new InitialContext();
        KlientDom dom = (KlientDom)
          javax.rmi.PortableRemoteObject.narrow(
            kontekst.lookup("KlientDom"), KlientDom.class);
        Klient klient = dom.findByPrimaryKey(IDKlienta);
        setCustomer(klient);
      }catch (Exception e) {
        e.printStackTrace();
        throw new EJBException(e);
      }
  }

    /**
     * Wywolana przed usunieciem przez kontener danych komponentu
     * encyjnego z bazy danych. Wywolywana gdy klient wywola
     * dom.remove().
     */
    public void ejbRemove() throws RemoveException {
        System.out.println("Wywolano Zamowienie.ejbRemove().");
    }

    // Brak metod wyszukujacych - sa implementowane przez kontener.

    //-------------------------------------------------------
    // Koniec metod wymaganych przez EJB
    //------------------------------------------------------
}
package przyklady;

/**
 * Wyjatki zglaszane przez zarzadce uzytkownikow.
 */
public class InvalidLoginNameException extends Exception {

  public InvalidLoginNameException() {
    super();
  }

  public InvalidLoginNameException(Exception e) {
    super(e.toString());
  }

  public InvalidLoginNameException(String s) {
    super(s);
  }
}
package przyklady;

/**
 * Wyjatki zglaszane przez zarzadce uzytkownikow.
 */
public class InvalidPasswordException extends Exception {

  public InvalidPasswordException() {
    super();
  }

  public InvalidPasswordException(Exception e) {
    super(e.toString());
  }

  public InvalidPasswordException(String s) {
    super(s);
  }
}package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.rmi.Remote;


/**
 * Jest to zdalny interfejs komponentu ZarzadcaUzytk.
 *
 * Interfejs ten pozwala klientom na wykonywanie
 * metod obiektu EJB. Interfejs ten jest implementowany
 * przez producenta kontenera; implementowany obiekt jest
 * obiektem EJB, delegujacym wywolania do aktualnego
 * komponentu.
 */
public interface ZarzadcaUzytk extends EJBObject {
    
    /**
     * Wykorzystuje komponent encyjny klienta do utworzenia rekordu w bazie danych.
     */
    public void tworzUzytkownik(Uzytkownik uzytkownik)throws RemoteException;
    
    /**
     * Zwraca obiekt uzytkownika dla podanego identyfikatora klienta.
     * Wykorzystuje komponent encyjny klienta do pobrania rekordu uzytkownika.
     */
    public Uzytkownik pobierzUzytkownik(String IDKlienta) throws RemoteException;
    
    /**
     * Autoryzacja uzytkownika.
     */
    public boolean sprawdzUzytkownik(String login, String haslo)throws InvalidPasswordException,RemoteException; 
}


package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;

/**
 * Jest to lokalny interfejs domowy dla komponentu ZarzadcaUzytk.
 * Interfejs ten jest implementowany przez kontener EJB.
 * Implementowany obiekt jest wywolywany przez lokalny obiekt domowy
 * i sluzy jako producent dla obiektow lokalnych EJB.
 */
public interface ZarzadcaUzytkDom extends EJBHome {

   /*
    * Tworzy instancje komponentu EJB.
    */
    ZarzadcaUzytk create() throws RemoteException, CreateException;
}
package przyklady;

import javax.ejb.*;
import java.rmi.RemoteException;
import java.util.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;

/**
  * Komponent ZarzadcaUzytk jest bezstanowym komponentem sesyjnym
  * odpowiedzialnym za tworzenie i odczytywanie rekordu klienta.
  * Dodatkowo autoryzuje uzytkownikow.
  */
public class ZarzadcaUzytkKomponent implements SessionBean {
  
  /*
   * Poniewaz jest to bezstanowy komponent sesyjny, nie posiada stanu
   * - kontekstu sesji. Nalezy pamietac, ze bezstanowe komponenty sesyjne 
   * moga zapamietywac stan, nie moga tego robic 
   * jedynie na rzecz okreslonego klienta.
   */
  private SessionContext ctx;

     
  /**
   * Zwraca obiekt uzytkownika dla podanego idnetyfikatora klienta.
   * Wykorzystuje komponent encyjny do odczytu rekordu klienta.
   */
  public Uzytkownik pobierzUzytkownik(String IDKlienta) {
    try{
      Context ctx = new InitialContext();
      KlientDom klientDom = (KlientDom)
        PortableRemoteObject.narrow(
          ctx.lookup("KlientDom"), KlientDom.class);
      Klient klient=klientDom.findByPrimaryKey(IDKlienta);
      return new Uzytkownik(klient.getCustomerID(),klient.getName(),klient.getPassword(),klient.getAddress());
       }catch (Exception ex) {
         throw new EJBException(ex);
       }
  }
    
  /**
   * Wykorzystuje komponent encyjny klienta do utworzenia rekordu w bazie danych.
   */
  public void tworzUzytkownik(Uzytkownik uzytkownik){
    try{
      Context ctx = new InitialContext();
      KlientDom klientDom = (KlientDom)
        PortableRemoteObject.narrow(
          ctx.lookup("KlientDom"), KlientDom.class);
      Klient klient=klientDom.create(uzytkownik.pobierzIDKlienta(),uzytkownik.pobierzNazwa(),
                          uzytkownik.pobierzHaslo(),uzytkownik.pobierzAdres());
       }catch (Exception e) {
         throw new EJBException(e);
       }
  }
  
  /**
   * Metoda wykonuje autoryzacje uzytkownika, jezeli haslo jest nieprawidlowe, zglasza wyjatek InvalidPasswordException.
   * Jezeli haslo jest prawidlowe, zwraca true.
   */
  public boolean sprawdzUzytkownik(String login, String haslo)throws InvalidPasswordException {
    try{
      Uzytkownik uzytkownik=pobierzUzytkownik(login);
      if(haslo.equals(uzytkownik.pobierzHaslo())){
        return true;
      }else {
        throw new InvalidPasswordException("Bledne haslo:"+haslo);
      }
      }catch(Exception ex){
        throw new EJBException(ex);
      }
  }
        
  //----------------------------------------------------
  // Poczatek metod wymaganych przez EJB. Ponizsze metody sa 
  // wywolywane przez kontener i nigdy nie moga byc
  // wywolane przez kod klienta.
  //----------------------------------------------------
  public void ejbCreate() throws RemoteException {
    System.out.println("Wywolano ejbCreate().");
  }
  
  public void ejbRemove() {
    System.out.println("Wywolano ejbRemove().");
  }

  public void ejbActivate() {
    System.out.println("Wywolano ejbActivate().");
  }

  public void ejbPassivate() {
    System.out.println("Wywolano ejbPassivate().");
  }

  public void setSessionContext(SessionContext ctx) {
    System.out.println("Wywolano setSessionContext()");
    this.ctx = ctx;
  }

  //----------------------------------------------------
  // Koniec metod wymaganych przez EJB
  //----------------------------------------------------
}
