create new web application
This page shows how to simply create a new web application
and access it with user accounts.
We assume that OBEROn is already installed on a database [installation
instructions ]
and you have installed and configured a Java application server
(like Tomcat or WebLogic).
deploy the war into your application server; this will create a new
webapp folder named "oberon_sample":
Open the "oberon.properties" file and setup
the parameters to point to your OBEROn database; you can choose
the proper settings following the configuration
instructions
(case C).
Start the java application server and open the web
browser to access the application url:
http://<HOST>:<PORT>/oberon_sample
If you try to login with a username and password and
you didn't define that OBEROn user you will receive a message like
this:
"OBEROn Login for user '.......' FAILED:
#EXFW0002: User ....... does not exist.
On the other hand, if you have already defined the
user but not the menu, or if the user hasn't rights to access this
application you will get a page without any command:
This mean you have first to define the application
schema using the "Context Design" client.
[Open the "oberon.ini" file and set up the parameter to
point to the same OBEROn database: see the configuration
instructions
(case A or B)]
First of all you should create application users by
clicking on the "Add new User" menu button and
by compiling the form with the user data. This automatically will
give access to the application from the web-browser login page.
The users you have just created are added to the current
tab and you can see them also expanding the User node in the administration
object tree on the left.
As you saw above, access the application is not very
usefull until you don't have the ability to perform actions within
it. To define the possible actions that each user can execute inside
the application you must create a set of commands organized into
menus and submenus.
The menu structure is hierarchical as usual and derives from a starting
node called the application main menu. You can start creating this root
node by clicking on the "Add new Menu" button and
by compiling the relative form (your user must be enabled for menu
management access ).
The name of the main menu node must be set also in
the "web.xml" file inside the webapp/WEB-INF folder.
This file includes the main application settings and in particular
the "application_main_menu" that indicates the
webapp to load the specified menu structure when the user accesses
into the application.
Note: a web application can have a public section (where
a user accesses as anonymous) and a private section (where the user
has to insert its credential to be able to access). Both public
and private sections have a menu bar: inside the private section
the access to the menu-commands is based on the user identity, inside
the public section the menus are configured according to the "anonymous"
user grants. When a web user opens the web-site index page (generally
included in the public part) the application automatically logs
in to the OBEROn platform with the "anonymous_user" account;
so, you have to create this user inside the platform and declare
the anonymous_user_name and anonymous_user_password
into the web.xml file.
Starting from the main node you can define now the application menu
structure: for example you can add a LogOut command using the "Add
new Command" button (your user must be enabled for command
management access ).
The Commands are the terminal nodes of the menu tree
and represent the menu actions: in particular a command calls a
web url to perform the related action. A command can be included
into one or more menu structures.
You
can also define an application module and collect all related command
into a sub-menu. For example, you will create a new sub-menu named
"AppModule1" with single command inside named "DefineCustomer".
This command will open a web form to generate a new OBEROn object
instance (for example a company customer).
To add a command or a sub-menu to a parent menu, you
have to open the menu form (double click on the menu object from
the working tab or from the administration object tree on the left)
and connect the objects together by searching the command or sub-menu
in the "SubMenus / Commands" tab.
The same action can be repeated for the
sub-menu to add a child menu or a command and generate the entire
hierarchy.
After completed the menu structure, you
have to define the user access rights to each command, in other
words, you have to indicate the users that can show a given command
and so execute it. This association can be done by opening the command
form and adding the enabled users in the "Execute Rights"
tab.
In many cases it is not convenient to
directly associate a command to a user because the actions represented
by the command itself must be performed by multiple users. We can
then define a role/assignment (Add new Assignment button)
common to multiple users and enable the command for the given role.
This is also valid for all actions that can be done on the system
like object creation, validation, connection, etc.
For example the LogOut command is a basic action that
each user should be able to perform; in this case you can create
an assignment named "Observer" and associate all defined
users to it.
If you connect the assignment "Observer"
to the LogOut command then all users that have this role will be
able to see and execute the command.
Now you are ready to access the application
from a web-browser: simply login by using the username and password.
The user1 can see the Module1 and the
child command DefineCustomer because he has the direct access to
execute it. He can also see the LogOut command because of the indirect
access rights inherited from the Observer role.
On the other hand the user2 can see only
the LogOut command because he doesn't have access to the DefineCustomer
command.
If your web-application has a public area
and you would avoid the login for the guest users then you can create
a basic user with a public menu structure and set up the application
to automatically login with this user. Simply edit the web.xml
configuration file as seen above and set the anonymous_user_name
and anonymous_user_password parameters with the guest user account
credentials. To access the restricted area you can add a LogIn command
to the public menu structure with Href equal to "index.jsp?user="
(the "user" get parameter can be empty, but not null otherwise
you create a loop because the simple url "index.jsp"
automatically login with the guest user)
You can change the top banner or the menu style editing the images
and the style-sheet (style.css) inside the "menu_files"
folder.
Menus and commands can have icons (stored
into the DB). You can add them with the "Context Design"
client by selecting the image files from your local folder.
NOTE:
- The user menu structure is loaded only when the user login, so
if you make changes to it you have to re-login to see these modifications.
Web forms
The actual implementation of a form depends on the type of application
where it is used; in a web application you can create your own JSP
page or servlet to generate the HTML code based on the OBEROn form
definition. The oberon_sample application include the forms.jsp; it is an implementation
of form render engine. Including this file into your jsp pages you
have four static methods to perform the main form manipulation actions:
viewing / editing data |
|
|
|
|
createHTMLForm ( String actionPage , ObjectBase
obj_link, Form form , ApplicationRequest request )
|
|
|
composes and returns the HTML form filled with the object
or link field values; the parameters are:
- actionPage : is the form action page (usually
this page include the saveFormData method)
- obj_link : the object or the link (java object)
to edit/show (create new empty object instance if you want use
the form in order to create the object)
- form : is the OBEROn form object instance (normally
is cached to avoid continuous db accesses)
- request : is the ApplicationRequest derived from the HttpServletRequest request
|
|
saveFormData ( String forwardPage , ObjectBase obj_link
, Form form , ApplicationRequest request )
|
|
|
saves the form values; the parameters are:
- forwardPage : is the forward page
- obj_link : the object or the link (java object)
to edit
- form : is the OBEROn form object instance
- request : is the ApplicationRequest derived from the HttpServletRequest request |
|
searching objects |
|
|
|
createHTMLSearchForm ( String actionPage
, Form form , ApplicationRequest request )
|
|
|
composes and returns the HTML form representing
the search filters ; the parameters are:
- actionPage : is the form action page (usually
this page include the searchObjects method)
- form : is the OBEROn form object instance (normally
is cached to avoid continuous db accesses)
- request : is the ApplicationRequest derived from the HttpServletRequest request
|
|
searchObjects ( Form form , ApplicationRequest request )
|
|
|
performs the query applying the search filters ; the parameters
are:
- form : is the OBEROn form object instance
- request : is the ApplicationRequest derived from the HttpServletRequest request |
The forms.jsp page requires the javascript
part (forms.js) and the style-sheet (forms.css) to be employed.
You can see an example of its usage into the edit.jsp code.
First of all you have to retrieve the object ID from the request
and establish if you are using the form for edit or create a new
instance. When the ID is null you have to create a new java object
instance otherwise you can load the object values from the OBEROn
DB.
<%@include
file ="library.jsp"%>
<% |
|
// Get the object
id as input parameter
String sID = request.getParameter("id");
boolean bCreateNew;
boolean bClone = false;
ObjectObj object;
Framework framework = Application.getFramework(session);
if ( sID==null || sID.length()==0 || getInputParameter("create",request).equals("true"))
{ |
|
|
// Create a new
object
bCreateNew=true;
object = new ObjectObj();
// Remove the "Object"
from session to hide the object contextual menu
session.removeAttribute("Object"); |
|
} else { |
|
|
// Open the object
and read its properties
bCreateNew=false;
sID=sID.trim();
if ( getInputParameter("clone",request).equals("true")
) { bClone=true; }
object = ObjectObj.open(sID,framework);
// Add the "Object"
to session to show the object contextual menu
session.setAttribute("Object",object); |
|
} |
|
Next you can retrieve the form name from the request; this parameter
is mandatory in order to create a new object instance. You can avoid
to pass it only if you are using the form to edit an existing instance
and the object's class has an associated default form.
|
// Get the create/edit Form name
as input parameter
String sFormName = getInputParameter("form",request);
if ( sFormName.length()==0 ) { |
|
|
// When the form
is not passed as input parameter try to get it from the
object class
Class objclass = Class.open(object.getClassName(),framework,null);
sFormName=objclass.getDefaultForm(true); |
|
}
Form form = Form.open(sFormName,framework,null);
|
|
The previous parts are required for both
the createHTMLForm and saveFormData; you can choose to create two
jsp pages for the form presentation and the form action or include
both methods into the same page. In this case, first you have to
place the saveFormData and then the createHTMLForm. Infact, the
saveFormData can recognize if you are loading the page for the first
time or if you are loading it to perform the form action. If you
are creating a new object instance, the saveFormData result can
be the forwardPage URL with appended the new object ID in order
to jump to the object visualization/edit page (edit.jsp again but
with the object ID in the request).
|
// Save the object data or create
it
String sForwardPage = saveFormData( bCreateNew?"edit.jsp":"" , object , form , |
|
|
convertRequest(request)); |
|
if ( sForwardPage.length()>0 ) { |
|
|
//
A new object is succesfully created - go forward to the
object detail page
%>
<script language=javascript>document.location.href="<%= sForwardPage %>";</script>
<%
return; |
|
} |
|
Otherwise, if you are already in the visualization/edit
page the code execution can continue showing the form with object
values. The createHTMLForm returns the html code representing the
form filled with object values; you can directly put this code into
the html response. As we have included both methods into the same
page, the action page must be the edit.jsp page.
The HttpServletRequest must be converted to the ApplicationRequest
by public method convertRequest.
<%@include file ="forms.jsp" %>
<!--
Print the html form with object field values->
<BODY> |
|
<br>
<%= createHTMLForm( getRootPath(session)+applicationPath+"edit.jsp" , object , form , convertRequest(request)) %>
<br> |
</BODY>
</HTML> |
|
Multi-language management
Label translation is usually performend according to the user default language but it is also possible to retrieve the language from the http-request (the browser language): you just have to set the "use_browser_language"
option inside the web.xml file equals to "true".
When you define languages into OBEROn you should consider to use
the standard ISO 639 codes:
http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
The browser language codes are defined according to
this standard:
af |
Afrikaans |
sq |
Albanian |
ar-sa |
Arabic(Saudi Arabia) |
ar-iq |
Arabic(Iraq) |
ar-eg |
Arabic(Egypt) |
ar-ly |
Arabic(Libya) |
ar-dz |
Arabic(Algeria) |
ar-ma |
Arabic(Morocco) |
ar-tn |
Arabic(Tunisia) |
ar-om |
Arabic(Oman) |
ar-ye |
Arabic(Yemen) |
ar-sy |
Arabic(Syria) |
ar-jo |
Arabic(Jordan) |
ar-lb |
Arabic(Lebanon) |
ar-kw |
Arabic(Kuwait) |
ar-ae |
Arabic(U.A.E.) |
ar-bh |
Arabic(Bahrain) |
ar-qa |
Arabic(Qatar) |
eu |
Basque |
bg |
Bulgarian |
be |
Belarusian |
ca |
Catalan |
zh-tw |
Chinese(Taiwan) |
zh-cn |
Chinese(PRC) |
zh-hk |
Chinese(Hong Kong) |
zh-sg |
Chinese(Singapore) |
hr |
Croatian |
cs |
Czech |
da |
Danish |
nl |
Dutch(Standard) |
nl-be |
Dutch(Belgian) |
en |
English |
en-us |
English(United States) |
en-gb |
English(British) |
en-au |
English(Australian) |
en-ca |
English(Canadian) |
en-nz |
English(New Zealand) |
en-ie |
English(Ireland) |
en-za |
English(South Africa) |
en-jm |
English(Jamaica) |
en-ca |
English(Caribbean) |
en-bz |
English(Belize) |
en-tt |
English(Trinidad) |
et |
Estonian |
fo |
Faeroese |
fa |
Farsi |
fi |
Finnish |
fr |
French(Standard) |
fr-be |
French(Belgian) |
fr-ca |
French(Canadian) |
fr-ch |
French(Swiss) |
fr-lu |
French(Luxembourg) |
mk |
Macedonian (FYROM) |
gd |
Gaelic(Scots) |
de |
German(Standard) |
de-ch |
German(Swiss) |
de-at |
German(Austrian) |
de-lu |
German(Luxembourg) |
de-li |
German(Liechtenstein) |
el |
Greek |
he |
Hebrew |
hi |
Hindi |
hu |
Hungarian |
is |
Icelandic |
in |
Indonesian |
it |
Italian(Standard) |
it-ch |
Italian(Swiss) |
ja |
Japanese |
ko |
Korean |
ko |
Korean(Johab) |
lv |
Latvian |
lt |
Lithuanian |
ms |
Malaysian |
mt |
Maltese |
no |
Norwegian(Bokmal) |
no |
Norwegian(Nynorsk) |
pl |
Polish |
pt-br |
Portuguese(Brazil) |
pt |
Portuguese(Portugal) |
rm |
Rhaeto-Romanic |
ro |
Romanian |
ro-mo |
Romanian(Moldavia) |
ru |
Russian |
ru-mo |
Russian(Moldavia) |
sz |
Sami(Lappish) |
sr |
Serbian(Cyrillic) |
sr |
Serbian(Latin) |
sk |
Slovak |
sl |
Slovenian |
sb |
Sorbian |
es |
Spanish(Spain – Traditional Sort) |
es-mx |
Spanish(Mexican) |
es-gt |
Spanish(Guatemala) |
es-cr |
Spanish(Costa Rica) |
es-pa |
Spanish(Panama) |
es-do |
Spanish(Dominican Republic) |
es-ve |
Spanish(Venezuela) |
es-co |
Spanish(Colombia) |
es-pe |
Spanish(Peru) |
es-ar |
Spanish(Argentina) |
es-ec |
Spanish(Ecuador) |
es-c |
Spanish(Chile) |
es-uy |
Spanish(Uruguay) |
es-py |
Spanish(Paraguay) |
es-bo |
Spanish(Bolivia) |
es-sv |
Spanish(El Salvador) |
es-hn |
Spanish(Honduras) |
es-ni |
Spanish(Nicaragua) |
es-pr |
Spanish(Puerto Rico) |
sx |
Sutu |
sv |
Swedish |
sv-fi |
Swedish(Finland) |
th |
Thai |
ts |
Tsonga |
tn |
Tswana |
tr |
Turkish |
uk |
Ukrainian |
ur |
Urdu |
ve |
Venda |
vi |
Vietnamese |
xh |
Xhosa |
ji |
Yiddish |
zu |
Zulu |
If you choosed to employ the ISO codes for the OBEROn dictionary or if the "use_browser_language" option is set to false, you don't need a mapping. Otherwise, you have to add the mapping between the OBEROn dictionary languages and the browser languages inside the application main menu features:
Features "application_Languages" and
"browser_Languages" contain the lists of the OBEROn
dictionary languages and the respective browser languages separated
by comma. The language mapping must respect the order in both lists.
When the "use_browser_language" option is set to false,
the application uses the default user OBEROn language defined in
the user form, so if you login with the user1 or with the user2
you can see the difference when they have a different default language.
Differently, if "use_browser_language"
is true, you can change the application language only if you select
another language from your web browser options.
NOTE: If a label is not yet translated into
the OBEROn dictionary you can see the translation as soon as you
add it, but when you change the translation text you can't see the
effect until you reset the dictionary cache. For this purpose you
can call the "dictionary-reload.jsp" page from
the web-browser (e.g. http://<HOST>:<PORT>/oberon_sample/dictionary-reload.jsp)
|