|
|
|
|
03 December, 2000. It
is now possible to map multiple URI’s to the same UDM.
This is achieved via a URI-to-UDM map, which can managed
via the “edit URI-to-UDM map” menu item available in
the zDE under site services. When a URI request is
received, the generated site looks for an entry for that
URI in this map, and if one is found, uses the
corresponding UDM. If one is not found, it assumes the
usual scheme that the URI name maps directly to the UDM
name.
|
| |
Note that the URI entry in this map must be absolute,
not relative. For example, if have a site named
suppliers in which you want the <URL
http://zerocode.com:2432/zcSite/suppliers/allSuppliers.html>
to map to the auto UDM auto/list/supplier, then you must
add the URI /allSuppliers.html (note the leading slash!) to this map.
|
| |
|
|
|
02 December, 2000. The zDE
database schema has been modified to include expiry
date and a default login validity duration in the
Customer table, and expiry date in the login table.
|
| |
|
|
|
28
November, 2000. We
now support multiple meta-template families for HTML
generation. On each zDE install, the default
meta-template family will be copied into the metaTemplates/standard directory in all sites, and another sample
family with a different look and feel will be copied
into the metaTemplates/sample directory. The site designer can create her own
families as subdirectories of the metaTemplates
directory, but may not modify the standard family. |
| |
The list of available meta-template families is displayed in
a dropdown list in the standard UDM creation page. A
similar dropdown is displayed when custom HTML is to be
regenerated. |
| |
|
 |
27
November, 2000.
The JavaScript paging ribbon is now incorporated into the
standard and custom UDMs, so they look a little
prettier. |
|
|
 |
25
November, 2000. PagingAction
is no longer used, so it is now removed from the
meta-templates. Sorting on multiple attributes is now supported.
See the change log for an example of how to use it in
URLs. The search meta-template is modified to include
the ability to sort the search results on multiple keys. |
|
|
 |
21
November, 2000. Several
optimizations have been put in to speed up the run-time
performance. |
|
|
 |
20 November, 2000. Owing
to some optimization-related changes in the retrieval
algorithm, the customization document is somewhat out of
date. Will be fixed soon. The install script removes references to
searchAction. From now on, searchAction will only be
used in conjunction with the search page. Money
fields are now correctly validated in add UDMs, but this
might mean that these UDMs will have to be regenerated
in existing sites. |
|
|
 |
12 November, 2000. The zDE user can now edit the
response UDM associated with a given UDM, and specify
the parameters that should be passed to the response
UDM. Consequently, there is no need to edit
responseMap.xml any more. For this reason, the config
directory of a site is now shown only to those zDE users
that have full access to the site. Users that have
modify or view access will not be shown the config
directory. |
|
|
 |
10 November, 2000. We now have much better support
for expressions, with several built-in functions. The
expression help file and the change log should explain
this. |
|
|
 |
31 October, 2000. Modified the database access
mechanism to use precompiled SQL for most retrievals,
with the exception of the search UDM, where we have to
build the where clause dynamically anyway. |
|
Caveat: Because
of the precompiled SQL, the generated application works
better with VARCHAR fields in the database instead of
CHAR. This is because Oracle automatically pads CHAR
fields with blanks to extend to the full field length,
so that the JDBC driver (which does not do such padding)
fails to retrieve matching records when unpadded strings
are provided as input. |
|
Added
the ability to use the where__clause__nn parameter. |
|
|
 |
27 October, 2000. The default main page for all
generated sites is now named index.html. Earlier, it
used to be index.html for login-enabled sites, and
homePage.html for login-less sites. For login-enabled
sites we still have homePage.html acting as the main
frame container, but for login-less sites we don’t
have homePage.html any more. |
|
UDMs are now cached in the zDE, to speed up loading. |
|
|
 |
26 October, 2000. Created a custom UDM for zDE’s
main site list. This allows its columns to be sorted. |
|
The conduits are now doctored so that when
retrieving records, the list is sorted on the first
visible column, by default. |
|
|
 |
25 October, 2000. Restructured the TreeRetriever
for faster behavior on sorted lists. The algorithm now
retrieves vector nodes in two passes. In the first pass
of a sorted retrieval, it retrieves only the attributes
of the vector node (no non-attribute children), as well
as the sort key (if it is a non-attribute child). It
then sorts the list, limits it to just what is visible,
and then performs the second pass to retrieve only those
non-attribute descendants that are visible in the page.
In an unsorted retrieval, it simply retrieves the
records in the visible window directly from the store.
This speeds up the sort greatly. |
|
|
 |
22 October, 2000. |
|
 |
Expressions
are now supported. To use them, choose an expression as
the data port for a new node. |
|
 |
Customizing zeroCode is now easier. There is now a document
describing this. |
|
 |
You can now download an entire subtree of the web site. In
the file manager, you can choose one or more files and
then click ‘download’ to download a.tgz file containing the chosen files. If you don’t
check any files when you click ‘download’, you will
download the entire current directory. |
|
|
 |
15 October, 2000. Added
simplified template expansion for non-UDM-based HTML
pages. This enhancement is intended primarily for
serving up semi-dynamic content pages, and works as
follows. Suppose the user requests an HTML page at the
URI /zcSite/mySite/content/showme.html, and suppose that the HTML file exists but there
is no corresponding UDM file. The handler then looks for
a file named variables.xml in the same directory as the HTML file (typically, the
directory webFiles/templates/content), extracts variable definitions from that file,
uses them to substitute any FreeMarker variable
references within the template file showme.html, and then serves up the result to the requesting
user. This enables us to maintain all site- or subsite-global
definitions (e.g., the webmaster’s e-mail, the web
site address or contact information) in a single file,
instead of having to propagate changes to lots of HTML
files. Note that each subdirectory of the web site can
have its own variables.xml file. For example, we can create a variables.xml file that defines three variables whose names are
email, website and contact_info looks like this:
<?xml version="1.0"?>
<variables>
<variable name="email">m.a.sridhar@zerocode.com</variable>
<variable name="website">www.zerocode.com</variable>
<variable name="contact_info">
5201 Great America Pkwy #356<br>
Santa Clara, CA 95054
</variable>
</variables>
|
|
|
|
We can then refer to ${email} or ${website} in
the template file showme.html, instead of hard-coding these values into the HTML.
Notice, in this file, that variables can have
multi-line values (as does contact_info). Notice also that variable values can have embedded
HTML markup, as long as the tag symbols are quoted
properly. In the above example, the tag <br>is represented as <br>.
In general, however, embedding HTML markup in
variable files is not a good idea because it violates
separation between data and markup.
|
|
|
|
Two other notes about templates: |
|
1.
|
All the FreeMarker special functions (described
below in this document) are available for use in such
semi-dynamic pages. Thus, for example, you can extract
substrings or match regular expressions against variables
obtained from a variables.xml file. |
|
2.
|
These templates support the FreeMarker include tag, as do the templates used against UDMs. So, for
example, we can use a tag <include “header.html”> to cause FreeMarker to include the file header.html.
This enables us, for example, to create standard header
and footer files that can be used to enforce a uniform
look and feel. See the FreeMarker documentation available
at the URL http://freemarker.sourceforge.net
for more information on including template files. |
|
|
 |
11 October, 2000. Discovered the reason why so many
jre zombies were being created on many of the Linux
servers: it is because the logrotate cron job sends a
SIGHUP signal to all apache processes. The remedy: Make
sure you remove file /etc/logrotate.d/apache. Log
rotation is now provided for in the ZeroCode apache
configuration files, so there is no need for Linux’s
logrotate to be used. |
|
|
 |
10 October, 2000. The new algorithm for path
generation causes a noticeable slowdown when a custom
UDM is first created on a site and a child is added to
the root, because it takes a while to compute the path
matrix. But the response is faster on subsequent
requests. |
|
|
 |
03 October, 2000. The custom meta-template now
supports paging and sorting. Paging is included only for
the very first vector node in the UDM, where ‘first’
is determined in top-to-bottom, left-to-right order.
This support is automatic for newly generated sites. For
existing sites, the two meta-template files customTemplate.html and customTemplateFunctions.html
must be manually copied from the core
meta-templates directory into the site’s
meta-templates directory, and the custom UDM’s HTML
file must be regenerated. |
|
|
 |
29 September, 2000. Fixed some rather serious bugs in
the conduit objects. All target sites must now
regenerate their Java objects. |
|
|
 |
27 September, 2000. “Extended types” are now
supported. An extended type is simply a primitive data
type (typically a String or a decimal number) with an
extended meaning; currently supported extended types are
money (extended from decimal), US phone number and US
zip code (extended from String). The zDE node editing
pages now allow the user to set a node’s extended
type. Any existing site that needs these features must
have its meta-templates updated and its pages
regenerated. |
|
|
 |
27 September, 2000. “Non-transient” session
variables are now supported. There are now two kinds of
session variables: transient and non-transient. A
transient session variable is destroyed when the
user’s browser is closed, regardless of the
variable’s expiry time. By contrast, a non-transient
session variable lives for its entire expiry time, even
if the browser is closed. Transient session variables
are useful for tracking login sessions, while
non-transient session variables are useful for
personalization. At the implementation level, the
zeroCode application uses a single cookie to track all
transient session variables; in addition, it uses one
cookie for each non-transient session variable. |
|
|
 |
14 September, 2000. When a user self-registers for
use of zDE, the defaults are a maximum of 3 concurrent
sessions and a maximum of 5 sites allowed. |
|
|
 |
12 September, 2000. The response URI can now take
parameters. These parameters are substituted after
the request UDM’s action is carried out; Thus, for
example, you can make the response URI for an auto/add
UDM be the view UDM showing the newly-added record.
Furthermore, the servlet now re-reads the response map
if its data is out of date, so there is no need to
restart the server if you changed the response map. |
|
|
 |
Note about step 4 in adding new nodes to custom UDMs: You can
use a literal value, a session variable designator, a
UDM parameter or a node id in the boxes. The system is
careful to include the necessary quotes around the
values where necessary, so you do not include quotes
when you type your values. Here are some examples (note
the absence of quotes in all cases): |
|
|
|
|
Kind |
Type |
Example
value |
|
Literal
value |
Integer |
14 |
|
String |
Timbuktu |
|
String |
Joe’s car |
|
Value
from another node |
All |
?14? |
|
Value of UDM parameter |
All |
?userName? |
|
|
|
|
These examples also apply to the “additional
value” boxes that appear in the last step of relator
addition, and those in the predicate creation process.
One word of caution, however: If you use a reference to
a node id as a term in a predicate, you are tying the
predicate to a particular UDM, so the predicate is no
longer reusable. |
|
|
 |
12 September, 2000. The JavaScript validation code
now includes support for money fields. Existing sites
must use the new version of the file
javascript/validate.js, otherwise there will be JavaScript errors. This new
version is automatically copied over by the migrateSite
script (see below). |
|
|
|
Added more support for string manipulation in FreeMarker
templates: |
|
|
String length determination: <assign
n = string_lib.length (s)>
assigns to n the length of string s. |
|
|
String splitting (to be described) |
|
|
Substring extraction: <assign s =
string_lib.substring (t, “2”,
“4”)> assigns to s the 2-character substring of t
beginning at position 2. (The last parameter is the
index of the position immediately after the end of the
substring sought.) |
|
|
String searching: <assign index =
string_lib.index (s, “zz”,”3”)> assigns to index
the (left end of the) leftmost occurrence, at or after index
3, of “zz” in s. Similarly, <assign index = string_lib.lastIndex (s, “zz”)>
assigns to index the (left end of the) last occurrence of “zz” in
s. Both functions return nothing if the substring is not
found. Thus, for example, |
|
|
<if
string_lib.index (“xx”,
“y”)>Yes<else>No</if> |
|
|
produces |
|
|
No |
|
|
 |
4 September, 2000.
The zDE install script now requires the name of an SMTP
server to use. This is because the zDE self-registration
page now e-mails the password to the registrant. So the
zDE configuration file now includes the name of the SMTP
server. |
|
|
 |
31 August, 2000. The zDE database schema has
changed significantly. The schema is in the files ZeroCode/udmBuilder/testSchemas/zde.dm1
(ER/Studio schema) and ZeroCode/udmBuilder/testSchemas/zde.sql (SQL for table creation). To assist in
initializing the zDE database, there is now a script
file initZdeAdmin.sql available in the same directory. After creating the
new zDE schema, the latter can be used to start things
off. Note, however, that some tables – specifically, Host, Database_engine, and Site – need to be manually populated via the zDE
administration site. Also, users will have to
self-register to use zDE. |
|
|
 |
28 August, 2000. A minor change was made to the
UDM file format, to accommodate editing them via other
XML editors. This means that all existing UDM files must
be modified to accommodate this change. The change is
the following: |
|
|
|
| Change
all occurrences of the string |
To
the string |
| :description> |
.description> |
| :sessionParams> |
.sessionParams> |
| :osParams> |
.osParams> |
|
|
|
|
This can be accomplished via the Unix script migrateUdmFiles in the ZeroCode/udmBuilder/bin
directory. For example, to migrate the files in the
site bar owned by user foo, Invoke the script like this:
~/ZeroCode/udmBuilder/bin/migrateSite
~/ZeroCode/testSites/foo/bar |
|
|
 |
28 August, 2000. The system has been upgraded to
work with non-integer primary keys. Moreover, we can now
use any name for the primary key: the restriction that
it be called ‘id’ has been removed. Because of this
change, the homepage UDM for existing sites must be
regenerated. Otherwise logins will fail with an SQL
error. |
|
This change includes an enhancement: in the generated site,
each FreeMarker list element (corresponding to a vector
node) includes the magic variable zc__rank__ containing the rank of the current element in the
list, or equivalently, the iteration number. For
example, consider the following code in an HTML
template: |
|
<list Book.authors as e1> ${e1.zc__rank__}</list> |
|
If
the vector Book.authors has 5 elements in it, the above code will
produce the numbers 0, 1, 2, 3, 4. |
|
Note that the zDE admin database schema has changed
significantly, as of August 20th. The
database must be recreated and re-populated. |
|
|
 |
28 May, 2000. The
run-time FreeMarker template mechanism includes several
new functions: |
|
|
|
Regular expression matching, via string_lib.re_match. This
function takes two arguments, a string and a regular
expression against which to match it. The function
returns the list of matching substrings on success, and
a null scalar on failure.
Example:
<if
string_lib.re_match (date, “Sunday”)>The date
matches Sunday</if> |
|
|
|
|
|
String
replacement, via string_lib.replace. This function takes
three parameters: the target string, the substring in
the target string to be replaced, and the replacement
string. It returns a string whose value is the target
string with the leftmost occurrence replaced.
Example:
<assign
newString = string_lib.replace (oldString, “hello”,
“howdy”)>
replaces the first occurrence of hello in oldString with
howdy and assigns the result to newString. |
|
|
|
|
 |
Integer comparison, via integer_lib.compare. This function takes
three parameters: a string containing an integer (the
first parameter for comparison), a string containing the
comparison operator (any one of the six standard
relational operators), and a string containing the
second integer. The function returns a non-null scalar
if the comparison succeeds, and a null scalar if not.
Example: <if
integer_lib.compare (i, “<”, “30”)>${i} is
less than 30.</if> |
|
|
|
|
|
|
 |
Integer arithmetic, via integer_lib.op. This is similar to the
comparison function, except that it is used for
arithmetic. Its second parameter can be any one of the
five operators “+”, “-”, “*”, “/” and
“%”. It returns a string containing the integer
value of the result. |
|
|
|
|
|
As an example, you can write the following FreeMarker code
to get every third row in red:
<assign count = “0”>
<table>
<list myList as element>
<tr>
<td <if integer_lib.compare (integer_lib.op (count,
“%”,”3”), “==”, “0”)>
style=”background-color: red”
</if>
>
</td>
</tr>
<assign count=integer_lib.op(count, “+”, “1”)>
</list>
</table> |
|
|
|
Note that all arguments to FreeMarker methods must be
strings, although the methods themselves can interpret
the values as being of other types. That is why even the
literal integers in the above example are in quotes. |
|
|