Určitě jako správní programátoři dáváte přednost
                  psaní kódu před nudným čtením manuálů. Po poněkud
                  méně záživném minulém díle se dnes dostaneme k tvůrčí
                  práci. Pokud jste se při jeho čtení ošívali, vězte že
                  to bylo napsáno pro vaše dobro. Dnes nás totiž čeká
                  napsání prvních řádek kódu v prostředí Caché (ne,
                  nebojte se, není to nic složitého a každá nova
                  zkušenost se jednou může hodit) tříd.
 Pro osvětlení Java projekce z Caché použijeme
                  účetní aplikaci. Na několika třídách si budeme
                  prezentovat vytvoření jednoduché aplikace, jež pro
                  ukládání dat a částečně i pro aplikační logiku
                  použije schopnosti platformy Caché a uživatelské
                  rozhraní ponechá na libovůli vývojáře. V našem
                  případě libovůle rovná se Java.
 Náš model sestává z jednoho rozhraní, 4
                  persistentních tříd a jedné třídy provádějící
                  aplikační logiku. Pro ulehčení práce je možno projekt
                  stáhnout zde. Tím se
                  vyhneme, pokud nejsme z Caché již zběhlí, nutnosti
                  trávit čas přemýšlením nad vytvořením modelu.
Model aplikace vypadá takto:
 Třídy Syntetika a Analytika představují účty hlavní knihy, do
                  nich jsou ukládány informace o zůstatcích. Třídy
                  Denik a Zapis slouží k
                  uchovávání chronologicky řazených účetních zápisů.
 Aplikační logika, tedy to co nás zajímá nejvíce,
                  se odehrává ve třídě Operace.
 V tomto okamžiku máme k dispozici dva možné
                  scénáře.
-  Aplikační logiku budeme vykonávat na straně
 Java serveru, tím pádem nebudeme potřebovat třídu
 Operace a do Javy vystavíme výše uvedené třídy
 Syntetika,Analytika,
 DenikaZapis.
-  Aplikační logiku ponecháme v Caché a pak nám
 bude stačit vystavit do Javy pouze tříduOperace.
My si předvedeme oba scénáře.
Nejdříve scénář č. 1:
 Nejdříve ke třídě Operace
                  definujeme projekci do Javy, pro nás nejdůležitějším
                  parametrem je ROOTDIR do kterého
                  zadáme kořenový adresář pro generované java soubory.
                  Logicky budeme chtít, aby tento adresář ukazoval do
                  adresáře se zdrojovými soubory projektu otevřeného v
                  IDE.
Definice projekce tedy může vypadat třeba takto:
Projection Java As %Projection.Java(ROOTDIR
                  = "C:\Java\netbeans\mojeucto\src\mojeucto\");
 K tomu, aby se vygeneroval java zdrojový soubor už
                  stačí jen třídu zkompilovat. Výsledný Java soubor zde
                  nebudeme probírat, ale doporučuji abyste se na něj ve
                  svém vývojovém prostředí podívali, pomůže Vám to
                  pochopit mechanismus volání funkčnosti Caché.
 Zde je odkaz na online dokumentaci, který Vám
                  pomůže rychle se zorientovat v tom, jak přidat
                  projekci ke třídě.
 Nakonec nám zbývá už jen napsat jednoduchou Java
                  třídu pro otestování funkčnosti našeho modelu.
 Výsledný Java kód může vypadat třeba takto (opět
                  prosím o shovívavost, snažím se mít kód co nejkratší
                  aby zbytečně nezabíral celý článek)
 package mojeucto;
                  
                  import com.intersys.objects.*;
                  import com.intersys.classes.*;
                  import java.util.*;
                  import java.io.*;
                  import java.text.SimpleDateFormat;
                  
                  /** 
                  * Demo aplikace prezentujici propojeni Java aplikace
                  a Cache.
                  * v teto variante mame aplikacni logiku
                  implementovanu na strane Cache serveru
                  * a tak nam staci udelat Java projekci pouze nad
                  jednou tridou v Cache - tridou
                  * vykonavajici onu logiku - ucto.demo.Operace
                  * @author dkutac
                  */
                  public class Main { 
 public
                  Database cacheConnection = null;
                  String url="jdbc:Cache://localhost:56773/WEB";
                  
                  public Main() {
                  }
                  
                  public static void main(String[] args) throws
                  Exception { 
 Main runner
                    = new Main();
                    java.util.Date today = new java.util.Date();
                    java.sql.Date dnes = new
                    java.sql.Date(today.getTime());
                    
                    String ref = runner.prompt("Identifikace
                    dokladu:");
                    String popis = runner.prompt("Popis dokladu:");
                    Double castka =
                    Double.parseDouble(runner.prompt("Castka k
                    zauctovani:"));
                    SimpleDateFormat formatter = new
                    SimpleDateFormat("dd.mm.yyyy");
                    java.sql.Date datum = new
                    java.sql.Date(formatter.parse(runner.prompt("Datum
                    transakce ve tvaru DD.MM.YYYY:")).getTime());
                    String rozpis = runner.prompt("Ucetni predpis ve
                    tvaru MD|D:");
                    // napr. "AB2007/01","Vyber hotovosti z
                    uctu",500,"28.2.2007","211000|221000"
                    runner.zauctuj(ref,popis, castka, datum, rozpis
                    );
                                       }
                  
                  /**
                  * Provede zauctovani ucetniho dokladu
                  * @param reference - jednoznacna externi identifikace
                  dokladu
                  * @param popis - volny popis ucetniho zapisu
                  * @param castka - castka transakce
                  * @param den - datum zauctovani
                  * @param ucetniPredpis - textove vyjadreni ucetniho
                  predpisu ve tvaru MD|D, napr. 211000|221000
                  */
                  public void zauctuj(String reference, String popis,
                  Double castka, java.sql.Date den, String
                  ucetniPredpis ){ 
 if
                    (connectToCache(url)) { 
 try {
                      
                        ucto.demo.Operace op = new
                        ucto.demo.Operace(cacheConnection);
                        op.zauctujDoklad(reference,popis,castka,den,ucetniPredpis);
                        cacheConnection.closeAllObjects();
                        cacheConnection.close();                        } catch (Exception ex) { 
                        ex.printStackTrace();                        } 
                     } else { 
                      System.out.println("Nelze se připojit ke Caché");
                                           } 
                   }
                  
                  /**
                  * Provede pripojeni k databazi Cache
                  * @param url - retezec s url pripojeni k databazi
                  Cache
                  */
                  public boolean connectToCache(String url) { 
 try { 
 // ucet a
                      heslo ke Cache si pripadne dosad podle sve
                      konfigurace
                      cacheConnection = CacheDatabase.getDatabase
                      (url,"_system","sys");
                      return true;                      } catch (Exception ex) { 
                      System.out.println( "Caught exception: " +
                      ex.getClass().getName() + ": " + ex.getMessage()
                      );
                      ex.printStackTrace();
                      return false;                      } 
                   }
                  
                  /**
                  * Utilita pro vstup informaci z prikazove radky
                  * @param prompttext - text zobrazeny u prikazove
                  radky
                  */
                  public String prompt(String prompttext) throws
                  Exception { 
                    BufferedReader br = new BufferedReader(new
                    InputStreamReader(System.in));
                    System.out.println(prompttext);
                    return br.readLine();                    } 
                 } 
Druhý scénář si ukážeme v příštím díle.

