Like dokumenter
Eksamen i Internetteknologi Fagkode: ITE1526

Videregående programmering 6

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF 1010, vår 2005 Løsningsforslag uke 11

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF Løsning på seminaropppgaver til uke 8

Løsningsforslag Test 2

UNIVERSITETET I OSLO

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Kalkulator-leksjonen (nesten ferdig)

Socket og ServerSocket

INF2100. Oppgaver 23. og 24. september 2010

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Implementering av caching ved hjelp av Spring. Christian Vestøl

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

SAS FANS NYTT & NYTTIG FRA VERKTØYKASSA TIL SAS 4. MARS 2014, MIKKEL SØRHEIM

Del 3: Evaluere uttrykk

2 Om statiske variable/konstanter og statiske metoder.

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF Notater. Veronika Heimsbakk 10. juni 2012

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

TDT4100 Objektorientert programmering

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

OOT Seminar H-97 CORBA. Praktisk del

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF2100. Oppgaver uke 40 og

/** * A cache of words and their stems */ static private Map<String, String> cache = new WeakHashMap<String, String>();

Program delegate. Lage et nytt prosjekt i Visual Studio

Hentet fra Suns Totorial:

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Eksamen Objektorientert Programmering 2012

Presentasjon av gruppe 7: Erik Østensen, Henning Østensen og Kenneth Ådalen

HØGSKOLEN I SØR-TRØNDELAG

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Kapittel 8: Programutvikling

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Eksamen Objektorientert Programmering 2013

TDT4100 Objektorientert programmering

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

INF1000: Forelesning 7. Konstruktører Static

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1000 Metoder. Marit Nybakken 16. februar 2004

XML og JDOM. Helge Furuseth

INF1000: Forelesning 7

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Objektorientert Programmering Ekstraordinær eksamen 2014

INF1010. Grensesnittet Comparable<T>

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Jentetreff INF1000 Debugging i Java

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

2 Om statiske variable/konstanter og statiske metoder.

INF1010 våren 2018 tirsdag 23. januar

INF2100. Oppgave 1, 2 og 3. Løsningsforslag til oppgaver 23. og 24. september Her er det mange mulige løsninger her er én: import java.io.

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Avdeling for ingeniørutdanning Institutt for teknologi

IN1010 våren januar. Objektorientering i Java

import java.util.arraylist;

IN2010: Algoritmer og Datastrukturer Series 2

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

(MVC - Model, View, Control)

Distributed Component Object Model. Utvikling av distribuerte applikasjoner. Utvidelse av COM for støtte av distribuerte objekter

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

Eksamen. Objektorientert Programmering IGR 1372

EKSAMEN I FAG TDT MMI Lørdag 11. august 2012 Tid: kl

Oppgave 1 (Opprett en database og en tabell)

Kapittel 9. Distribusjon. Fjernbruker. Tjenermaskin LAN WAN. Nærbruker. Figur 9-1: En enkel klient/tjener distribusjon

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

Løsningsforslag, inf101, våren 2001

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

Logo med FXML. Introduksjon. Skrevet av: Hallvard Trætteberg

Tilkobling og Triggere

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

Kontinuasjonseksamensoppgave i TDT4100 Objektorientert programmering

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Feilmelding Årsak Løsning

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Å lese tall fra en fil, klassen Scanner

Dagens tema: Mer av det dere trenger til del 1

Eksamen Oppgave a) public class DayTime { public final int hours, minutes;

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java

Litt om pakker og mest om data inn og ut

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF2100. Oppgave 1. Oppgave 2 4. Løsningsforslag til oppgaver uke 40 og Se figur 1 på neste side.

Dagens tema: Kompilatorens struktur. De ulike modulene Prosjektet. Oppbyggingen Pakker i Java Avbrudd («exceptions») Enum-klasser i Java

Algoritmer og datastrukturer A.1 BitInputStream

Transkript:

<frode@coretrek.com> <staaleu@coretrek.com>

C:\>cd \eclipse\workspace C:\eclipse\workspace>mkdir exampleproject C:\eclipse\workspace>cd exampleproject C:\eclipse\workspace\exampleproject>copy..\lib-coretrek-buildsys\antscript\webapp-build.xml-TEMPLATE build.xml C:\eclipse\workspace\exampleproject>ant create user@localhost:~$ cd eclipse/workspace/ user@localhost:~/eclipse/workspace$ mkdir exampleproject user@localhost:~/eclipse/workspace$ cd exampleproject user@localhost:~/eclipse/workspace/exampleproject$ cp../lib-coretrek-buildsys/antscript/webapp-build.xml-template build.xml

user@localhost:~/eclipse/workspace/exampleproject$ ant create

## I webmacro, linjer som begynner med ## er kommentar linjer ## Eksempel variabel navn: $variabel ## Kalle opp metoden getvalue(): $variabel.getvalue() ## Hente ut instans variabel "public String instancevar": $variabel.instancevar ## Hente ut statisk variabel "public static String STATIC_VAR": $variabel.static_var

## Gitt følgende WebMacro tekst: $variable.name ## Så vil følgende oppslag bli prøvd: 1. Instans variabelen "Name" på objektet $variable 2. Den statisk variaben "Name" på objektet $variable 3. $variable.getname() 4. $variable.isname() 5. $variable.get("name") $variable.object.value $variable.getobjectbyid($id).name

#set $variablereference = <Expression> ## En variabel kan settes til en streng #set $var = "Value" ## En kan også kalle på metoder og lagre resultatet #set $varlength = $var.length() ## Å bruke uttryk er også gyldig #set $sum = 5 + 5 #if () BLOCK [#elseif () BLOCK] [#else BLOCK] #if (<test>) Resultat1 #elseif (<test2>) Resultat2 #else Resultat3 #end

#foreach $listentry in $collection[indexing $indexvariable[ from $fromvariable][ limit $ <table> #foreach $entry in $list <tr> <td>$entry.name</td> <td>$entry.value</td> </tr> #end </table> #count $i from $start to $end[ step $step] #set $start = 100 #set $end = 1 #set $step = -1 #count $i from $start to $end step $step $i. I like WebMacro<br /> #end #alternate $variable through $collection ## Notasjonen [ <var>, <var> ] lar deg lage lister rett i WebMacro koden ## Listen kan ha flere enn bare 2 elementer som vist her #alternate $rowcolor through ["#ffffff", "#dddddd"] <table>

<tr bgcolor="$rowcolor"> </tr> <tr bgcolor="$rowcolor"> </tr> <tr bgcolor="$rowcolor"> </tr> </table> ## resultatet her blir #ffffff for første og siste, og #dddddd for den i midten. #text BLOCK #text #if her vil ikke bli tolket som en #if #end #macro ($argument,...) BLOCK ## Her definerer vi en macro som tar ett argument, $param, som den skriver ut i bold #macro testmacro($param) <b>$param</b> #end ## Her sender vi inn teksten "test" som ett parameter, resultatet blir at det her står <b>test</b> #macro("test")

#include [as text as template as macro] $filename ## Include as text gjør at filen blir lest rått og innholdet satt inn #include as text "info.txt" ## Include as template gjør at filen blir parset som om innholdet stod direkte her #include as template "template.wm" ## Include as macro brukes for filer der en sammler sammen flere #macro kommandoer #include as macro "macros.wm" import java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.outputstream; import java.util.map; import org.webmacro.context; import org.webmacro.fastwriter; import org.webmacro.initexception; import org.webmacro.propertyexception; import org.webmacro.resourceexception; import org.webmacro.template; import org.webmacro.wm; /** * Dette er en liten hjelpeklasse for å rendere webmacro filer. */ public class WebMacroRenderer { private String _template; private WM _wm; public WebMacroRenderer(String template) throws InitException { _template = template; // initialiser WebMacro instansen _wm = new WM(); public void render(outputstream stream, Map contextmap) throws ResourceException, PropertyException, IOException { // For å kunne rendere en WM fil, så trenger vi Template objeketet. Dette // er fordi WebMacro cacher parse resultatet fra en fil. Template template = _wm.gettemplate(_template);

// For å parse en fil så trenger vi en FastWriter til å skrive. Denne // peker vi på OutputStreamen som vi får inn, og setter encoding til ISO-8859-1 FastWriter fastwriter = new FastWriter(_wm.getBroker(), stream, "ISO-8859-1"); // Contexten er det objektet som inneholder alle variabler som er tilgjengelig i en // WebMacro fil. Vi kan også fylle den med data før parsing for å sende variabler inn // til WM filen. Contexten er en utvidelse av Map, og vi fyller den med det mapet // som har blitt sendt inn. Context context = _wm.getcontext(); context.putall(contextmap); // Render templaten med det FastWriter objektet vi har laget og den konteksten vi // har template.write(fastwriter, context); // Flush fastwriteren, slik at resultatet blir skrevet ut. fastwriter.flush(); public String rendertostring(map context) throws PropertyException, ResourceException, IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); render(baos, context); baos.close(); return new String(baos.toByteArray(), "ISO-8859-1"); import java.util.hashmap; import java.util.map; public class WebMacroMain { // Generer template navn utifra klassenavn. Dette slik at det bare er å lage en template med // samme navn som klassen i den pakken som WebMacroMain ligger. private static final String TEMPLATE = WebMacroMain.class.getName().replace('.','/')+".wm"; public static void main(string[] args) throws Exception { // Opprett en renderer for filen vår. WebMacroRenderer renderer = new WebMacroRenderer(TEMPLATE); // Lag og fyll en Context Map context = new HashMap(); // Render resultatet til Syste,out. renderer.render(system.out, context);

public class SomeCorelet extends Corelet { private static final String TEMPLATE = SomeCorelet.class.getName().replace('.','/')+".wm"; public String gettemplate() { return TEMPLATE;

package com.coretrek.kurs; import com.corelet.corelet; public class HelloWorld extends Corelet { private static final String TEMPLATE = HelloWorld.class.getName().replace('.','/')+".wm"; private static final String TITLE = "Hello World"; public String gettitle() { return TITLE; public String gettemplate() { return TEMPLATE;

<span class="normal">hello World</span> <Module id="example"> <Corelet id="helloworld" class="com.coretrek.kurs.helloworld" size="small"> <Addable application="true" portal="true" /> </Corelet> </Module>

ModuleId[.ModuleId] CoreletId

<a href="parameters?$this:key=value">send key=value to $this</a> <form method="post" action="parameters"> <input type="text" name="$this:text" /> </form> public void process(coreletrequest creq, CoreletResponse cres)

public void sendparameter(string coreletid, String parametername, Object parametervalue)

<img src="$spaceimage" width="1" height="1" />

<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE Config SYSTEM "corelets.dtd"> <Config> <!-- Mange forskjellige tager som kun gjelder for server oppsettet --> <Modules> <Module id="test"> <Corelet id="test" class="com.test.test" size="small"> <Addable portal="true" application="true" /> </Corelet> </Module> </Modules> </Config>

<!-- Den første Entryen her inneholder kun en String --> <Entry key="string">stringvalue</entry> <!-- Denne Entryen inneholder en liste, man må caste til java.util.list når den hentes ut. --> <Entry key="list"> <Value>Entry 1</Value> <Value>Entry 2</Value> <Value>Entry 3</Value> <Value>Entry 4</Value> </Entry> <!-- Denne entryen inneholder ett nytt map inne i seg selv. En må cate til java.util.map når verdien henter ut. --> <Entry key="map"> <Entry key="subkey1">subvalue 1</Entry> <Entry key="subkey2">subvalue 2</Entry> <Entry key="subkey3">subvalue 3</Entry> <Entry key="subkey4">subvalue 4</Entry> </Entry> <!-- Her er ett eksempel som bruker flere ting om en annen. Man må kjenne til strukturen i koden der man leser ut innholdet --> <Entry key="mix"> <Value> <Entry key="submap">submapvalue</entry> <Entry key="somethingelse">value</entry> </Value> <Value>String</Value> <Value> <Value>2</Value> <Value>4</Value> <Value>6</Value> <Value>8</Value> </Value> <Value> <Entry key="map">

<Value>TEXT</Value> </Entry> </Value> </Entry> #set $coreletid = $this.getsiblingid("popupcorelet") #set $popupwidth = 200 #set $popupheight = 400 ## Vanlig popup <a href="javascript:popup($coreletid, $popupwidth, $popupheight)">popup</a> ## popup mede paramter <a href="javascript:popup("$coreletid&$coreletid:para1=val&$coreletid:para2=val", $popupwidth, $popupheight)">popup</a>

mins hours dates months days 0,30 * * * *

0 0 1 * * run()

com.corelet.event.event Listener.EVENT_ID_USER_ SESSION_ADDED_MASTER com.corelet.event.event Listener.EVENT_ID_USER_ SESSION_ADDED_SHARED com.corelet.event.event Listener.EVENT_ID_REMOV E_USER_SESSION_MASTER com.corelet.event.event Listener.EVENT_ID_REMOV E_USER_SESSION_SHARED com.corelet.event.event Listener.EVENT_ID_DOMAI N_LOGGEDIN com.corelet.event.event Listener.EVENT_ID_LOGOU T_DOMAIN fireevent

corelets.xml corelets.xml corelets.xml <Authentication masterchainid="--chain ID ref--" optionalchainid="--chain ID ref--" logoutchainid="--chain ID ref--"> <AuthenticationSystemMappings defaultmasterchainid="--chain ID ref--" fileuploaddownloadchainid="--chain ID ref--" optionalchainid="--chain ID ref--" /> <StateStore class="--statestore class--"> </StateStore> <SessionKeepers> <SessionKeeper id="--session keeper ID--" class="--session keeper class--"> </SessionKeeper> </SessionKeepers> <AuthenticationSources> <AuthenticationSource id="--authentication source ID--" class="--authentication source class--"> </AuthenticationSource> </AuthenticationSources>

<AuthenticationSourceStacks> <AuthenticationSourceStack id="--authentication stack ID--"> <AuthenticationSourceRef sourceref="--authentication source ID ref--" /> </AuthenticationSourceStack> </AuthenticationSourceStacks> <AuthenticationMethods> <AuthenticationMethod id="--authentication method ID--" class="--authentication method class--"> </AuthenticationMethod> </AuthenticationMethods> <AuthenticationChains> <AuthenticationChain id="--chain ID--" defaultstackref="--authentication stack ID ref--" sessionkeeperref="--session keeper ID ref--" mastersession="--true/false--"> <AlreadyLoggedInAuthenticationMethodRef methodref="--authentication method ID ref--" /> <AuthenticationMethodRef methodref="--authentication method ID ref--" /> </AuthenticationChain> </AuthenticationChains> </Authentication> <AuthenticationSources> <!-- Simple SQL authentication with users and domains. No groups, etc. --> <AuthenticationSource id="simpledb_ct-domain" class="com.coretrek.machete.auth.std.source.simpledb.simpledbauthenticationsource"> <Alias absoluteid="dbsrc_ct-domain" /> <Entry key="connectionid">ct-domain</entry> <Entry key="databasefailurehaltsstartup">false</entry> </AuthenticationSource> </AuthenticationSources> <AuthenticationSourceStacks>

<!-- Only use the simple SQL based authentication system --> <AuthenticationSourceStack id="dbstack"> <Alias id="default" /> <AuthenticationSourceRef sourceref="dbsrc_ct-domain" /> </AuthenticationSourceStack> </AuthenticationSourceStacks> <AuthenticationMethods> <AuthenticationMethod id="htmlform" class="com.coretrek.machete.auth.std.method.htmlformauthenticationmethod"> <!-- <Entry key="singledomain">default</entry> --> <Entry key="loginpage">com/coretrek/machete/auth/std/method/login.wm</entry> <Entry key="takenoverpage">com/coretrek/machete/auth/std/method/takenover.wm</entry> </AuthenticationMethod> </AuthenticationMethods>

<SessionKeepers> <SessionKeeper id="httpsessionbasedsessionkeeper" class="com.coretrek.machete.auth.std.sessionkeeper.servlet.httpsessionbasedsessionkeeper"> <Alias absoluteid="default" /> </SessionKeeper> </SessionKeepers> <StateStore class="com.coretrek.machete.auth.std.statestore.sql.sqlstatestore"> <Entry key="connectionid">ct-domain</entry> <Entry key="databasefailurehaltsstartup">false</entry> </StateStore>

<AuthenticationChains> <AuthenticationChain id="html Form" defaultstackref="default" sessionkeeperref="default" mastersession="true"> <AlreadyLoggedInAuthenticationMethodRef methodref="htmlform" /> <AuthenticationMethodRef methodref="sessionkeeper" /> <AuthenticationMethodRef methodref="ccscookie" /> <AuthenticationMethodRef methodref="popupblocker" /> <AuthenticationMethodRef methodref="htmlform" /> </AuthenticationChain> </AuthenticationChains> <Authentication masterchainid="html Form" optionalchainid="optional-shared" logoutchainid="logout-chain">

<AuthenticationSystemMappings defaultmasterchainid="html Form" fileuploaddownloadchainid="http BASIC-shared" optionalchainid="optional-shared" />

<AuthenticationChain id="html Form + Anonymous" defaultstackref="default" sessionkeeperref="httpsessioninactivityintervalboostingsessionkeeper" mastersession="true"> <AlreadyLoggedInAuthenticationMethodRef methodref="htmlform" /> <AuthenticationMethodRef methodref="cookietester" /> <AuthenticationMethodRef methodref="anonymoushtmlsnoop" /> <AuthenticationMethodRef methodref="sessionkeeper" /> <AuthenticationMethodRef methodref="ccscookie" /> <AuthenticationMethodRef methodref="popupblocker" /> <AuthenticationMethodRef methodref="anonymoususer" /> <!-- This method generates a AnonymousUser --> </AuthenticationChain> corelets.xml

corelets.xml <AdminServlet password="default" />

logconfig.xml logconfig.xml

registerrss getrssnewsitems reloadrss getregisteredrssfeeds incrementcounter getcurrentvalue getupdatetimes percentagehit eventtofire percentagehit eventtofire

public class ExampleStateCorelet extends Corelet implements Stateful { private ExampleState _instancestate; private ExampleState _globalstate; public void setinstancestate(state state) { _instancestate = (state == null)? new ExampleState() : (ExampleState) state; public void getinstancestate() { return _instancestate; public void setglobalstate(state state) { _globalstate = (state == null)? new ExampleState() : (ExampleState) state; public void getglobalstate() { return _globalstate; // Corelet methods // State class definiton public static class ExampleState extends State { setxxxstate getxxxstate

public class ExampleStatefulCorelet extends StatefulCorelet { private ExampleState _instancestate; private ExampleState _globalstate; public void process(coreletrequest creq, CoreletResponse cres) { if (_instancestate == null) { _instancestate = (ExampleState) getinstancestate(); if (_instancestate == null) { _instancestate = new ExampleState(); setinstancestate(_instancestate); if (_globalstate == null) { _globalstate = (ExampleState) getglobalstate(); if (_globalstate == null) { _globalstate = new ExampleState(); setglobalstate(_globalstate); // State class definiton public static class ExampleState extends State { getxxxstate setxxxstate getmodulestate setmodulestate public ExampleState getmodulestate() { if (_modulestate == null) { _modulestate = (ExampleState) user.getmodulestate(getcoreletconfig().getmoduleconfig()); if (_modulestate == null) { _modulestate = new ExampleState(); user.setmodulestate(getcoreletconfig().getmoduleconfig(), _modulestate); return _modulestate;

_modulestate public ExampleState getdomaincoreletstate() { if (_domaincoreletstate == null) { _domaincoreletstate = (ExampleState) domain.getcoreletstate(getcoreletconfig()); if (_domaincoreletstate == null) { _domaincoreletstate = new ExampleState(); domain.setcoreletstate(getcoreletconfig(), _domaincoreletstate); return _domaincoreletstate; public ExampleState getdomainmodulestate() { if (_domainmodulestate == null) { _domainmodulestate = (ExampleState) domain.getmodulestate(getcoreletconfig().getmoduleconfig()); if (_domainmodulestate == null) { _domainmodulestate = new ExampleState(); domain.setmodulestate(getcoreletconfig().getmoduleconfig(), _domainmodulestate); return _domainmodulestate;

<!-- example for connection URLs of the type jdbc:<driver>://<host>/<database> --> <Connection id="--connectionid--" driverclass="--driverclass--" exceptionshaltstartup="--true/false--"> <ConnectionParameters driver="--driver--" host="--host--" database="--database--" /> <ConnectionCredentials username="--dbusername--" password="--dbpassword--" /> <PoolParameters minsize="--minpoolsize--" maxsize="--maxpoolsize--" maxidletime="--maxconnectionidletime--" maxreuse="--maxconnectionreuse--" /> </Connection> <!-- Example using URL instead of parameters --> <Connection id="--connectionid--" driverclass="--driverclass--" exceptionshaltstartup="--true/false--"> <ConnectionURL url="--jdbcurl--" /> <ConnectionCredentials username="--dbusername--" password="--dbpassword--" /> <PoolParameters minsize="--minpoolsize--" maxsize="--maxpoolsize--" maxidletime="--maxconnectionidletime--" maxreuse="--maxconnectionreuse--" /> </Connection>

// Getting the connection Connection con; try { // in Corelets con = getconnection("ct-domain"); // elsewhere con = Server.getServer().getConnection("ct-domain"); catch (SQLException e) { // Handle connection error try { // Perform SQL operations catch (SQLException e) { // Handle SQL error finally { try { con.close(); catch (SQLException e) { // Handle connection closing error

import org.apache.log4j.logger; private static final Logger log = Logger.getLogger(<logger name>); if (log.isdebugenabled()) log.debug("current time is: "+System.currentTimeMillis()+"ms since 1. January 1970");

<appender name="demoappender" class="org.apache.log4j.dailyrollingfileappender"> <param name="datepattern" value="'.'yyyy-mm-dd" /> <param name="file" value="${com.coretrek.machete.log.dir/demoappender.log" /> <layout class="org.apache.log4j.patternlayout"> <param name="conversionpattern" value="%d{iso8601 %-5p %-25t %-35c [%x] %m%n" /> </layout> </appender>

<category name="demo.democategory" additivity="false"> <priority value="debug" /> <appender-ref ref="demoappender" /> </category>

public FormParser createform() { InputField field1 = new TextField(/* Constructor parameters*/); InputField field2 = new TextField(/* Constructor parameters*/); InputField field3 = new TextField(/* Constructor parameters*/); FormParser form = new FormParser(getId() getnamespace()); form.addinputfield(field1); form.addinputfield(field2);

form.addinputfield(field3); Validator range = new RangeCheckValidator(/* Constructor parameters*/); Validator match = new MatchValidator(/* Constructor parameters*/); form.addvalidator("numberfield", range); form.addvalidator(new String[] {"pass1", "pass2", match); ## This assumes that the Corelet has a method called getform(), which ## returns a FormParser object. $this.form.startform("formname") ## To print out the field named "field1" $this.form.field1 $this.form.endform

public void process(coreletrequest req, CoreletResponse res) { String formsubmitted = req.getstringparameter(formparser.parameter_form_submitted); if (formsubmitted.equals("formname")) { form.process(req); if (userrequestedsave && form.validate()) { saveformdata(form); private void saveformdata(formparser form) { String stringfield = form.getstring("stringfieldname"); Date datefield = form.getdate("datefieldname"); int intfield = form.getint("intfieldname"); Object customobject = form.getobject("customobjectfieldname");

public class ExampleComponent extends WebmacroComponent {

// Statisk definert Componenet ID public static final String COMPONENT_ID = "ExampleComponent"; // WebMacro template for Componenten // Det er egen hjelpefunksjon for å lage den som gir den samme navn som klassen +".wm", og // peker til at WebMacro filen ligger i samme mappe/pakke som klassen. private static final String TEMPLATE = classtotemplate(examplecomponent.class); // Default konstruktør - når denne brukes så kan Componenten kun // oppstå en gang under en parent public ExampleComponent() { super(component_id); // Konstruktør som tar ID som parameter public ExampleComponent(String id) { super(id); // Process kan implementeres ved behov protected void process(componentrequest creq, ComponentResponse cres) { // DisplayPrepare kan implementeres ved behov protected void displayprepare() { public String gettemplate() { return TEMPLATE;

// ExampleComponentCorelet.java public class ExampleComponentCorelet extends Corelet implements ComponentHolder { // Componentet som vi bruker. private Component _component; // getnamespace metoden som man må implementere fra ComponentHolder public String getnamespace() { // Denne metoden vil alltid se slik ut for Coreletter return getid(); // process for Coreletten public void process(coreletrequest creq, CoreletResponse cres) { // Pass på at vi har en instans av Component if (_component == null) { _component = new ExampleComponenet("Example"); // Kall opp process på Component. Dette vil videre kalle den implementerte // process metoden på Componetet etter at kontekstverdier er satt. _component.process(this, creq); public void displayprepare() { // Kall opp displayprepare på Componenten, som vil kalle videre til den faktisk // implementasjonen etter at kontekst har blitt satt _component.displayprepare(this); /** * Denne metoden vil gjøre det mulig å få tak i Componenten i WebMacro. */ public Component getcomponent() { return _component; // gettemplate metoden må også implementeres her. ## ExampleComponentCorelet.wm ## Dette vil hente ut Componentet, og så vil det i tur rendere seg selv med sin template der det plasseres. $this.component

public class StateComponent extends WebmacroComponent { private StateComponentState _state; protected void process(componentrequest creq, ComponentResponse cres) { if (_state == null) { _state = (StateComponentState) getstate(); if (_state == null) { _state = new StateComponentState(); setstate(_state); // Bruk staten private static final class StateComponentState extends State {

public TabContainer createtabcontainer() { // Første steg er å opprette selve TabContaineren TabContainer result = new TabContainer("TabContainer", "details"); // Vi har satt at default tabben skal være details, vi må da sikre at vi legger // til en tab med den IDen

// Den første tabben vi legger til her er også den som kommer til å // ende opp som default tab. result.addcontainedcomponent(new CompanyDetailComponent("details")); result.addcontainedcomponent(new CompanyAddressComponent("address")); result.addcontainedcomponent(new CompanyContactsComponent("contacts")); // TabContainer er nå initialisert, den må videre brukes som en vanlig Component return result;

<Themes> <Default id="standard" /> <Common logout="com/corelets/htmldesign/logout.wm" restore="com/corelets/htmldesign/restore.wm" replacementcorelet="com/corelets/htmldesign/replacementcorelet.wm" serverdown="com/corelets/htmldesign/serverdown.wm" exception="com/corelets/htmldesign/exception.wm" /> <Theme id="standard" description="the Blue Dull" frameset="com/corelets/htmldesign/standard/frameset.wm" stylesheet="com/corelets/htmldesign/standard/css.wm" topbar="com/corelets/htmldesign/standard/topbar.wm" topsize="26" corelet="com/corelets/htmldesign/standard/corelet.wm" mainlet="com/corelets/htmldesign/standard/applicationmodemainlet.wm" themeinclude="com/corelets/htmldesign/standard/themeinclude.wm" workbench="com/corelets/htmldesign/standard/workbench.wm" staticcontent="themes/standard" /> </Themes>

<link rel="stylesheet" href="$ccs_abscontextpath/stylesheet/$ccs_theme.id" type="text/css" /> #parse "$CCS_Theme.ThemeInclude" #set $themehtmlroot="$htmlroot/$ccs_theme.staticcontent"

themes/<themeid>

corelets.xml <?xml version="1.0" encoding="iso-8859-1"?> <Dictionary> <Key key="module"> <Key key="modulepart"> <Key key="text"> <Value lang="no_no">teksten på norsk</value> <Value lang="en_us">the text in english</value> </Key> </Key> </Key> </Dictionary>