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&lt;br&gt;
                  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 &lt;br&gt;. 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> &nbsp;${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.