Change Log for LPS 3.0
This document describes the past version changes in LPS. Please see the release notes for information regarding the current release.
- Changes in:
- Defects fixed in:
- LPS-2.2.1 is a maintenance release only. See Fixed Defects section for details.
- LPS no longer supports 1.3 JREs/JDKs.
- LPS requires container support for the 2.3 (or later) version of the servlet specification
- The provided fonts and components were moved from $LPS_HOME/WEB-INF/lps/{fonts,components} to $LPS_HOME/lps/{fonts,components}.
(The default include directories for the compiler were changed to match)
- The provided includes and assets were moved from $LPS_HOME/{assets,includes} to $LPS_HOME/lps/{assets,includes}.
- The provided administrator console moved to $LPS_HOME/lps/admin/console.lzx.
- The default location of the LPS caches and logs moved to $LPS_HOME/WEB-INF/lps/work
- The
?lzrecompile=true can be used to force a recompile when the lps.properties compMgrDependencyOption is set
to never.
- The LPS server statistics now display maximum request times for the 1, 5, and 15 minute periods.
- The default location of the LPS cache directories is now underneath the web application's WEB-INF directory.
- There are now separate hscrollbar and vscrollbar components that
can be used to minimize application size.
- Setting width (or height) to null unsets the width (or height).
- There is a new defaultRequestType lps configuration property (in
lps.properties) for controlling the what the LPS does with
urls that end in .lzx that don't have an lzt query string.
- There is a sample deployment configuration provided at WEB-INF/lps/config-deploy.
- The LPS server statistics now display maximum request times for the 1, 5, and 15 minute periods.
- Updated lzx.dtd verified for use with Eclipse
- LPS-2.1.2 is a maintenance release. See Fixed Defects section for details.
- LPS-2.1.1 is a maintenance release only. See Fixed Defects section for details.
- New component:
grid
- New license key format. Existing 2.0 license keys must be upgraded to 2.1 keys in
order for them to work with 2.1. Please contact
sales@laszlosystems.com.
- New components:
tree and slider
- New animation tutorial.
- Faster initial compile of applications that use components.
- The baseline and some character advances were modified in the
default (verity) fonts.
If you are porting an application from 2.0p to 2.0 that was laid out
pixel-accurately by hand,
you may need to re-make adjustments.
- The compilation cache is now optimized to avoid recompiles when
all that is needed is a re-encode (from gzip to uncompressed
or vice-versa).
- Developer packages now only include gzip encoded versions of LZX
files in the pre-populated cache. This will cause browsers which do not
support gzip encoding to compile sample code and will result in slower
startup times for the welcome application and other samples.
The LPS 2.0 Beta2 release also has a limited number of changes that are
incompatible
with the Beta1 release.
- Some components that were released in 2.0 Beta1 have been
renamed:
inputtextbox -> edittext
baselistcomponent -> baselist
baseformcomponent -> baseformitem
basedatacomponent -> basevaluecomponent
- The "valuedatapath" and "textdatapath" attributes introduced in
Beta1 have been removed; simply use "$path" if you want to specify a
different datapath for a component's value. For example:
<list>
<textlistitem datapath="mydata:/list/item" text="$path{ 'text()' }" value="$path{ '@value' }"/>
</list>
- There is a new "dataoption" attribute on baselist. You can optimize
list or combobox, but setting dataoption="lazy" for lazy replication of
list items, or dataoption="pooling" for pooling.
- The sections below describing changes in 2.0 and bugs fixed since
2.0B1 are now complete and accurate.
- See also the list of defects fixed since
1.0.3.
Laszlo Presentation Server 2.0 Beta 1 introduces
numerous new features, LZX language changes, and
LFC API changes. A limited number of these changes are incompatible
with previous releases.
- New features:
- The Laszlo Component Set
Laszlo Presentation Server 2.0 introduces the Laszlo (lz) component
set: combobox, edittext, scrollbar, menu, menuitem, tabs,
tabslider, radiobutton, radiogroup, checkbox, window, modaldialog,
alert, button, form, submit, style, and base classes. To get a
feel for what the components do and how to use them, click on the new
"Components" tab on the "Welcome"
page. These components support keyboard navigation. You can tab between
components, and use arrow keys within the components (e.g. within items
in a radio group or a list). There are visual focus brackets that shows
you where the focus is. Note: The Laszlo (lz) component set is
now the default component set. To get the redmond components, insert <include
href="redmond"/> into your application source.
- Krank Optimization
Laszlo Presentation Server 2.0 introduces a new feature,
called Krank, for optimizing the startup time of an
application. Krank allows you, without changing the source code, to
construct an application that doesn't need to run any initialization
code when it starts. Kranking an application thus can often
result in a dramatic improvement in user-perceived startup time.
Read more about the Krank feature here.
- LFC LzTrack service (see reference guide for documentation)
- LFC Data API features:
- Support for http POST.
- XPath attribute predicates [@foo] and
[@foo='bar'].
- XPath position() and last() operators.
- Selection of multiple intermediate nodes (e.g.
*/*/*
)
$path bindings for datapath. A node
attribute can be bound directly to a data attribute using this syntax:
<attribute name="myattr" value="$path{ somexpath }">
where somexpath can be a literal xpath or the value of a variable to
resolved at init time. This is a two-way binding between the attribute
and the data. Setting the attribute by other means will update the
data.
- New LFC classes for runtime XML data access: 3 new
classes: LzDataNode (abstract), LzDataElement and LzDataText
The APIs for these classes are currently undocumented, but here are the
most useful parts of that API:
LzDataNode.ownerDocument
LzDataNode.parentNode
LzDataNode.getPreviousSibling
LzDataNode.getNextSibling
LzDataText.setData
LzDataText.data
LzDataElement.childNodes
LzDataElement.insertBefore
LzDataElement.replaceChild
LzDataElement.removeChild
LzDataElement.appendChild
LzDataElement.cloneNode
LzDataElement.getAttr
LzDataElement.setAttr
LzDataElement.setChildNodes
A datapointer's .p slot points to an LzDataNode, or a subclass thereof,
and that attribute can be set directly as well.
- User-defined text tags
The attribute element can be used to define tags
that contain text or XHTML. (Tags that extend text and inputtext
continue to accept XHTML and plain text, respectively.)
- Optimized inputtext views
Optimized
inputtext views are more responsive to keyboard
input at large sizes and on slow machines.
- Documentation
This release includes the beginning of the Laszlo Developer's Guide. Check the Developer Zone of
the Laszlo web site for updates and forthcoming chapters.
There are shiny new examples for:
- LzModeManager
- XML Data (nee httpdata.lzx)
- Server administration (linked from the welcome page):
- There is a new LPS administrative console application (see
the welcome application Administration section).
?lzt=cacheinfo&details=1 server cache
statistics
- Improved
?lzt=stat server load statistics
- LZX language changes:
x, y, width, height now expect ${...}
syntax for expressions, old syntax is deprecated and warnings are given
- the recommended way to test for undefined attributes is to
declare them in your class with an initial value of null. For example,
<attribute
name="foo" value="null
/>
then later you can write:
if (this.foo) ....
This is faster and easier to read than: if (typeof(this.foo) ==
"undefined")
...
- LFC changes:
- Inputtext: new APIs
are documented in the reference
- getSelectionPosition()
- getSelectionSize()
- setSelection()
- Node
- initialize -> construct (there will be a warning for this,
but it may not be in yet)
- thaw -> createChildren
- deleteNode -> destroy
deleteNode is deprecated
- searchimmediateParents ->searchParents
searchimmediateParents deprecated
- setProp has been officially deprecated
use setAttribute instead
- retrieveData -> updateData (retrieveData deprecated), also
renamed on datapath
- getXPath is deprecated, use XpathQuery instead
- Services
- The LzAudio service is deprecated. Use the audio APIs on
LzView instead.
- View
- LzView now sports two shiny new attributes "xoffset" and
"yoffset", and a method called getBounds which returns the bounds of
the view when it has been rotated. There's also a couple of
bounds-based layouts in components/utils/layouts. getBounds() can be
used in constraints.
- layout attribute: now has JavaScript support for setting at
run-time. Also classes may override all or part of the attribute. (You
can make the layout go away with class:none)
Tag syntax:
<view
layout="axis:x; spacing:20">
<view bgcolor="red"
width="20" height="20"/>
<view bgcolor="red"
width="20" height="20"/>
<view bgcolor="red"
width="20" height="20" />
</view>
JavaScript syntax:
myview.setLayout(
{class: 'wrappinglayout, axis: 'y' } )
myview.setAttribute(
"layout" , {class: 'wrappinglayout, axis: 'y' } );
- new methods: sendbehind, sendinfront (documented in refrence)
- new property: framesloadratio (documented in refrence)
- loadperc, renamed loadratio
- new updateResourceSize method
Since views which use a multi-frame resource base their size on the
size of the resource's first frame, the LFC may incorrectly measure the
intended size of a resource. This method can be called at any time to
recalcuate the resource size.
- New behavior for views with a constraint on their size
In previous releases, a view that had a constraint on its size would be
sized to its contents until the constraint was applied. Now, the view
will not have any size until the constraint is applied. This changes
the behavior of some apps -- mostly due to erroneous code that worked
in previous releases.
- Different time for data application
In previous releases, a view would receive its data whenever that data
was present. This meant that data could be received by a view before
init time, as early as construct time. Now a view will not receive its
data until after it inits.
- ModeManager plays better with LzFocus
- Components changes:
- Layouts
- simplelayout and wrapping layout now have "inset" param,
to create left or top margin
- wrappinglayout was included in the build, but not
documented. Now it is.
Changed "animated" parameter -> "duration" (default is 0, which
causes it to not animate) horiz_spacing and vert_spacing changed to x
and yspacing. It also works better now.
- The Laszlo component set doesn't use the
label
attribute for text content. Use the text attribute
instead.
- The LZ component set name for a radio button is
<radiobutton>
instead of <radio>.
- The default font has changed. The old default font can be
included by using
<font name="yourfont"
src="lztahoe8.ttf"/> If you want your entire application to
use this font, you can redefine the canvas's font like <canvas
font="yourfont"> at the top of your LZX program.
- Each included font takes roughly 30% more space in an compiled
binary
- Deprecated APIs
- LzNode
- initialize
- thaw
- deleteNode
- searchimmediateParents
- setProp
- retrieveData
- getXPath
- LzText
- LzAnimatorGroup
- LzDatapointer
- LzDataset
- getStatusCode
- lockFromUpdate
- unlockFromUpdate
- setURL
- global
- There are individual properties for specifying http back-end
timeouts. See lps.properties.
- The default timeout for back end http requests is now 5 seconds.
(In previous releases the default timeout was infinite.)
- LPS statistics collection can be controlled via values in the
lps.properties file.
- LPS statistics collection of unique urls now strips the query
string from the url.
- LZX source for redmond components refactored and made more
readable.
- New Redmond horizontal scroll bar
- Server statistics request
You can now pass datasets for request headers and document style calls instead
of XML strings. Note that datasets aren't namespace aware so, for the time
being, using datasets is not reccomended.
You can now access response headers by setting a local dataset in the SOAP object.
For example:
<soap requestheaders="dset1" responseheaders="dset2">
<remotecall funcname="docstylefunc">
<param value="dset3" />
</remotecall>
</soap>
The SOAP scalability issues have been addressed.
- Under load, single long back-end requests no longer lock the entire media or data cache.
- LZX Reference now includes grid, basegrid, and related components.
- Two defects in lzo serving were fixed. The first could cause lzo serving to use unnecessary server cpu. The second was a race condition that could cause the server to introduce corruption into the lzo file.
- Error message no longer thrown for TTF fonts missing TTF name table.
- Compiler now correctly recognizes LZX files named with numbers as their first
character in the filename.
- LPS Error log now includes WARN messages if cache directories are not writable.
- Windows installer includes more information when it fails do detect an installed
JDK
- LPS is now compatible with ATG Dynamo
- A resource whose name begins with a number, such as <resource name="2c" src="..."/>, cannot be referenced. An attempt to refer to it, such as <view resource="2c"/>, will instead attempt to import the file named "2c".
- When the compiler issues warnings for missing file and resource errors, they
may display the absolute pathname of the file on disk, rather than pathnames
relative to the base application URL, as other compiler warnings do.
- A minor optimization was made to the way in which constraints are
resolved that has changed the order in which they are applied. This normally
shouldn't matter, but in some edge cases (especially deeply circular
constraints and program errors).
- The LFC's xpath parser does not properly interpret whitespace
between /'s and []'s.
-
>If you set a font is set as an attribute of the canvas and any of the redmond
components are used, the following compiler error will be generated:
Error: ../WEB-INF/lps/components/redmond/redmondcombobox.lzx:119:55: Can't find font nicefont ; compilation aborted
Workaround: set the font attribute on all of the top-level views or explicitly
include the redmond component or the whole library, for example:
<include href="/redmond/library.lzx"/>
or
<include href="/redmond/redmondbutton.lzx"/>
- Multi-line string literals (or an unclosed string literal) are errors
but the compiler does not generate a warning for them and may generate incorrect
error locations as a result.
- Fixed that thing that was busted last time.
- A view with pixellock="true" will stop updating its size to the size
of its contents, even if it doesn't have an explicit width and height.
- Long animators (with a duration of about eight seconds ) may not end at the
coorect value.
- The reference lists 'resizable' as a view attribute, but this attribute is unused.
-
If you are deploying the LPS inside Tomcat (or other servlet
containers) running against j2sdk (or j2re) 1.4.2, you will need to
make sure the LPS version of xalan.jar is used. For Tomcat you
can copy $LPS_HOME/WEB-INF/lib/xalan.jar to $TOMCAT_HOME/common/endorsed.
See you servlet container documentation specific details here.
- A mistake with the capitalization of attribute or event names may lead to compiler errors which are hard to pinpoint. XML is casensitive, be sure to check the proper se-case of attribute names (they will all be lowercase in the library lzx components).
-
Error messages of the form:
contactslib.lzx:320:44: element "tagname" from namespace "http://www.laszlosystems.com/2003/05/lzx" not allowed in this context
mean simply that that "tagname" is not a known tag name. The bits about the
namespace and "in this context" can be ignored.
- No compiler warning given when a resource is undefined. So for example
this code will not warn that the resource identifier "fake" is undeclared.
<view resource="fake"/>
- Testing for undefined properties using 'typeof(o.p) == "undefined"' will
generate a warning in the debugger. The warning can be avoided if necessary by
using 'typeof(o[""+(p)]) == "undefined"'. If 'p' is known at compile time, the
string conversion forced by '""+' can be omitted. Best practice is to tolerate
the warning, which will not occur in a future release, rather than obfuscate
your code in this fashion.
- lztabslider panels display "clickable" cursor when the area is not designated as clickable
- Warnings about tag 0x19 are harmless and can be ignored.
- The font "italic lztahoe8" is not compiled into the application swf file by
default. This
means that if you try to use italic style text in Javascript code, it will be
invisible. Workaround is to manually include the font using a <font> tag in
the app, or to include static text in the XML which uses italic style.
- Changing motion attribute on an animatorgroup has no effect.
- Constraining an attribute to one or more values which are themselves
constraints may produce debugger warnings about undefined references, even
though this is perfectly valid. Ignore these warnings.
- There may be cases where calls to Debug.write don't result in debugger
output, even though the method is being called. This is known to happen for the
onaddsubview event and the addSubview methods when they are called by a
replicated node that is a class which has children.
- Too many consecutive fonts will cause the compiler to emit bad code. As a
workkaround, use fewer fonts or intersperse an innocuous '<script>' block.
- Laszlo applications may misrender a PNG with an alpha channel.
- subviews containing subviews which are added to a class which has defaultplacement attribute set do not trigger onaddsubview or addsubview to get called
- Can't restart an animator onstop
- Calling stop() on an animator which isn't running will cause problems. The animator destroy() method calls stop, so animators in states may not work correctly.
- Layouts, constraints, and LzView.setAttributeRelative don't currently
work properly with views that are rotated.
- When data is imported the runtime, only xml element nodes are treated
as children of a given data node. All text nodes are coalesced through
concatenation and can be referred to as the text() property of the node. When
the node is serialized, all of the text will be written as the last (text)
element of the node.
- For compatibility with the DR release, http headers come back with
every data response by default. This allows for the client to introspect header
information. Given that this is usually not necessary, the default results in
extra data traffic between the client and the LPS. The response headers can be
turned off by using the dataset attribute getresponseheaders="false"
- Remaking a request of a dataset which is mapped to a view replication
which does not use pooling results in a brief display problem where the views
from both the old request and the new request are visible at the same time. Use
the pooling option to work around this if possible, or hide the replicated
views when resubmitting the request.
- >Datapaths which match multiple nodes can only do so on the last node
in their xpath. Always map the multiple match to the view which replicates.
- selectParent will select bogus nodes that are not inside the dataset
which a datapointer is pointing to, and it will return true (indiciating that
it successfully selected a parent node) in this case.
- Although calling setFromPointer() on a datapath will work when the
call is made, the datapath may not properly process further changes to the
underlying data after the call is made. If the datapath needs to update as the
data changes, compose an xpath that points to the new data and call the
datapath's setXPath routine with that value.
- Once applied, a $path constraint inside a state will not be removed when the state is removed.
- Calling super.otherMethod() from inside thisMethod won't work as
expected. This generally isn't best practice, but it is spec'ed to work in the
ECMAScript standard. Because of this bug, super should only be used when
calling the superclass version of the same method.
- The getVolume call doesn't work properly
- The LFC doesn't properly interpret the width and height of rotated
views -- transformations to their width and height happen in their parents (non-
rotated) coordinate system. To manipulate the width and height of a rotated
view, create an extra layer of hierarchy and embed the resizing view inside the
rotated one.
- The deleteNode() method of LzNode (and the overrides by the subclasses
of LzNode, such as LzView) are incomplete and do not free all the memory used
by the node. When possible, reuse is preferable to delete/new because of this
problem and because node instantiation is slow.
- Saving an XML file from NotePad or Visual Studio .NET with UTF-8 encoding may
insert a "byte order mark" at the beginning of the text. LPS will
report this error:
Error: broken.lzx:1:1: Content is not allowed in prolog.
- In previous releases running against Sun JVM 1.4 or greater,
because of a JVM bug, the server can throw a StackOverFlow Exception
when validating the LZX code for certain applications. When this
occurs, in 1.0.3, the server will generate a compiler warning, disable
validation for the compilation, and continue to compile the
application.
- The LPS now properly flushes http requests to the back-end. This
will result in fewer warnings in the detailed lps log about
RecoverableHttpExceptions.
- Numerous typographical errors in the comments in the default
lps.properties were fixed.
- Individual back-end requests can no longer hang the server cache.
- The request toggles in lps.properties now work correctly.
- Improved client performance
- Bloch got married.
- iPaq compatibility restored.
- Redmond window has visible non-focus state.
- Combobox and menus can now be used in clipped views.
- Checkbox can be used in constraints.
© Copyright 2002-2004 Laszlo Systems, Inc. All rights reserved. Unauthorized use, duplication or distribution is strictly prohibited.