WebObjects Release Notes  Copyright 1998-2002 by Apple Computer, Inc. All Rights Reserved.

 

WebObjects 5.1 Release Notes

Last Updated January 2002

This document lists those problems known to exist in WebObjects 5.1. For late breaking, up to date news on the web, please refer to the WebObjects documentation at http://developer.apple.com/techpubs/webobjects and the Technical Notes available at http://developer.apple.com/technotes/index.html.



Using JDBC With WebObjects 5.1

The best source of driver information is Sun's website: http://industry.java.sun.com/products/jdbc/drivers/

Only JDBC 2.0 compatible drivers work with the WebObjects 5.1 runtime regardless of platform. The database vendor typically provides the JDBC driver in the form of a jar or zip file.

The JDBC driver must be installed in a place where the Java VM can find it. The simplest procedure is to add the JDBC driver jar (or zip) file to the Java VM's "extensions" directory. On Mac OS X, this directory is always /Library/Java/Home/lib/ext/. On Windows 2000, this directory would be something like C:\jdk1.3\jre\lib\ext\ but the exact details depend on where you installed the JDK 1.3 on your machine.

If you prefer, you can instead add the JDBC driver to your CLASSPATH, either explicitly listing the jar file or exploding the jar into a directory that is on the CLASSPATH.

When doing development on Windows 2000, the situation is somewhat more complicated. The WebObjects 5.1 runtime uses a Java 2 VM and requires a JDK 1.3 compatible JDBC driver just like Mac OS X and other platforms. However, EOModeler uses the Java Bridge which supports only JDK 1.1 on Windows and therefore requires a JDK 1.1 compatible driver. Consequently, to develop and test on Windows 2000, you will need two versions of a particular JDBC driver: one that is JDK 1.3 compatible for the WebObjects 5.1 runtime, and another that is JDK 1.1 compatible for use by EOModeler and the Java Bridge.

To use a JDBC 1.1 driver with EOModeler on Windows 2000, you should add it to the JavaConfig.plist. Let's call it "driver11.jar". If your WebObjects installation is not in C:/Apple, substitute the appropriate path below. We use the Unix notation of "/" for the directory separator.

  1. login as an administrator
  2. copy driver11.jar to C:/Apple/Library/Java/
  3. Edit the file C:/Apple/Library/Java/JavaConfig.plist
  4. Add $NEXT_ROOT/Library/Java/driver11.jar to the entry for the "DefaultClasspath". Items in the list should be separated by a semicolon ";". Use the term "$NEXT_ROOT" literaly, following the pattern of the other entries.
Note that on Mac OS X, the Java Bridge supports the Java 2 VM so the JDK 1.3 compatible driver is used for both EOModeler and the WebObjects 5.1 runtime. If Windows is used only as a deployment platform, then the JDK 1.1 compatible driver is not needed.

Database Adaptors

Reference 2520093
Problem Corrupted JDBC type information is not detected gracefully.
Description The JDBC type information is cached in the EOModel file as part of the connection dictionary. It can become corrupted if a user incorrectly edits the connection dictionary in EOModeler.
Workaround   Delete the jdbc2Info entry from the model's connection dictionary. The adaptor will refetch the JDBC info when it needs it.

Reference 2526957
Problem Trailing spaces are not always trimmed from CHAR attributes.
Description A database column of type CHAR holds a string value that is right-padded with spaces to the width of the column. String values in Enterprise Objects, however, normally do not have trailing spaces. An attribute in an EOModel that maps to a CHAR column should have a "Value Type" of "c" to indicate that the JDBC Adaptor should trim trailing spaces when fetching values for that attribute. If the Value Type is blank, then no trimming will occur. Attributes mapping to VARCHAR columns are never trimmed.
Workaround   Set the attribute's Value Type to "c".

Reference 2562635
Problem The JDBC adaptor does not support the use of Oracle REF CURSOR or custom types in stored procedures.
Description The JDBC adaptor does not handle custom types or REF CURSOR. A proprietary datatype, REF CURSOR denotes a variable that points to a query work area rather than store an item.
If one were to create a new EOStoredProcedure based on a stored procedure that takes a REF CURSOR as input, one might encounter exceptions like the following:
PLS-00306: wrong number or types of arguments in call to 'FETCH_MOVIES_ALL'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

The reason is that the JDBC adaptor is trying to pass attribute values where the stored procedure expects a REF CURSOR.

Workaround   To make the stored procedure work with the JDBC adaptor, revise the stored procedure to take Java variables as input and to return results as output. If revision is not an option, then create a stored procedure "wrapper" that invokes the original one but has the characteristics required to work with the JDBC adaptor.

Reference 2762381
Problem Oracle Stored Procedures with REF CURSOR parameters are not supported.
Description The JDBC Adaptor uses standard JDBC functions to call stored procedures and to fetch the results. Oracle Stored Procedures do not produce a result set in the usual way. Instead, they use an Oracle-specific REF CURSOR parameter to get access to results. The Oracle REF CURSOR type is not supported by the JDBC Adaptor so these stored procedures cannot be called. In particular, an Oracle Stored Procedure cannot be used as the "Fetch All" procedure for an Entity. Stored Procedures using only in and out parameters with JDBC compatible types should work normally as long as no result set is expected.
Workaround   Use an EOFetchSpecification to fetch objects.

Reference 2783472
Problem Oracle stored functions may return REF CURSOR result sets, but Oracle stored procedures with REF CURSOR parameters are notsupported.
Description The JDBC Adaptor uses standard JDBC functions to call stored procedures and to fetch the results. An Oracle stored procedure does not produce a result set in the usual way. Instead, it uses an Oracle-specific REF CURSOR parameter to provide access to results. The JDBC Adaptor offers limited support for the Oracle REF CURSOR only as the return value for an Oracle stored function, not as an OUT parameter for an Oracle stored procedure. In Oracle, the function is created with the SQL command "CREATE FUNCTION" as opposed to "CREATE PROCEDURE" which is used for procedures. In EOModeler, the Oracle stored function is modeled in the same way as any stored procedure. The external type of the returnValue parameter should be set to "REF CURSOR" even though this is not in the popup list of supported types. Its column name should be "000" (a string of three zeroes) to indicate that it is a return value from the stored function. (Reverse-engineering the store function should set this up automatically.) An Oracle stored function of this type may be used as the "Fetch All" procedure for an Entity. Other Oracle stored procedures using only in and out parameters with JDBC compatible types should work normally as long as no result set is expected.
Workaround   Rewrite the Oracle stored procedure as a stored function of the supported form, or use an EOFetchSpecification to fetch objects.

Reference 2791096
Problem OpenBase v7
Description WebObjects comes prepackaged with OpenBase v6.5.7.
Workaround   Download and install OpenBase v7 before installing WebObjects or use the OpenBaseUpdater application in /Applications/OpenBase.

Reference 2792858
Problem The WebObjects 5 documentation does not explain how to model the arguments to a stored procedure with the JDBC Adaptor.
Description Arguments to a stored procedure are modelled somewhat like the attributes of an entity. The most important caveat is that the arguments to the stored procedure are passed by order, not name. The order is defined by the "column" assigned in the model. The adaptor's convention is to assign "column" values such as "001", "002", "003", etc. to specify the argument order. As a special case, column "0" marks the return value of the stored procedure.
Workaround   Adjust the "column" settings of the stored procedure arguments so that they are passed in the correct order.

Reference 2807365
Problem Reverse engineering does not show relationships for MySQL.
Description It appears that the MM.MySQL JDBC driver, version 2.0.7, does not return any useful information for getImportedKeys() so the JDBC Adaptor is unable to reverse-engineer any relationships.
Workaround   Manually create the relationships using EOModeler.

Reference 2809949
Problem My application, which uses an OpenBase model, throws an exception whenever I try to update a "date" attribute: updateValuesInRowDescribedByQualifier -- com.webobjects.jdbcadaptor.JDBCChannel method failed to update row in database.
Description Some attributes require a "value type" to be specified in the model to control how values are passed to the database. For example, an attribute with "date" for the external type will require a value type of "D" for OpenBase to accept the value as a date. An application using an OpenBase model without setting the value types correctly might be susceptible to optimistic locking failures.
Workaround   Inspect the model and ensure that for each attribute with "date" for the external type that the value type is set to "D". Another workaround is to turn off optimistic locking for such an attribute.

Reference 2812976
Problem In EOModeler, the "Synchronize Schema..." menu is always disabled for a model using Microsoft SQL Server.
Description The schema synchronization feature is not implemented by the JDBC Adaptor's MicrosoftPlugIn for Microsoft SQL Server.
Workaround   Use Microsoft SQL Server tools to modify database schema and then reverse engineer the changed tables as necessary to synchronize your model. EOModeler's "New Updated Model" command might be useful.


Deployment

Reference 2282569
Problem Applications with dynamic images may leak them.
Description If you are testing such an application with the playback tool, the tool will not do the necessary callbacks to retrieve dynamic images. Therefore, these images will stay in the data cache of the app and never be released. Same can happen once deployed, as clients disable image loading from their browser. You will see your application leaking when it is not really, it is just waiting indefinitely for someone to come ask for an image.
Workaround   When using the data, mimeType bindings for dynamic images, try to use the key binding as well. With the key binding set to employee.picture, only once will the picture be saved in memory and stay there, limiting the amount of data leaked. Otherwise, you can always use the -flushCache call on WOResourceManager regularly. This clears out everything from the data cache, so this may impact currently connected users.

Reference 2394552
Problem wotaskd writes out a usable WOConfig.xml file.
Description wotaskd now writes a WOConfig.xml file to /Local/Library/WebObjects/Configuration. This is an XML file in the same format as the XML returned by hitting wotaskd at port 1085, and it can be used to enable the file-based load balancing scheme. See "Accessing Configuration Information" in "What's New in WebObjects 4.5" for information on how to disable multicast mode and instead have your web server adaptors obtain their configuration information from this XML file.
Workaround   None needed.

Reference 2404574
Problem Windows: wotaskd crashed and will not restart.
Description On Windows, if wotaskd crashes for some reason it should be restarted automatically by the woservice process. However, if the machine is set to have Dr Watson visual alerts appear in the event of a crash, the process will hang and wotaskd won't restart until the Dr Watson panel is dismissed.
Workaround   Turn off Dr Watson visual alerts. This is usually required for any server machine.

Reference 2791262
Problem When running applications on Windows, an "UnsupportedEncodingException: MacRoman" exception is thrown.
Description The English JRE distributed by Sun does not contain any "international" encodings, including all Macintosh encodings.
Workaround   Install either the international JRE or the full JDK.

Reference 2799941
Problem WebObjects may encounter cookie values that prevent the request from processed (and result in an IllegalStateException being thrown).
Description When the cookie values are parsed, some cookie values will cause the parser to throw an exception, and the request will not be processed.
Workaround   In your subclass of WOApplication, override the dispatchRequest method to fix the cookie header before calling super.

		public WOResponse dispatchRequest(WORequest request) {
		   String cookieHeader = request.headerForKey("cookie");
		   if (cookieHeader!=null) {
		      String betterCookie = fixCookieValues(cookieHeader);
		      request.setHeader(betterCookie, "cookie");
		   } return super.dispatchRequest(request);
		}


Development Tools

Reference 2163118
Problem Schema generation may produce identifiers that are too long.
Description If your database table names are long, the names generated for constraints may be too long.
Workaround   Shorten your table names, or edit the SQL EOModeler generates to shorten the constraint names.

Reference 2180253
Problem WebObjects Builder does not validate keys and values in the bindings inspector
Description WebObjects Builder lets you write illegal values (such as values with unrecognized characters) for binding attributes and values. These values are written to your .wod file without validation, so your .wod file will not be correct.
Workaround   Don't set your bindings to such values. If you do, close the component and reopen it. WebObjects Builder displays a parse error and puts you in source editing mode, where you can fix the corrupted bindings.

Reference 2269932
Problem Adding Java Client components (or an EOJavaClientSubproject in ProjectBuilder on Windows) to a project does not automatically add the necessary Java Client frameworks to the project.
Description If you create a project that was not intended to be used with Java Client in the beginning and add Java Client interface controllers and interface files (nib files) to it by hand, you also have to add all the frameworks needed by Java Client to the project by hand (for example JavaEODistribution, JavaEOApplication, JavaEOInterface, JavaEOInterfaceSwing).
Workaround   Add the Java Client frameworks to your project by hand.

Reference 2275826
Problem EOF Interface Builder palettes won't parse keys from the source code of client-side Java classes
Description If you drop a display group into a client-side nib, EOF Interface Builder won't recognize keys from the client-side class associated with the entity. Instead, it parses keys from the server side class.
Workaround   Add any keys you need manually, using the EODisplayGroup inspector.

Reference 2330551
Problem WebObjects Builder deletes two keys when they are defined on the same line in the source file.
Description If you have the following code:public String aKey, aKey2;and you delete aKey using WebObjects Builder's key pull-down menu, aKey2 is also deleted.
Workaround   Define your keys on separate lines.

Reference 2370222
Problem Opening a WebObjects 4.0 component can generate errors in WebObjects Builder.
Description In WebObjects 5, WebObjects Builder now detects errors in components. One particular error occurs when previous versions of WebObjects Builder inserted the text "Custom" between the <WEBOBJECT> and </WEBOBJECT> tags for a custom component. If the component does not contain a WOComponentContent dynamic element, such component content is illegal and the current WebObjects Builder flags the content as an error.
Workaround   Remove the "Custom" text between the <WEBOBJECT> and </WEBOBJECT> tags for custom components without WOComponentContent.

Reference 2415737
Problem Deploying WebObjects book images show a File Transfer button that doesn't appear in the final version of Monitor.
Description Due to security considerations, a planned "File Transfer" feature in the WebObjects Monitor application was pulled from the app after the Deploying WebObjects book was submitted to the release. All of the images in this book show a "File Transfer" button that doesn't appear in the final product.
Workaround   None.

Reference 2418323
Problem Subprojects deeper than two levels do not render html in rapid turnaround mode.
Description In development mode, rapid turnaround only works for the resource files in your top level project directory and in the first level of subprojects.
Workaround   Add to the NSProjectSearchPath user default each of the subprojects' subprojects directory paths. See the documentation on user defaults to learn how to modify them.

Reference 2555382
Problem Java Virtual Machine can't find classes in third party .jar files.
Description If your application depends on third party jar files, you may need to be sure they're located correctly on the file system and your application's launch script points to them.
Workaround   By modifying the Makefile.preamble, you make the third party jar files for development and deployment. Suppose you need to include a foo.jar java library to your project.

1. In your application directory, save it as Java/foo.jar.
2. Add it to your Resources bucket under a Java directory (on Project Builder WO, you may have to add the Java/foo.jar path directly to the PB.project plist file). When you compile the application, foo.jar will appear at the same level as <your-application>.jar under Contents/Resources/Java.
3. Modify the OTHER_CLASSPATH flag (which is normally commented out) in the Makefile.preamble file so it contains both the deployment and development locations:

OTHER_CLASSPATH = APPROOT/Contents/Resources/Java/
foo.jar$(CLASSPATH_DELIMITER)$(SRCROOT)/Java/foo.jar

The APPROOT identifier in the first path component is ignored during development. At launch time, however, the launch scripts replace APPROOT by the actual application path, which ensures the jar file is available when the application is deployed.

Note that the second path component of OTHER_CLASSPATH is the actual build time location of the foo.jar package. It needs to appear after the deployment path because otherwise the jar file may be picked up when testing the application on a networked development environment.


Reference 2650631
Problem When you change an EOModel used inside an interface currently open in Interface Builder, and drag a new entity or fetch specification from EOModeler to the interface file, you get errors about missing items.
Description Interface Builder palettes do not immediately notice changes to EOModels.
Workaround   Revert the interface file in InterfaceBuilder to the saved version (or close and reopen it).

Reference 2662018
Problem A WebObjects project cannot be installed from inside the Project Builder IDE on Mac OS X, or performing a split install did not work on Mac OS X.
Description An install should not be performed from inside the Project Builder IDE. This should be done from a Terminal command line. Split installs require that the install command be issued twice, once with each of two different build styles.
Workaround   To perform a "standard" (not split) install, make you you have appropriate permissions, change to the directory containing your project's .pbproj file and type the command: pbxbuild install -buildstyle Deployment DSTROOT=/To perform a split install, first perform a standard install and then type the command: pbxbuild install -buildstyle WebServer DSTROOT=/

Reference 2674710
Problem Specifying the flavor of Sun JVM to use by adding the appropriate switch (-server, -client, -classic) as a launch argument does not work.
Description The switch to select the flavor of Sun JVM to use must always be specified as the first argument passed to the JVM invocation. However, the arguments specified using the JVM_OPTIONS or JDB_OPTIONS values in the Makefile.preamble (in ProjectBuilderWO on Windows 2000) or in the main target's build settings (in Project Builder on Mac OS X), or on the command line when invoking a WebObjects launch script, do not guarantee that such a switch will be placed first among the arguments.
Workaround   In order to use these switches, you should set the JAVA_VM build setting in your Makefile.preamble (in ProjectBuilderWO on Windows 2000) or in the main target's build settings (in Project Builder on Mac OS X). Add the appropriate switch after the JVM's name and it will always be included as the first argument. For example, to use the -server switch, set the variable to:

JAVA_VM = java -server

This can also be accomplished by editing the classpath file directly and setting the value on the line beginning with '# JVM ==', for instance:

# JVM == java -server

Note that if your JVM is an absolute path, and that path contains spaces or other special characters in it, then you must explicitly quote the path to the JVM or the launch script might incorrectly parse this value.


Reference 2675174
Problem Deployment testing and configuration should include Java vm options.
Description The exact performance characteristics of the Java runtime vary from platform to platform. For optimal performance, we recommend experimenting with the options available for Java on your deployment platform. Adjusting the minimum and maximum heap sizes can affect the number of simultaneous sessions your application can handle.For more information see: http://java.sun.com/docs/hotspot/VMOptions.html and http://java.sun.com/docs/hotspot/PerformanceFAQ.html
Workaround   Not applicable.

Reference 2676249
Problem A project imported from ProjectBuilderWO into Project Builder on Mac OS X looks or behaves differently from brand new projects created using Project Builder.
Description There are certain issues which project import in Project Builder does not solve, and which must be resolved by the developer after importing the project. Known issues include:

1) The organization of the file groups in the file browser in PB will closely mirror that of the original PBWO project, rather than the organization of the WebObjects Application PB template.
2) Information in the Makefile.preamble and Makefile.postamble files in a PBWO project cannot be processed by project import and will not appear in the PB project.
3) JavaClient applications with a subproject whose Java files are compiled for both the server and the client sides (e.g., a Common.subproj) will have their files linked to only the Application Server target in PB, not also to the Web Server target.
4) The project's signature in the PkgInfo file after compilation will be APPL???? or FMWK???? not APPLwebo or FMWKwebo.
5) The default debugger for an imported project will be gdb, not jdb.
6) Aggregate projects may import strangely, or not at all.

Workaround   Most of these issues can be worked around by the user after import. To fix the corresponding issues above, do the following:

1) File groups can be reorganized in a highly flexible manner in PB. In particular, the file groups representing .subproj folders no longer have any functional purpose in compiling a project in PB - since file organization and build product organization are orthogonal in PB - and those files can be reorganized as desired.
2) Data in Makefile.preamble and Makefile.postamble files must be ported manually after import. Build variables will likely have to be set in the Build Settings panel of one or more targets. Additional targets can be implemented as Shell Script or Copy Files Build Phases on one or more targets.
3) After importing a subproject which contains Java files intended for both the server and the client sides, files can be added to any targets which the import process did not automatically add them to. It is valid for files to be attached to multiple targets in PB.
4) The product signature is defined in the Application Settings or Framework Settings tab of the project's main target (the one with the same name as the project). The CFBundleSignature value (labelled just "signature" in the Simple Settings view) can be changed from ???? to webo after import.
5) The debugger used to debug a project is defined in the Executables tab of the project's main target. Go to the Debugger subtab and change the radio button to select "Java Debugger" rather than "Gdb".
6) Aggregate projects are not supported in WebObjects 5. Individual products in an aggregate PBWO project should be identified and imported individually into separate PB projects.


Reference 2677023
Problem Launching a WebObjects application on Windows 2000 from a directory mounted via Samba, or using a framework or jar file on a Samba-mounted volume, does not work.
Description The most common case of this occurs when your application itself is sitting on a samba-mounted directory. In this case, lines in the CLSSPATH.TXT that begin with APPROOT will resolve to a samba-mounted directory and so will not be used at run-time. When one tries to run the application, it will throw a java.lang.NoClassDefFoundError for the "Application" class, which is defined in the application's local jar.One will get a similar exception if one tries to use a framework on a samba-mounted volume as well.
Workaround   Do not launch WebObjects applications mounted remotely via Samba. Do not refer to jar files or frameworks on samba-mounted directories. Copy the application or resource to the local disk and re-launch your application.

Reference 2759720
Problem The euro symbol is not translated to the character entity reference (&euro).
Description WOB supports and preserves character entity entities if they're entered manually in raw mode, but only generates them when a character can't be represented in the components encoding.
Workaround   None

Reference 2773063
Problem Problems launching projects on Mac OS X when they were created on Windows.
Description File execution permissions are not created for the Unix launch script file (the one without the .cmd) or are not preserved when transferring a WebObjects application from Windows to a Unix machine.
Workaround   "chmod a+x <launchScriptPath>" after the transfer and installation of the .woa is complete.

Reference 2785919
Problem In InterfaceBuilder, table columns are created for server-side properties, even for Java Client interface files.
Description When an entity is dragged from a model in EOModeler to a Java Client interface window in Interface Builder, a table is created with all of the entity's class properties. This set of columns created include columns for the entity's server-side AND client-side class properties. Java Client interfaces that include server-side-only class properties will not function and will typically throw an exception on the client-side.
Workaround   Simply delete columns created for server-side-only class properties.

Reference 2787071
Problem Can't debug from ProjectBuilder on Windows
Description On Windows a WebObjects application can not be debugged from the Launch window in Project Builder.
Workaround   To debug an application with "jdb", please launch it from the command line prompt.

Reference 2804259
Problem Fixes to project templates need to be applied manually to exising projects.
Description A number of changes have been made to target and buildstyle settings in the WebObjects project templates. These new settings fix problems building Project Builder projects from the command line:

1) DSTROOT was not handled properly during pbxbuild install
2) Permissions were not set corrrecty building with WebServer and Deployment buildstyles
3) pbxbuild would not work properly without a buildstyle

Workaround   New projects created with the current templates will contain these fixes. For exisiting projects you can do either of the following:

A) Create a new project and add all of your files and resources to it
B) Apply the following changes to exising projects:
1) DSTROOT was not handled properly during pbxbuild install Change settings in the Deployment buildstyle: - Prepend $(DSTROOT)/ to INSTALL_PATH_FOR_STYLE Change settings in the WebServer buildstyle: - Prepend $(DSTROOT)/ to INSTALL_PATH_FOR_STYLE - Prepend $(DSTROOT) to WEBSERVER_DOCROOT (no slash)
2) Permissions were not set corrrecty building with WebServer and Deployment buildstyles - Remove a-w, from INSTALL_MODE_FLAG in all buildstyles
3) pbxbuild would not work properly without a buildstyle - Copy each setting from the Development buildstyle into the Build Settings of the main target.


Reference 2812490
Problem Renaming a project from PB will cause it to fail to launch.
Description When a project template is instantiated, the project name is copied to a number of build settings accessed by the WebObjects build scripts. Changing the name in PB does not update the project name in all of these places. Changing the name of a WebObjects project via the PB GUI will result in a project that does not launch.
Workaround   The best way to work around this problem is the following. First, clean up the project. Then rename the project in ProjectBuilder and close it. Finally, modify the file "project.pbxproj" (inside the project document bundle <<PROJECTNAME>>.pbproj ) by opening it in a text editor. You will need to find and replace all occurrences of the old project name.

Reference 2813517
Problem Can't Control-DoubleClick d2wmodel files in Project Builder to open them using RuleEditor.
Description Because of the new contextual menu feature in Project Builder, control and double-clicking a file in Project Builder does not open the file in your preferred editor/viewer application.
Workaround   Drag the d2wmodel file's icon to a RuleEditor icon that is either in the Dock or in a Finder window.


Direct to Java Client

Reference 2809960
Problem I have a Direct To Java Client application that hangs when I try to fetch an entity that has a derived attribute. Sometimes, the client displays one row before hanging.
Description A derived attribute that is not marked as a client-side class property will be invisible to the client. Any attempt to fetch an entity with such an attribute may cause the client to hang.
Workaround   In EOModeler, make sure that the derived attribute is marked as a client-side class property. It may also be necessary to unmark the derived attribute as a server-side attribute. If you are having trouble marking/unmarking the derived attribute, try typing in "0" (zero) for the column name.


Direct to Web

Reference 2424172
Problem Direct to Web applications can hang.
Description An editing context in your application may be locked and not properly unlocked. Due to the details of how Direct to Web locks editing contexts, an editing context isn't unlocked when you create a new Direct to Web page without rendering it.

In WebObjects, the locking and unlocking of session.defaultEditingContext is performed transparently. However, if your application uses other editing contexts, you need to lock them yourself.

Direct to Web helps you manage the locking of such editing contexts:

- The edit and inspect pages lock the editing context when the setObject method is invoked.

- The edit-relationship page locks the editing context when the setObjectAndMasterRelationshipKey method is invoked.

- The inspect, edit, and edit-relationship pages lock the editing context of the object they manipulate when the awake method is invoked

- The inspect, edit and edit-relationship pages unlock the editing context of the object they manipulate when the sleep method is invoked.

Therefore the following code:

myPage=D2W.factory().inspectPageForEntityNamed("FOO",session());
myPage.setObject(myEO);
return myPage;

requires no extra lock/unlock statements on your part, even when myEO is not in session.defaultEditingContext.

However if you do not render the page right away but store it instead, the editing context remains locked unless you unlock it yourself.

Workaround   Unlock the editing context explicitly by calling sleep():

myPage=D2W.factory().inspectPageForEntityNamed("FOO",session());
myPage.setObject(myEO);
myPage.sleep();
thisOtherPage.setNextPage(myPage);


Reference 2458195
Problem Rules from d2w.d2wmodel files are merged into the user.d2wmodel file when saving
Description DirectToWeb applications merge all rules found in all d2w.d2wmodel files and the user.d2wmodel file. When settings are saved using the WebAssistant, rules of priority 100 are saved to the user.d2wmodel files. If a developer keeps rules with priority 100 in files other than the user.d2wmodel files, these rules will be merged into the user.d2wmodel file when a save is done from the web assistant.
Workaround   Don't create rules with priority of 100 in files other than the user.d2wmodel file. Assign a different priority to rules in d2w.d2wmodel files

Reference 2465051
Problem If you edit the display of the WOLMasterDetailPage in the Web Assistant, it will not have any effect.
Description The master detail page is actually two tasks put together: select and edit. You need to edit these task pages separately to modify the master detail page.
Workaround   Use 'Expert Mode' to edit the configuration of the select and edit tasks for the selected entity to configure the attributes that you want displayed.

Reference 2477438
Problem Shared entities do not appear in Direct to Web applications
Description By default, shared entities are hidden because they're usually not interesting to inspect and not editable. However, you can access them through relationship.
Workaround   If you really need to edit or show shared entities, use the Web Assistant to make them editable or read-only.

Reference 2504035
Problem In Direct to Web, some properties in a tab panel unexpectedly appear above the tabs.
Description Using the Web Assistant, you can configure a Direct to Web page to use a TabPage layout. When you change this setting to use the TabPage layout, the Web Assistant automatically assigns a tab name to each property displayed on the page, EXCEPT for properties that you had inspected with the Web Assistant before you changed the page layout setting. When a property does not have a tab name associated with it, D2W displays the property above and outside of the tabs of the page.
Workaround   Set the tab name for all properties on pages using the TabPage layout.

Reference 2507444
Problem DirectToWeb does not find attributes in relationships that use inheritance.
Description Consider a model with an entity A that has a relationship to entity B. Also, entity B has a subclass called B1 which contains an attribute (att1) not present in entity B. Keypaths of the type a.b.att1 will not work correctly with the rule system.
Workaround   none, other than avoiding rules that contain the the keypath a.b.att1 when you have the above scenario

Reference 2517806
Problem Direct To Web's EditRelationship pages don't handle mandatory to-one relationships very well.
Description Direct To Web currently has only one way to edit relationships: a page called EditRelationship. This page assumes that all relationships objects can be deleted, which violates the sematics of mandatory to-one relationships.
Workaround   Generate the page template for the edit relationship page and remove the delete button so that the user can't delete mandatory relationships. Or choose a component that won't lead the user to the EditRelationship page when editing a mandatory to-one.

Reference 2565612
Problem Netscape 4.xx is slow to render an uncollapsed WORadioButtonMatrix component.
Description For example, in a DirectToWeb application, if one uses a D2WEditToOneRelationship and picks the "Radio" UI style and checks the "allow collapsing" option, it may take Netscape a long time to render the page after the user "clicks on the triangle" and uncollapses the WORadioButtonMatrix. The delay is due to the table rendering algorithm in Netscape 4.xx.
Workaround   Uncheck the "allow collapsing" option.

Reference 2666929
Problem Changing primary keys that are class properties causes an exception to be thrown. This was not a problem in releases before WebObjects 5.
Description While it was technically possible to change primary keys that were class properties even after assigning their initial values, this actually caused major inconsistencies and resulted in substantial problems. Reassigning a primary key is now considered an error and causes WebObjects to throw an IllegalStateException. Note that in general, primary keys should not be class properties at all. They should only be used internally by WebObjects. However, it is still possible to access them in a read-only fashion by making them class properties, and/or to let the user assign an initial value (which then must be left unchanged).
Workaround   Don't change primary key values. A better solution is not to expose them as class properties at all. Note that by default, DirectToWeb and DirectToJava do not display primary keys even if they are class-properties.

Reference 2684724
Problem D2WDisplayLargeString won't allow me to scroll over the data.
Description When WebObjects produces html for the D2WDisplayLargeString component it will put the "disabled" attribute on the textarea tag. This tag, unfortunately, does not behave in the same way for all browsers. Some of them will disable just the text area and let the user scroll through the information while others will disable the whole element and thus stop the user of seeing all the information if there is more text than will fit into the outlines of the box.
Workaround   You can set D2WDisplayLargeString the rows and columns values so that all the information for that attributes can be viewed without scrolling the textarea box.

Reference 2809925
Problem My browser does not download the button images of a Direct To Web application. I may (or may not) be using OmniWeb.
Description The default buttons for the Neutral Look in Direct To Web are the same size as the smallest "standard" advertising banner. Browsers and proxies that automatically filter ad banners will filter out the various Direct To Web button images.
Workaround   The application developer is welcome to modify or replace the button images. If the filtering is done only by the browser (and not by a proxy), the user can either choose to download the images manually or turn off filtering in the browser preferences.


Documentation

Reference 2277580
Problem WOApplicationWillFinishLaunchingNotification has been relocated.
Description If your application depends on receiving WOApplicationWillFinishLaunchingNotification, be aware that it now comes after app init, before the adaptors are registered.WOApplicationDidFinishLaunchingNotification comes after the adaptors are registered, just prior to receiving requests.
Workaround   None.

Reference 2394732
Problem The WODirectActionHandler now allows direct-connect requests when the application is refusing new session.
Description In previous versions of WebObjects, if an application is refusing new sessions and a request with no session id comes in, a redirect is returned to the sender. In WebObjects 4.5, if an application is refusing new sessions and a request with no session id comes in through the adaptor, a redirect is returned to the sender. If the request is made using direct connect, it is processed normally.
Workaround   None needed.

Reference 2396118
Problem WOMessage string encoding constants are strings, not integers.
Description In Java, character encodings are represented by strings, which is different from how character encodings were represented in previous versions of WebObjects. To determine the string that represents a character encoding supported by the JDK 1.3, consult the table at http://java.sun.com/j2se/1.3/docs/guide/intl/encoding.doc.html
Workaround   Specify the character encoding as a string.

Reference 2408143
Problem WOMessage's setUserInfo method makes a copy of its dictionary argument.
Description WOMessage's setUserInfo method unconditionally makes an immutable copy of the dictionary passed as an argument to the method. This can be a problem if changes made elsewhere to the dictionary's contents need to be reflected in the userInfo dictionary.
Workaround   If you need to pass in a mutable dictionary that can be changed by others down the chain, wrap the mutable dictionary in a read-only (immutable) dictionary and pass the immutable dictionary to setUserInfo. Be extremely careful doing this if your application is multi-threaded and the userinfo data may be accessed by more than one thread.

Reference 2421581
Problem The "cache-control: no-cache" http header causes Internet Explorer 5 to hang when using a proxy server.
Description By default WebObjects adds the "cache-control" header with a value of "no-cache" (among others) to responses. This particular header causes Microsoft's Internet Explorer 5 to hang if a proxy server is being used.
Workaround   Set the WOAllowsCacheControlHeader user default to NO. This will cause the "cache-control" header (and all associated values) to be omitted from WebObjects responses.

Reference 2425256
Problem On Windows 2000, some of the fonts used by tools such as ProjectBuilder, FileMerge, WebObjectsBuilder are hard to read.
Description Windows 2000 introduced a new "message" font, Tahoma. This font is difficult to read at point sizes larger than 9.
Workaround   Open the Display control panel, click on the Appearance tab, select Message Box from the Item pulldown menu, and then select another font (such as MS Sans Serif) instead of Tahoma.

Reference 2659899
Problem Clicking a PDF documentation link in HelpViewer on Mac OS X doesn't work.
Description HelpViewer doesn't handle links to PDF documents.
Workaround   Open the WebObjects documentation page in a web browser. The home page for the local documentation is /Developer/Documentation/WebObjects/webobjects.html.

Reference 2673699
Problem I need to know the command line arguments for WOServices.
Description On MacOSX, WOServices is called javawoservice.sh and located at /System/Library/WebObjects/JavaApplications/wotaskd.woa/Contents/Resources/javawoservice.sh

The usage synopsis for javawoservices.sh is:
javawoservice.sh [ -help ] | [ [ -waitTime <seconds> ] [ retries <attempts> ]
[ -scaleTimeouts YES|NO ] [ -scaleFactor <amount> ] ]
-appPath <path> [ <application-specific arguments> ]

Note: javawoservice.sh -help gives you much more information about the arguments themselves.

On Solaris (and UNIX platforms), WOServices is located at $NEXT_ROOT/Library/WebObjects/Executables/WOServices

The usage synopsis for WOServices is:WOServices [ -help ] | [start | stop | enable -altJVMPath <path-to-other-Java-VM> | disable]

Note: WOServices -help gives you much more information about the arguments themselves.

Workaround   None needed.

Reference 2682847
Problem NSTimestamps created with the constructor NSTimestamp(int years, int months, int days, int hours, int minutes, int seconds, TimeZone tz) which have dates before January 1, 1970 are off by 1 second.
Description NSTimestamp relies on java.util.GregorianCalendar to calculate millisecond values for a date with a given set of time fields. Unfortunately, java.util.GregorianCalendar returns values that are off by a second if the milliseconds are less than 0 (January 1, 1970).
Workaround   None.

Reference 2719953
Problem On MacOS X only (not MacOS X Server), attempts to start WebObjects applications using JavaMonitor will fail.
Description This problem is the result of several configuration issues.
1) In /etc/hostconfig, the variable HOSTNAME is set to -AUTOMATIC-
2) In /etc/resolv.conf, there is a non-empty search line, e.g. search corp.apple.com apple.com This is configured through the Network preferences panel.
3) The machine is not a part of a NetInfo network

In this case, HOSTNAME will resolve to "localhost", causing lifebeats (from the application to wotaskd) to be sent to "localhost.corp.apple.com", which doesn't resolve properly. This does not happen with MacOS X Server because during the automated setup, a hostname is entered.

Workaround   Manually edit /etc/hostconfig and change the HOSTNAME from -AUTOMATIC- to the actual hostname.

Reference 2765702
Problem My WebObjects application fails to run as a Servlet inside of WebLogic.
Description JDF 1.4 requires that all classes be in packages in order to compile. In the future, it is likely that all classes must be in packages in order to run. All of the WebObjects frameworks are in packages, except for a single class (KeyValueCodingProtectedAccessor). This class is used for KVC access to Protected ivars/mathods in unpackaged classes. This should not prevent you from running your application in a 1.4 VM. It is important to note that for customer classes to compile correctly in a 1.4 VM, their classes must be in packages as well. In particular, the default class templates that ProjectBuilder or ProjectBuilderWO creates are not packages.
Workaround   N/A.

Reference 2775839
Problem Big5 encoding does not work in WebObjects Builder
Description On Windows, in WebObjects Builder, "Big5" encoding can not be used.
Workaround   There is no workaround for this issue. Big5 encoding works correctly on Mac OS X, and Big5 encoded components work for deployment on any platform. It is only on development for Windows that Big5 encoding doesn't work.

Reference 2779563
Problem JavaConverter doesn't convert 4.5 DirectToWeb apps completely correctly.
Description After using JavaConverter on a 4.5 DirectToWeb app there are still problems compiling and running the application. Here are some suggested workarounds:
Workaround   1. Make sure you regenerate the makefile as explained in the JavaConverter documentation.
2. JavaConverter doesn't bring over the files in the "SUPPORTING FILES", including the makefile preambles and postambles. All of the makefiles need to be added by hand to this folder.
3. JavaConverter flags a JC_ERROR message on the invocation of pageWithName in the logout method for the MenuHeader class (if you still have that class in your project). Ignore this message. This use of pageWithName is legal.
4. Make sure your Application class has the following main function to intialize the WOF Stack:
		public static void main(String argv[]) {
		   WOApplication.main(argv, Application.class);
	        }

5. JavaConverter doesn't handle EOModel conversions, so make sure your model is pointing to the correct adaptor. In addition, you may have to convert the attribute type names. NSString should be changed to String. NSDate and NSCalendarDate should be changed to NSTimestamp. NSNumber should be changed to java.math.BigDecimal.
6. If you have generated the Java stub for a DirectToWeb dynamic template, make sure your file has the following constructor:
		public YOUR_CLASS_NAME(WOContext aContext) {
		   super(aContext);
	        }

7. Pages you have frozen using DirectToWeb could contain variable definitions like
private EOEnterpriseObject itemForMovies;
change all itemFor... references from private to protected so that WebObjects can resolve these keys at runtime.

Reference 2793672
Problem JavaConverter .pdf for Mac OS X incorrect for Mac OS X
Description The directions in the Java Converter.pdf file state that you need to import an old project into Project Builder to run the JavaConverter tool. Doing this creates a new project, but no files are converted and the new project has no targets.
Workaround   Run the Java Converter tool from the command line.

Reference 2811938
Problem Javadoc not installed on CD for WebObjects 5.1
Description The Javadoc reference for WebObjects 5.1 is not installed in developer/documentation/webobjects/javadoc.
Workaround   That location contains a file with a link to http://developer.apple.com/techpubs/webobjects Users can access the Javadoc reference at that site.

Reference 2813387
Problem Cannot drag existing WebObjects components to a project.
Description To add an existing component to a project, you have to create a group under the Web Components group and add the files to it.
Workaround   In Finder, copy the components three files (.api, .java, and .wo) to the target project's directory.

In Project Builder
1. Open the target project.
2. Select the Web Components group from the Groups & Files list.
3. Choose Project > New Group and name the group appropriately.
4. Make sure the the new group is selected and choose Project > Add Files.
5. In the add-files sheet
    a. Select the component's three files from the file list in the sheet (you can click and drag or use the Shift key to select them).
    b. Click Open.
6. In target-selection sheet
    a. Make sure Reference Style is set to Default.
    b. Select "Create Folder References for any added folders."
    c. Select the appropriate target and click Add.



Enterprise Java Beans

Reference 2760239
Problem Can't add more than one EJB to an EJB framework project using PBWO.
Description Due to architectural limitations of the assistant in PBWO, there is no assistant to add a bean to an existing project as there is for PB on X.
Workaround   Use the assistant to create another EJB framework project, then add its resources to your project and merge the deployment descriptors manually. Or keep EJBs in separate frameworks.

Reference 2776319
Problem Two CMP beans which use different datasources can't reside in the same CMP container.
Description
Workaround   Make sure that in the file OpenEJBConfiguration.xml, every bean in the CMP container contains a reference to a datasource whose JNDI name matches the one in the file GlobalTransactionConfiguration.xml. The bean provider doesn't have to declare this section, but the EJB Container needs it to determine which database to use.

For example, every CMP bean needs an entry like the following inside its <entity-bean> declaration.

		<jndi-enc>
		   <resource-ref>
		      <res-ref-name>jdbc/myDataSource</res-ref-name>
		      <res-type>javax.sql.DataSource</res-type>                            
		      <res-auth>Container</res-auth>                            
		      <res-id>DefaultDatabase</res-id>                        
		   </resource-ref>                    
		</jndi-enc>

where "jdbc/myDataSource" would be defined in GlobalTransactionConfiguration.xml as follows:

		<database name="Global_TX_Database" engine="oracle">
		   <jndi name="java:comp/env/jdbc/myDataSource" />   
		   ......<
		/database>

Reference 2798695
Problem An EJB framework titled "Beans", "Resources" or "Versions" will not compile.
Description An Enterprise Bean framework project with the names mentioned above will not compile successfully.
Workaround   Don't use these names for your project.

Reference 2798740
Problem EJB 1.0 jar files are not recognized by OpenEJBTool
Description a jar file containing beans packaged according to the EJB 1.0 specification is not recognized by OpenEJBTool and it will throw an exception about the missing META-INF/ejb-jar.xml file.
Workaround   create the necessary files manually.

Reference 2806447
Problem class sun/tools/javac/Main not found on platforms other than Mac OS X with CMP entity beans
Description A WO application shuts down during initialization with the following error message :Changes made to the Windows and Solaris installers to support the addition of ${JAVA_HOME}/lib/tools.jar to the CLASS_PATH environament variables to support CMP in EJB Deployments. Since tools.jar is a part of the JDK, Deployment installations no require The JDK v1.3.1 or later rather than just the JRE.
Workaround   Add the .jar to the classpath on Solaris.

Reference 2808553
Problem The EJB container doesn't support role based security
Description Regardless of the configuration in the OpenEJBConfiguration.xml file clients have access to all methods of a bean declared in the remote interface. The container doesn't enforce the roles in this release.
Workaround   None.


Enterprise Objects

Reference 2159472
Problem Derived attributes are limited and don't offer full SQL as advertised.
Description Placing a string or a numeric constant in the definition field of a derived attribute generates invalid SQL. Definitions such as "title" and "0.0" don't work correctly. However, definitions such as "att1 + 5" should work correctly when "att1" specifies another attribute.
Workaround   None.

Reference 2174379
Problem EODatabaseContext can't be the direct parentObjectStore of an EOEditingContext.
Description The EODatabaseContext requires that an EOObjectStoreCoordinator sit between it and any EOEditingContexts that it serves. This is the default configuration set up by the framework, so you shouldn't normally run into this problem. Just a reminder, you can set up an editingContext and be ready to go with this one line:

		EOEditingContext editingContext = new EOEditingContext();
		// Creates a new EOEditingContext object with the default parent object
		//store as its parent object store.
Workaround   Don't assign an EODatabaseContext as the parentObjectStore of an EOEditingContext. There's no benefit to doing so anyway.

Reference 2176152
Problem Inserting and deleting objects involved in inverse, to-many relationships can be very slow.
Description Suppose that a ServiceRequest has a to-one relationship to its CustomerServiceRepresentative, and that the CustomerServiceRepresentative has an inverse to-many relationship to its ServiceRequests. When you assign a request to a representative using addObject:toBothSidesOfRelationshipWithKey:, you fire the fault for the CustomerServiceRepresentative.serviceRequests. So, if a representative has a large number of requests, assigning a new request to a representative can be very slow. Correspondingly, when you delete a request, Enterprise Objects Framework fires the corresponding representative's serviceRequests fault so it can remove the request from the array.
Workaround   Set the inverse, to-many relationship so it isn't a class property. For example, in the above request-represpentative scenario, you would remove the serviceRequests relationship from the class properties of the CustomerServerRepresentative entity.

Reference 2176526
Problem Applying a qualifier with key path to top of horizontally mapped inheritance hierarchy generates invalid SQL.
Description Enterprise Objects Framework's query building mechanism doesn't handle relationships to inheritance hierarchies. For example, suppose that you are are attempting to qualify a fetch through a to-many relationship (planes) that points to the top of a horizontally mapped inheritance hierarchy (for the entities Plane, FighterPlane, and TrainerPlane). If you want the query to test against all tables, you'd expect Enterprise Objects Framework to generate SQL similar to the following:

		SELECT  t0.AIRPORT_ID
		FROM PLANE t1, FIGHTER t2, TRAINER t3, AIRPORT t0
		WHERE
		   (t1.LENGTH <= 1000 AND t0.AIRPORT_ID  = t1.AIRPORT_FK) OR
		   (t2.LENGTH <= 1000 AND t0.AIRPORT_ID  = t1.AIRPORT_FK) OR    
		   (t3.LENGTH <= 1000 AND t0.AIRPORT_ID  = t1.AIRPORT_FK) 
		
Instead, Enterprise Objects Framework generates the following SQL:

		SELECT  t0.AIRPORT_ID
		FROM PLANE t1, AIRPORT t0
		WHERE  
		   (t1.LENGTH <= 1000) AND
		   t0.AIRPORT_ID = t1.AIRPORT_FK

In other words, only the table for the root of the hierarchy is queried.

Workaround   You can create a qualifier that generates the correct SQL by:

1. Adding relationships in the source entity to all the tables in the inheritance hierarchy. For example, to the Airport entity, you'd add the relationships toFighters and toTrainers to the destination entities FighterPlane and TrainerPlane, respectively. Mark the relationships so they aren't class properties.

2. When building your query, explicitly list these extra relationships. In the Planes example, you'd fetch from Airport where "planes.length < 1000 OR toFigtherPlanes.length < 1000 OR toTrainerPlanes.length < 1000"
Alternatively, you might be able to solve this problem more generally by writing a post processor for EOQualifiers that splits up clauses that perform inheritance tests. The post processor could even programmatically generate the additional relationships on demand and register them with the model using names like "plane_Subclass_Fighter".
A generic EOQualifier post processor could be wired into Enterprise Objects Framework so that application writers don't have to know it exists. The right place for such a mechanism is probably in EOKeyValueQualifier's schemaBasedQualifierWithRootEntity: method (see EOSQLQualifier.h). You could put the post processor code in a subclass of EOKeyValueQualifier (with an appropriate call to super after the transformation, if any, is performed) and have your subclass pose as EOKeyValueQualifier.


Reference 2177181
Problem Qualifying across a to-many relationship using the '"=" operator does not give the expected results.
Description The "=" qualifier operator is not designed to test whether an object appears in the list of objects across a to-many relationship. Instead, you should use the "contains" operator. For example, if you have a Movie object and you want to find out which Studio has a particular movie in its "movies" array, you can use the following: "movies contains %@", someMovieObjThe "contains" qualifier works both for searching in memory and accessing the database.If the to-many relationship has a reverse relationship that is to-one, you achieve much better performance if you query in the reverse direction. For example: someMovieObject.valueForKey("studio")
Workaround   Use the "contains" operator to qualify across a to-many relationship. For better performance in cases where the reverse relationship is to-one, search in the reverse direction.

Reference 2177354
Problem There are problems saving changes to attributes with mutable custom value objects.
Description Suppose you have a mutable custom value type, PhoneNumber, that implements mutator methods like setAreaCode, setPrefix, and so on. If you modify one of these values and save changes, the enterprise object is not saved to the database.
Workaround   Use immutable custom value objects. If you must use mutable value classes you need to do the following:1) In the value class object, implement equals to appropriately compare two instances.2) If the value is modified, its owning enterprise object must (first) invoke this.willChange.

Reference 2177631
Problem An EORelationship can return nil for its inverseRelationship after the inverse is added.
Description The first time you ask the EORelationship for its inverseRelationship it searches all relationships in its destinationEntity looking for an inverse, it caches the result of this search. This cache does not always get invalidated when the relationships of the destinationEntity change, so after editing a model and adding an inverse relationship to an EORelationship (either in code or with EOModeler), an inverseRelationship message sent to the EORelationship can return nil.
Workaround   See the category on EORelationship in the ModelerBundle/RelationshipExtras.m example.

Reference 2280881
Problem Concurrent multithreaded saves may bypass optimistic locking check
Description Although it has not yet been verified, EOF may have a brief window where two sessions modifying the same object will get last-one-wins behavior, instead of a merge (which is still last-one-wins at the attribute level). For example: Editing context 1 locks, modifies object 1 Editing context 2 locks, modifies object 1 Editing context 1 saves changes, unlocks, change notification enqueued on editing context 1 Editing context 2 saves its modifications to object 1 without merging in editing context 1's modifications
Workaround   None.

Reference 2329635
Problem EOF can generate incorrect SQL for disjunctions of qualifiers where one of the qualifiers involves an optional relationship.
Description The form of the SQL generated for an EOOrQualifier is similar to the SQL generated for an EOAndQualifier, but with "OR" substituted for "AND". For example, the qualifier "attr1 = v1 OR rel.attr2 = v2" would generate a SQL WHERE clause something like...

WHERE (ENTITY.ATTR1 = v1 or REL.ATTR2 = v2) AND REL.PK = ENTITY.PK

For a mandatory relationship 'rel', there will always be a match in the REL table and the above SQL WHERE clause will end up giving the correct result. However, for an optional relationship with a NULL value, the WHERE clause fails to return any rows even if there were rows in the ENTITY table that matched the value v1.

The appropriate SQL would be

WHERE ENTITY.ATTR1 = v1 or (REL.ATTR2 = v2 AND REL.PK = ENTITY.PK)

which would give the correct results for all cases.

Workaround   Separate your original fetch specification into independent fetch specifications that do not have disjunctions involving optional relationships, and concatenate the multiple results. Naturally, the same EO might be returned by multiple fetch specifications so you may need to filter out duplicates from the concatenated results. For complicated fetch specifications, it may be more effecient to use a custom SQL query (see documentation on EOCustomQueryExpressionHintKey in EODatabaseContext.h). If you choose to use custom SQL and you have multiple qualifiers across relationships, you should consider using DISTINCT since there may be multiple ways for one EO to satisfy the qualifier.

Reference 2359723
Problem The EOF documentation implies that only a single SELECT statement is needed to perform a deep fetch when all the subentities of the fetch specification's entity map to the same table. However, only one specific case is handled with a single SELECT. In the general case, one SELECT is issued for each subentity.
Description EOF performs one SELECT for an inheritance hierarchy if each subentity is mapped to the same table and if each subentity either has a restricting qualifier of the form "attr = val", where "attr" is the same for all subentities and "val" is unique to each subentity, or the subentity is abstract and has no restricting qualifier. If some subentity doesn't qualify for the optimization, then its parent also doesn't qualify. However, if some subtree of an inheritance hierarchy qualifies for the single table fetch, then that subtree is fetched in one SELECT even though other subentities of the parent entity have to be fetched individually.
Workaround   Arrange your single table inheritance heirarchy so that it meets the optimization criteria.

Reference 2431180
Problem After calling myEODatabaseContext.invalidateAllObjects(), subsequent saves either fail to save changes or just raise.
Description If an application has any EOEditingContexts that contain unsaved inserted objects, any call to myEODatabaseContext.invalidateAllObjects() will leave those EOEditingContexts in an inconsistent state. If you try to save the changes in any such EOEditingContext, the inserted objects will not be saved, or you might get an exception because these objects are mistakenly treated as updated objects.
Workaround   Replace all invocations of dbc.invalidateAllObjects()with dbc.invalidateObjectsWithGlobalIDs(dbc.database().snapshots().allKeys())

Reference 2505668
Problem The application does not reflect changes in the model until the project is rebuilt.
Description Currently, there is no rapid turnaround for model discovery. The application gets its information from the build directory, so the applicatiion loads the built model instead of the original.
Workaround   Rebuild the project after changing the model.

Reference 2577100
Problem EOSQLQualifier does not behave correctly.
Description EOSQLQualifier is deprecated. Do not use, subclass, or replace this class.
Workaround   Use EOQualifier in EOControl.

Reference 2663960
Problem EnterpriseObjects in an "Owns Destination" relationship are not automatically inserted/deleted if the relationship is altered several times rapidly.
Description Objects in an "Owns Destination" relationship receive some special treatment. They are automatically inserted into the owner's EOEditingContext, and they are automatically deleted whenever the relationship with the owner is broken, or the owner itself is deleted. However, these changes can only be tracked with a precision of one event. Specifically, if several changes are made to an "Owns Destination" relationship before the next invocation of processRecentChanges(), only the last change will be noticed by the EOEditingContext.This is a very rare problem. One usually does not need to invoke processRecentChanges() directly. When it occurs, it is exclusively in code directly using EOF in a programmatic manner.
Workaround   To avoid this problem, either invoke processRecentChanges() or saveChanges() on the EOEditingContext involved more frequently. Typically, this invocation would be immediately after using addObjectToBothSidesOfRelationship() or removeObjectFromBothSidesOfRelationship(). Alternatively, one can assume responsibility for inserting and deleting these owned objects from the EOEditingContext oneself.

Reference 2759733
Problem The JDBC Adaptor does not "quote" SQL identifiers.
Description Any unusual SQL identifier (for example, a column name containing a space) needs to be quoted in an SQL statement. The JDBCPlugIns provided with the JDBC Adaptor do not add the required quotes. This can lead to parse errors from the database when these unusual identifiers are used in an SQL statement generated by the JDBC Adaptor.
Workaround   If possible, change the SQL identifiers in your database schema so that quoting is not required. Otherwise, create a custom JDBCPlugIn subclass and turn on identifier quoting by setting the protected variable _externalQuoteChar = null in your plugin's constructor. This will cause JDBCExpression's implementation of externalNameQuoteCharacter() to use the database's quote character. Note that _externalQuoteChar is type String (not char).

Reference 2788548
Problem Flattened attributes over an optional relationship won't work well.
Description Using flattened attributes over an optional relationship isn't supported by EOF. Fetching the entity wouldn't return all rows (not those that have no related row, as an inner join is used), and saving won't work, of course, when there is no related object.
Workaround   For optional relationships, don't use flattened attributes. Or, if possible, change the relationship and its usage to 'mandatory'. One can also implement a similar behaviour in business logic, for example:// in Movie.java...public String studioName() { EOEnterpriseObject studio = valueForKey("studio"); if (studio == null) { return null; } else { return studio.valueForKey("name"); }}

Reference 2792055
Problem Additions and removals in a to-many relationship are not saved if the foreign key isn't marked as a class property or as used-for-locking, and also if there is no inverse relationship defined.
Description Suppose that an entity's foreign key attribute isn't marked as a class property or as used-for-locking. If you designate the foreign key attribute as a to-many relationship's destination key, the foreign key value isn't always updated. This occurs because the destination entity doesn't know that the attribute participates in a relationship. Therefore, the destination entity doesn't fetch the foreign key from the database or update it. However, the problem will not occur if there is a inverse relationship defined for the to-many.
Workaround   The simplest work-around is to mark attributes that are destination keys of a to-many relationship as used-for-locking. Alternatively, it is sufficient to define an inverse relationship for the to-many relationship. The inverse relationship does not need to be a class property. The final alternative is to make a small change to your application. At the beginning of the application (when all models are loaded into the model group), call: EOModelGroup.defaultGroup().loadAllModelObjects();This one-liner will insure that all (hidden) inverse relationships are created before the first fetch operation, which in turn will cause the necessary foreign keys to be fetched (and then saved).


Examples

Reference 2271407
Problem Netscape does not send "en" language choice if any other languages are chosen.
Description The default language choice for Netscape is "en". If the user chooses any other language in addition to this, the "en" choice will not be included in the list of languages transmitted. Hence, some language other than english may be chosen.
Workaround   None

Reference 2778304
Problem When trying to run a WebObjects Application (such as the SchoolTools example) that uses Apache-SOAP in a Servlet Container, a fault is generated.
Description The fault generated is similar to: "Deployment error in SOAP service 'urn:SchoolToolsServer': class name webobjectsexamples.SchoolTools.ClientOrder' could not be resolved: webobjectsexamples.SchoolTools.ClientOrder". This is because the Apache-SOAP soap.jar must be loaded by the same classloader as the objects being marshalled and unmarshalled in your application.
Workaround   Make sure that soap.jar is not in your classpath anywhere. Specifically, look in /Library/Java/Extensions, $CLASSPATH, $TOMCAT_HOME_DIR/lib. The soap.jar should only be loaded by linking to the SOAP.framework as part of your application.


Foundation Framework

Reference 2505603
Problem Using %w in a NSTimestampFormatter does not format the day of the week as a number. Using %z in a NSTimestampFormatter does not format the time zone as an offset.
Description Due to the implementation of NSTimestampFormatter, the %w format specifier is unsupported. The formatter formats the day as if %a was used instead. The %z format specifier is also unsupported. The formatter formats the time zone as an abbreviation instead.
Workaround   None.

Reference 2668027
Problem NSTimestamp may return values that are off by an hour after 2037 or before 1902.
Description NSTimestamp relies on NSTimeZone, which uses the Unix implementation of time zones. This implementation is subject to Unix beginning and end of time (+ or - 2^31 seconds from Jan 01 1970). As a result, timestamps created with dates pre 1902 or post 2037 may be off by an hour.
Workaround   none

Reference 2679121
Problem NSNumberFormatter cannot be both shared and changed in a multithreaded environment.
Description NSNumberFormatter can be shared among many threads, however, in such an environment, these threads may not change the number formatter (i.e. invoke any of the set... methods). The format() and parseObject() routines have no side effects on the number formatter, and may be safely called as long as no other thread is changing the number formatter with a set... invocation.One consequence of this is that the "defaultFormatter" returned by various framework methods such as defaultFormatterForClass() and defaultFormatterForKeyPath() must be treated as though they were immutable.
Workaround   One can create a proxy object which performs more aggressive locking, and pass the proxy between threads. One would have to ensure that only one thread could change the NSNumberFormatter object at a time, and at that time, no other threads were using the number formatter in any manner. Basically, a multi-reader, single-writer lock.

Reference 2685345
Problem NSValidation and validation method semantics have changed.
Description Developers should be particularly aware of this change to validation methods. In Objective-C, validation methods returned an exception object if the target object was invalid, and received a pointer to the target as their parameter. If coercion was necessary, the validation method would perform a side effect on its parameter. In WebObjects 5, this was changed to better accomodate the Java language. There are no side effects on the argument, and the return value is the desired, valid value. If something is invalid, an NSValidation.ValidationException must be thrown. Returning null will be interpreted as value coercion to the null Object reference.Example:public String validateStreetAddress(String address) throws NSValidation.ValidationException { ... }
Workaround   No workaround. One must use the new semantics for validation methods.

Reference 2812747
Problem Foundation mutable classes are now XML-serialized as themselves instead of their immutable counterparts.
Description Before WebObject 5.1, when these mutable classes NSMutableArray, NSMutableDictionary and NSMutableData are serialized using WOXMLCoder, they get written out as their immutable counterparts. For example, NSMutableArray used to be written out as NSArray. Now, they get written out as themselves. As a result, when WOXMLDecoder is used to serialize in the objects, they are serialized in as mutable forms.
Workaround   Please take note of current behavior.

Reference 2813835
Problem Several deprecated methods in NSTimestamp produce different effects than in previous versions of WebObjects.
Description NSTimestamp provided wrappers for some functionality of java.util.Calendar to aid those porting applications that used NSCalendarDate and NSGregorianDate from previous versions of WebObjects. However, NSTimestamp's primary purpose is to provide consistent date values that use an accurate timezone implementation (NSTimeZone, rather than java.util.SimpleTimeZone).

In order to maintain consistency for applications that use database persistence, it was necessary to ensure that all timezones are internally represented in UTC, rather than a local timezone. NSTimestamp objects returned by the no-argument constructor used to be located in the timezone local to the application; now such objects are located in UTC (also known as Greenwich Mean Time or GMT).

This will cause some methods that have been deprecated to behave differently. These methods include:

dayOfCommonEra
dayOfMonth
dayOfWeek
dayOfYear
gregorianUnitsSinceTimestamp
hourOfDay
minuteOfHour
monthOfYear
secondOfMinute
setDate
setHours
setMinutes
setMonth
setSeconds
setTime
setYear
timestampByAddingGregorianUnits
timeZone
yearOfCommonEra

It is possible to continue to use these methods, but it is important to understand that the NSTimestamp object, even if created using a timezone parameter, is located in UTC. Gregorian units for such an object are thus relative to UTC and not the timezone local to the application.

Deprecated methods that should be unaffected by this change are:

currentTimeIntervalSinceReferenceDate
distantFuture
distantPast
earlierTimestamp
laterTimestamp
microsecondOfSecond
millisecondsToTimeInterval
setNanos
timeIntervalSinceNow
timeIntervalSinceReferenceDate
timeIntervalSinceTimestamp
timeIntervalToMilliseconds
timestampByAddingTimeInterval

No methods that have not been deprecated should be affected by this change.

Workaround   To manipulate NSTimestamp objects via their Gregorian units or to query NSTimestamp objects for such units, use the java.util.Calendar class with these NSTimestamp objects as demonstrated and recommended in the reference documentation for NSTimestamp.


Installation

Reference 2172805
Problem Installing an upgrade will fail unless certain processes have been killed.
Description The "Pasteboard Server" and "Window Server" applications, which are necessary for WebObjects to function on Windows 2000, need to be killed in order to enable InstallShield to upgrade a WebObjects installation.These can be killed either by removing them from the Startup menu and rebooting or by selecting the executable in the TaskManager's Processes pane (where they are named pbs.exe and WindowServer.exe) and killing the processes explicitly.
Workaround   Kill the "Pasteboard Server" and "Window Server" apps by either of the methods described.

Reference 2252905
Problem Uninstalling from an account other than Administrator on Windows can result in some items not being removed.
Description If you happen to uninstall WebObjects or Yellow Box from an account that doesn't have Administrator privileges, some items--such as the Start Menu items--will not be removed.
Workaround   Uninstall from the Administrator account, or from the account with administrator privileges that was used to install the product.

Reference 2425526
Problem System paths longer than 255 characters can cause problems during installation on Windows NT.
Description During installation to an NT machine with long system paths (greater than 255 characters) there may be some problems. The installer will be unable to include necessary additions to the PATH environment variable, which means that some of the post-install scripts will fail because they can't locate needed commands. It also means that installed applications and services won't work following the installation.
Workaround   When installing try choosing an install path that isn't very long. For example, the default "C:\Apple" is a good choice. If you have a number of items in your system path you might try moving those items to a user PATH environment variable. To do this, create a user environment variable called PATH, add the values from the system path environment variable to it, and include %PATH% in the value (for instance, "%PATH%;C:\MyStuff"). Do not, however, move any of the Windows system path settings to the user path variable. In previous versions of WebObjects we used more than 150 of the available 255 bytes. In WebObjects 5.1, we have reduced this to about 60 bytes.

Reference 2619370
Problem WebObjects applications launch with the incorrect Java VM on Solaris and HP-UX.
Description On Windows, Solaris, and HP-UX, the Java VM that is used is determined like this:1. The CLSSPATH.TXT file inside the application wrapper appropriate for your platform contains a line starting with "JVM". If the path specified by this line is absolute, the JVM specified by the path is executed.2. If the path specified by the "JVM" line is relative (for example, if it's simply "java") the operating system resolves the full path of the executable according to the PATH environment variable.In some installations, the PATH environment variable contains paths to two or more different Java VMs. As a result, your application may launch with the incorrect VM. This is not a problem on Windows; the WebObjects installer on Windows sets the PATH environment variable correctly.
Workaround   Be sure that the path to the correct Java VM (JDK 1.2 or later) appears before paths to all other Java VMs. Alternatively, you can edit your application's CLSSPATH.TXT file to specify the full path to the correct JVM. Warning: Recompiling the project will overwrite this rule.

Reference 2655315
Problem Installing a new JVM after installing WebObjects may interfere with WOServices' startup scripts.
Description During the installation of WebObjects 5, the installer records the path to the '.../bin/' directory containing the JVM ("java") executable used to perform the license key verification. The full path to this directory is placed at the beginning of the PATH environment variable employed by the WOServices-generated startup scripts (which ensure that WebObjects services are automatically started at the machine's boot-time). This means that the JVM present during the install is likely to be the JVM that is used to launch WebObjects services. If this JVM is too old (that is, if it is from too old a version of the JRE or JDK) or somehow replaced or moved after the installation, that original path will still be placed in the startup scripts and WebObjects services may not start correctly at boot-time, even if scripts are generated.
Workaround   There are three workarounds for this:(1) Use the '-altJVMPath' flag with the 'WOServices' executable (see 'WOServices -help'). A path specified with this flag (in the form 'WOServices enable -altJVMPath /opt/new/j2sdk1.3.0/bin') will be prepended to the PATH environment variable inside the generated startup script (note that the prepending of the path applies only to that single execution of 'WOServices'; that is, the path is not recorded in 'WOServices' permanently).(2) Move the old JVM back to or new JVM into the location recorded at startup, thereby ensuring that the recorded path is actually valid.(3) Manually edit occurrences of the PATH environment variable in 'WOServices_utils.sh' as befits your needs (note that the first method is the intended solution, as it is non-destructive).

Reference 2677151
Problem On Windows, WebObjects needs to know when you change the web server after you install WebObjects.
Description WebObjects maintains the information about the web server in two configuration files.
Workaround   To configure WebObjects to work with a new web server:1. Copy the contents of the old web server's CGI-Bin directory to the new web server's CGI-Bin directory.2. Copy the contents of the old web server's document root directory to the new web server's document root directory.3. Modify the [WebObjects installation directory]\Library\Frameworks\JavaWebObjects\Resources\WebServerConfig.plist file with a text editor. Change the line that sets the "DocumentRoot". This should be set to the full path of the document root. Change the line that sets the "WOAdaptorURL". This should be set to the path of the CGI-Bin directory relative to the web server's root directory (not the web server's document root). 4. Make the same changes to [WebObjects installation directory]\Library\WebObjects\Configuration file.

Reference 2680165
Problem The WebObjects 5 Solaris uninstall.sh script may fail to uninstall WebObjects fully.
Description WebObjects 5's uninstaller, located at $NEXT_ROOT/Library/Executables/uninstall.sh, will most likely not uninstall WebObjects fully. It will, for instance, leave the $NEXT_ROOT directory (the main directory into which WebObjects was installed; also known as the WEBOBJECTS ROOT directory) in place. Additionally, it will not stop any running instances of wotaskd.
Workaround   Completing the uninstallation process is quite simple: first, use the '$NEXT_ROOT/Library/WebObjects/Executables/WOServices stop' command to kill a running wotaskd instance, if one exists. Then, execute the uninstall.sh script from any directory. Finally, remove the $NEXT_ROOT directory. Note that WebObjects only deletes the files that it installs -- if you add files anywhere inside the $NEXT_ROOT directory tree, the removal of those directories will fail (be careful not to name any of your files the same names as those included in a WebObjects installation).

Reference 2814922
Problem wotaskd won't start after an installation on Solaris
Description The WebObjects installation on Solaris prompts for whether wotaskd should be started after the installation finishes. But wotaskd is not started regardless of the response to this query.
Workaround   wotaskd can be started manually. Or, if the installation was configured so that wotaskd is started automatically when the machine boots the machine can be rebooted and wotaskd will start.


Java Client

Reference 2281716
Problem Java Client applets can use the wrong session on the application server.
Description Web browsers don't usually start a new Java VM when a new applet is started. The Java Client applet stores some information about the session in static variables--these variables may be reused if a second Java Client applet is started in the same VM. If the original session has already timed out by the time you display the second applet, you'll get a "your session timed out" error message. Otherwise, the second applet will use the original applet's session on the server, instead of the current one.
Workaround   Run the client as an application, or restart the Web browser between uses of a Java Client applet.

Reference 2370377
Problem It isn't documented that locking operations aren't supported in the client side of a Java Client application are no-ops.
Description Locking is not implemented in Java Client's distribution layer (especially EODistributedObjectStore), but there is public API in those classes that makes it appear otherwise. The EODistributedObjectStore method isObjectLockedWithGlobalID always returns false because locking isn't supported in the client. Similarly, the EODistributedObjectStore method lockObjectWithGlobalID raises an exception. The EOEditingContext locking methods (lockObjectWithGlobalID, lockObject, locksObjectBeforeFirstModification, setLocksObjectBeforeFirstModification, and isObjectLockedWithGlobalID) cannot be used on the client side: lockObjectWithGlobalID and lockObject raise on first use; locksObjectBeforeFirstModification and setLocksObjectBeforeFirstModification trigger a raise if set to true and you modify an object; and isObjectLockedWithGlobalID always returns false.
Workaround   None.

Reference 2481832
Problem Reverting form windows in Direct to Java Client can leave windows unusable.
Description This problem occurs if1. you create a form window for a main entity "A" which is owned by another entity "B" (entity "B" has a relationship to entity "A" which "owns destination")2. you display a subform to allow the user to select/deselect the object from entity "A"3. the user selects or deselects the object and subsequently reverts the changeBecause entity "A" owns entity "B", the object of entity "B" is deleted when it is removed from the relationship to "A". As a result, there is no object left in the main display group to display any kind of data. Reverting the change (pressing the Revert button) restores the objects, but does not put them back into the display groups. Thus, the window still appears empty.
Workaround   The default rule system of Direct to Java Client never creates a user interface like this because it hardly ever makes sense. However, you can create it manually, for example, by changing parameters in the Direct to Java Client Assistant. If you do so, disable the select and deselect actions in the subform.


Java Converter

Reference 2463694
Problem JavaConverter overwrites existing .java file when converting .m file in same dir.
Description The JavaConverter will overwrite an existing .java file when it is converting a .m file with a corresponding name in the same directory. For example if both Foo.java and Foo.m exist in the same directory and you run JavaConverter on Foo.m, then it will overwrite the existing Foo.java.
Workaround   Rename the .java file prior to conversion.


javajndiadaptor

Reference 2753067
Problem The JNDI adaptor (with the LDAPPlugIn) sometimes throws a NullPointerException when fetching from a Netscape Directory Server.
Description The problem has been observed on a Netscape Directory Server while searching an object class that has a large number of entries (on the order of thousands).There seems to be a problem with the LDAP Service Provider that Sun distributes. The LdapNamingEnumeration implementation of next() throws a NullPointerException in violation of the JNDI specification.The exception message follows:Exception in thread "main" java.lang.NullPointerException at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:107) at com.sun.jndi.ldap.LdapNamingEnumeration.nextAux(LdapNamingEnumeration.java:180) at com.sun.jndi.ldap.LdapNamingEnumeration.next(LdapNamingEnumeration.java:171) ... etc.
Workaround   Catch the exception and/or repeat the attempt to fetch. The problem seems to occur frequently but somewhat irregularly.

Reference 2768730
Problem Special characters in LDAP relative distinguished names.
Description The so-called "relative distinguished name" (RDN, which is used as the primary key) in the LDAP API is often derived from the value(s) of other attribute(s) of an EO. If this value contains special characters, a special syntax must be used by the JNDI/LDAP Adaptor for the RDN (but not for the attribute).These special characters are: "," "=" "+" "<" ">" "#" ";"Even more special (in their handling) are: Backslash "\", Quote (") itself.Conforming with RFC 2253 (and 1779), these are escaped by preceding them with a backslash "\". Two exceptions are the "more special" characters backslash and quote, for which this doesn't (always) work. For these two characters, their hexadecimal notation (again according to RFC 2253) is used, which is "#5C" and "#22", respectively.Some servers handle special characters in a very unique way, and the above scheme doesn't work with all of them. For example, it works with OpenLDAP, but not with iPlanet. Since it doesn't seem to be possible to handle special characters transparently with all servers, in these cases the application needs to handle special characters explicitly. (In the case of iPlanet, it might modify both the attribute value and the RDN value in exactly the same way, to avoid so-called "multi-valued" data.)
Workaround   Avoid the use of special characters in relative distinguished names.

Reference 2809789
Problem A rare problem with reverse engineering has been reported on iPlanet (but only on one particular server).
Description There is an iPlanet server with an attribute "filterInfo" on the "changeLogEntry" entity. Normally, the attribute has "Binary" for the external type and "NSData" for the value class. Occasionally, reverse engineering produces "Directory String" for the external type and "String" for the value class.
Workaround   Inspect a model to make sure that an attribute has the correct external type and value class. Manually change the model, if necessary.

Reference 2809849
Problem When I try to create a new project on Windows, creating a new model with the JNDI adaptor does not work, but the project gets created anyway.
Description On Windows, unless the JNDI package and LDAP service provider have been installed, EOModeler will be unable to create a new JNDI model.
Workaround   Install the JNDI package and LDAP service provider in the Apple Library Java directory.

Reference 2809930
Problem I cannot use EOModeler to create a new JNDI model. Every time I try, I get an alert panel that says, "No reason provided" or "Unable to load the bundle for the adaptor named JNDI ...".
Description The JNDI adaptor, when using the LDAP plug-in with its default settings, requires that the JNDI package and LDAP Service Provider be installed on the system. Otherwise, one will be unable to create a new model using EOModeler.
Workaround   Download the JNDI 1.1.2 package and LDAP Service Provider 1.0.3 from Sun Microsystems. Visit http://java.sun.com/products/jndi/index.html and look for the section titled "JNDI 1.1.2". Click on the download button. Respond to the license agreement. Choose to download the files "jndi112.zip" and "ldap103.zip". Save the zip files and extract the files from the zip files.Find the following jar files: ldap.jar, providerutil.jar, jndi.jar, and ldapbp.jar. Copy the jar files to the Apple Library Java directory. Extract all files from the jar files using the Java jar program or some other decompression utility.

Reference 2809931
Problem Cannot search with "<" or ">" or "<=" or ">=" conditions in OpenLDAP.
Description As of the time of this writing, OpenLDAP does not seem to have full support for relative comparison operators. As a result, fetching will fail if a key-value qualifier uses the "<" or ">" or "<=" or ">=" selectors.
Workaround   NA

Reference 2809938
Problem Using the JNDI adaptor, the application can connect but cannot insert, update, and delete.
Description If the password is empty or the authentication method is "NONE," an anonymous connection is made.
Workaround   Enter the username and password of an account with read-write permissions.

Reference 2809944
Problem Whenever I try to use a key comparison qualifier with the JNDI Adaptor/LDAP Plug-in, I get an exception telling me, "Cannot visit."
Description The LDAP Plug-in of the JNDI Adaptor has no key comparison qualifier support, mostly because LDAP has no syntactical construct for comparing attributes in a search filter. Were LDAP to evolve to handle attribute comparison, the LDAP Plug-in could be enhanced to provide such support.
Workaround   Avoid the use of key comparison qualifiers with the LDAP Plug-in of the JNDI Adaptor.

Reference 2809954
Problem In OpenLDAP, some attributes can have values inserted once, but no updating or deleting can be done, and sometimes a hard crash is caused. The problem occurs with attributes that is one of the following types: Delivery Method, Facsimile Telephone Number, Postal Address, Numeric String, and Telex Number.
Description In OpenLDAP, there is inadequate support for attributes of typeDelivery Method, Facsimile Telephone Number, Postal Address, Numeric String, or Telex Number. The affected object classes include Dmd, Organization, organizationalPerson, organizationalRole, organizationalUnit, and residentialPerson.
Workaround   Avoid the use of unsupported attributes with OpenLDAP. The iPlanet Directory Server does not have this limitation.

Reference 2809977
Problem When I try to to insert a new object using the JNDI adaptor, I get an exception with a message that is similar to the following: "Cannot bind cn=Sara Lee,sn=Lee to attributes {objectclass=objectClass: person, sn=sn: Lee, cn=cn: Sara Lee}
Description If one sets EOAdaptorDebugEnabled to TRUE, the log will reveal that an exception has been raised because "cn=Sara Lee,sn=Lee" is a relative distinguished name that is illegal in LDAP. The LDAP server assumes that "sn=Lee" denotes the parent of "cn=Sara Lee" (which it does not). For better or worse, automatic primary key generation simply follows the pattern specified in the write format and cannot prevent the creation of illegal relative distinguished names ahead of time.
Workaround   Change the write format of the relative distinguished name attribute to generate relative distinguished names that are allowed in LDAP. For an entity that has the "common name" attribute, the pattern "cn=<cn>" usually works. See RFC 2251 Lightweight Directory Access Protocol (v3).


New Features

Reference 2201189
Problem DirectToWeb does not handle queries with custom data types.
Description If one of your attributes has a custom data types (i.e. not one of the built-in types such as NSNumber, NSDecimalNumber, NSDate, NSCalendateDate..) you can get an exception when DirectToWeb is trying to display it.
Workaround   Using the Web Assistant, navigate to the faulty query page in expert mode and hide the property that has a custom type.

Reference 2256367
Problem Configuration of WODisplayGroups in WebObjects Builder is not undoable.
Description WebObjects Builder won't undo any changes made to a WODisplayGroup via the configuration panel.
Workaround   Changes can be reverted before dismissing the panel. Otherwise, you must restore the desired settings by hand.

Reference 2274611
Problem DirectToWeb raises on custom or non-existent keys.
Description Either due to a mistyped key in the Web Assistant or the removal or renaming of an attribute or relationship in EOModeler, an EOUnknownKey exception can be raised when you run a DirectToWeb application.
Workaround   Using the Web Assistant's expert mode, select the task/entity couple for which you're getting an exception and hide the key that is causing the problem.


RapidDevelopment

Reference 2809571
Problem How do I find the association of a Cocoa/EOF or JavaClient UI widget?
Description If you need to identify the EOAssociation instance that manages a UI widget, you cannot rely on the widget's delegate or event listener being the EOAssocation instance.
Workaround   1)Subclass the EOWidgetAssociation Plugin class related to the widget of interest2)In the plugin's constructor, store the association in a dictionary with the widget as the key3) When you need information the association of a widget, look for the association in the dictionary4) invoke com.webobjects.eointerface.EOWidgetPluginRegistry.registerWidgetPluginClass to make your plugin the default plugin.Example:public class MyCocoaTextFieldPlugin extends EOCocoaTextFieldPlugin { public MyCocoaTextFieldPlugin(EOWigetAssociation association, Object widget) { super(association, widget); MyUtility.myStaticMutableDictionary().setObjectForKey(association, new Integer(widget.hashCode())); }}in the NSApplication delegate's static initializer, invoke com.webobjects.eointerface.EOWidgetPluginRegistry.registerWidgetPluginClass(EOTextAssociation.class, NSTextField.class, MyCocoaTextFieldPlugin.class);Later on, you can call EOWidgetAssociation association = MyUtility.myStaticMutableDictionary().objectForKey(new Integer(widgetFromNotification.hashCode()));


Web Server Adaptors

Reference 2173679
Problem Can't run two WebObjects adaptors on the same machine with two different web servers.
Description If you attempt to run two WebObjects adaptors on the same machine with two different web servers, the adaptors share the public WebObjects.conf file, allowing applications to be visible on both web servers.
Workaround   There is a #define that sets the location of the configuration directory in Apple/Developer/Examples/WebObjects/Source/Adaptors/Adaptor/woconfig.h. Change this #define and recompile the adaptor. Now you can have several web servers running adaptors that do not share the same applications.

Reference 2454840
Problem When using the CGI WebObjects HTTP Adaptor in multicast mode, performance is suboptimal
Description The CGI adaptor configured to use multicast to discover wotaskd deamons on the deployment subnet is about 7 times slower than when it is configured in non-multicast mode and knows about the wotaskd deamons it should talk to. CGI + multicast is the configuration that will generate the most noise on your deployment subnet, so it is not recommended except for development or functionality testing.
Workaround   if CGI performance is unnacceptable in multicast mode, then one of the non-multicast modes should be used. Note that multicast is not the default mode, so you should already know how to switch the CGI back to a non-multicast mode. More information is available in the WebObjects Deployment guide.

Reference 2455171
Problem WOHTTPConnections cannot be shared between worker threads.
Description Due to the fact that WOHTTPConnection currently has one input buffer per instance, and no locking thereof, WOHTTPConnection objects cannot easily be shared between threads, as unpredictable results will occur.
Workaround   Either avoid sharing WOHTTPConnection objects between threads, or add additional locking logic in your own code.

Reference 2670515
Problem Adaptor uses default configuration if no wotaskd responding to multicast found.
Description If the WebObjects adaptor is configured to search for wotaskd using multicast and no server responds, the adaptor falls back to querying wotaskd on localhost:1085. This may produce unexpected and undesired results.
Workaround   The WebObjects adaptor has been modified to only read configuration from servers which respond to the multicast query. If no servers respond to the multicast query, the adaptor does not attempt to read configuration.

Reference 2676784
Problem Cannot run multiple webservers using Apache or CGI adaptors on a single host.
Description For performance reasons, the Apache and CGI adaptors use a shared state file, WOAdaptorState. This file is stored in the temporary directory (/tmp or C:\temp, typically). However, running multiple Web servers on the same machine may cause collisions if more than one are using the WebObjects Apache or CGI adaptors. In the event of collisions, the results will be confusing. Because the location and name of the WOAdaptorState file is hard coded, the Web servers will "fight" over the configuration, and whichever Web server last requested configuration information will overwrite the configuration stored in the file.
Work around   For each CGI or Apache adaptor, edit the source code to make the location or name of the WOAdaptorState file unique and compile. In WebObjects 5.1, you can configure the adaptors to use a different name for the shared state file by adding a line in the configuration file: WebObjectsOptions stateFile=WOAdaptorStateAlternate

Reference 2679889
Problem On Mac OS X, WebObjects applications may see some transaction failures after a period of inactivity.
Description Mac OS X computers are set to go to sleep after some time. If the computer goes to sleep, WebObjects will still work, but will become unreliable.
Work around   Disable idle sleep for the WebObjects application server.

Reference 2766065
Problem When using a WebObjects application running in WebLogic, you cannot connect to WebObjects application deployed through the WebObjects HTTP adaptor.
Description WebLogic can be configured in 2 ways. The first way is by MIME type, and the second is by Path. However, there seem to be some issues with configuration by Path.
Workaround   If WebLogic can be configured to service URLs by path, a standard WebObjects deployment should be able to work concurrently with a WebLogic deployment.


WebObjects Framework

Reference 2164906
Problem WOCheckbox checked attribute doesn't work as expected.
Description WOCheckBox's checked attribute should return YES or NO as specified in the API, but it actually returns self or nil.
Workaround   Test the checked attribute for nil or non-nil values instead of NO or YES. You may also want to write your own checkbox component that returns YES or NO instead of self or nil.

Reference 2269517
Problem Rapid turnaround doesn't seem to work for aggregates (Windows only).
Description The default NSProjectSearchPath '(../..)' doesn't work for aggregates because the .woa is built into the top level of the aggregate.
Workaround   Change the user default for your application to point either to the aggregate itself or to "..". For example:defaults write MyApplication NSProjectSearchPath '("~/projects/MyAggregate")'or defaults write MyApplication NSProjectSearchPath '("..")'

Reference 2273821
Problem The session size numbers on the WOStats page appear to be too large.
Description The session size numbers are only an indication of the actual size of the session. When an application has finished initializing, its memory size is noted. The session size that is reported is based on the memory increase since startup, and is divided by the current number of active sessions. The memory increase includes any cached data and/or data initialized after startup, skewing the size computation.
Workaround   None.

Reference 2274039
Problem IDs in Cookies are dropped at the front door of applications.
Description When "IDs in Cookies" is turned on for a WebObjects application, and you enter that application through the default request handler, cookies with old IDs are ignored in the request. In the response, new cookies for new IDs are sent back, or, in the case when there wouldn't be any new ID needed (such as in a stateless application), cookies clearing out the old IDs are sent back. This ensures that a user gets a new session when reentering a site, even if his browser keeps old, non-expired cookies around. This behavior is non customizable.
Workaround   Use the API shouldRestoreSessionOnCleanEntry(WORequest aRequest) on the WOApplication class to control whether cookie sessions are dropped as above.

Reference 2276414
Problem Sessions do not time out with WOAditionalAdaptors
Description If you attempt to use the WOAdditionalAdaptors feature, sessions may not timeout.
Workaround   None.

Reference 2282001
Problem The current context and the current request aren't accessible from within a WOSession initializer.
Description WOSession's initializer doesn't set its context instance variable, so it isn't possible to access either the current context or the current request for use in your WOSession subclass initializer.
Workaround   There are two ways to work around this problem. The simplest is to implement awake() on your session. At this point, the context instance variable is set. Since awake() is invoked for every request, though, you will have to protect your code so it is executed only once in awake() (if it is initialization code, it most likely needs to happen only once). A better solution, assuming you only need the request object, is to implement createSessionForRequest() in your subclass of WOApplication:
		public WOSession createSessionForRequest(WORequest aRequest) {
		   Session session = (Session)super.createSessionForRequest(aRequest);    
		   // put your custom initialization that needs the request object here.    
		   return session;
		}
		

Reference 2290990
Problem Standard error and warning messages aren't localized.
Description When running a WebObjects application, some standard error and warning messages--such as "You have backtracked too far"--can be sent directly to the user. These messages aren't localized and can confuse a non-English user.
Workaround   Provide your own implementation for the different handle...Error methods in WOApplication:handlePageRestorationError for localizing the "backtracked too far" messageshandleSessionCreationError when the application is unable to create a new SessionhandleSessionRestorationError when the WOApplication is unable to find the SessionIts always a good idea to implement the above methods, providing your own logic and user interface to handle exceptional conditions.

Reference 2332399
Problem Resources are not found on Microsoft Windows.
Description On file systems that are case-insensitive, resources may not be loaded if their names are spelled differently from the name returned by the file system. NSBundle and related classes use case-sensitive matching of resource and path names. This can result in a resource not being found in WebObjects 5, even though the file can be accessed directly from the file system where the case is irrelevant.
Workaround   When you specify a resource, be sure the name has the correct case.

Reference 2372492
Problem Cookie expire header date format change.
Description In order to comply with RFC 2109 and the Netscape informal specification, the date format used with the cookie expire header has been changed to "%a, %d-%b-%Y, %H:%M:%S GMT". Previously %A was used rather than %a. %a formats weekdays as Mon, Tue, Wed, etc. rather than the full weekday name.
Workaround   None

Reference 2374907
Problem The default error page doesn't appear after the application raises an exception.
Description By default, WebObjects displays a standard error page in the browser when an application error occurs. The default WebObjects error page is defined by the WOExceptionPage.wo component in the JavaWOExtensions.framework. If this exception page can't be displayed because of a problem with the component itself, WebObjects displays a rudimentary page with information related to the issue. This page doesn't contain any alert image or hyperlink. It simply displays text describing the error. One way this page can appear is if WebObjects encounters a uncaught exception while creating a Session object.
Workaround   not applicable

Reference 2378754
Problem WOHyperlink documentation incorrectly indicates that the actionClass binding must be specified.
Description The actionClass binding only needs to be specified if the directActionName binding is specified.
Workaround   None needed.

Reference 2379272
Problem There is no facility in WOXMLDecoder to allow developers to specify that a piece of parsed data should be converted automatically to an expected type. The original type of the parsed data is java.lang.String.
Description WOXMLDecoder makes use of an underlying XML parser, which always parses content data in the XML file as Strings since there's no type information available in the XML file. This is expected. However, it would be good if there's a way to instruct WOXMLDecoder to immediately coerce the parsed String into a type that can be used immediately. For example, from java.lang.String to java.lang.Integer. Unfortunately, we don't have such a facility yet.
Workaround   The workaround involves changing the class that encapsulates a member variable of the type in question. First, ensure that the class implements NSKeyValueCoding (since classes do not inherit from NSObject anymore by default). Second, have a "takeValueForKey" method in the class and do type coercion in this method. For example, imagine that you have a Key class that has 3 member variables: rank (of type int), requestDate (of type NSTimestamp) and message (of type String). Then the class file should like something like this:
		public class Key implements WOXMLCoding, NSKeyValueCoding {   
		   ...   
		   protected int rank;   
		   protected NSTimestamp requestDate;   
		   protected String message;   
		   ...   
		   // Retrieves the value of a property of the object.   
		   public Object valueForKey(String key) {       
		      return NSKeyValueCoding.DefaultImplementation.valueForKey(this, key);   
		   }
		   // Sets the value of a property of the object.   
		   public void takeValueForKey(Object value, String key) {       
		      if (key.equals("rank")) {           
		         value = Integer.decode((String)value);       
		      }       
		      else if (key.equals("requestDate")) {           
		         NSTimestampFormatter formatter = new NSTimestampFormatter("%Y-%m-%d %H:%M:%S %z");           
		         try {               
		            value = formatter.parseObject((String)value);           
		         }           
		         catch (java.text.ParseException e) {             
		           // do something.           
		         }       
		      }       
		      NSKeyValueCoding.DefaultImplementation.takeValueForKey(this, value, key);   
		   } 
		   ...
		}
		

In the example above, type coercion was required for 2 member variables: rank and requestDate since they are not java.lang.String.


Reference 2393373
Problem The XML Framework reference doesn't specify the behavior to expect when you use the unmappedTagsKey attribute in a mapping model entity.
Description If your entity has the attribute unmappedTagsKey=myKey, any tags for which there is no specified mapping will be saved as key/value pairs in an NSMutableDictionary named myKey.
Workaround   None.

Reference 2399206
Problem The XML decoder cannot decode NSData that contains characters outside of the range of XML-allowed characters (those less than \u0020).
Description These characters will occur frequently when encoding or decoding NSData objects that represent images.
Workaround   None at this time. Avoid encoding or decoding images.

Reference 2425444
Problem When binding a date object to a WOTextField, you must also bind a formatter.
Description If you bind an NSTimestamp object to a WOTextField's value attribute but do not bind either a date format string to dateFormat or a formatter object to formatter, after submission the date object will be invalid. For example, entering '10/10/20' will store an NSTimestamp with a yearOfCommonEra: 1.
Workaround   Bind either the dateFormat or formatter attributes as well.

Reference 2428376
Problem Formatters can alter values associated with WOTextFields.
Description This problem appears when 1. you use a pattern that rounds the number, truncates times from date and time input, or performs any other lossy conversions and2. the form's submit action redisplays the same component.If the user enters a number that gets rounded by the formatter and submits the form, the rounded version appears in the text field. If the user submits the form again, the text field's value becomes the rounded version of the number.
Workaround   Change the formatter's pattern string so that it does not perform any lossy conversions (like rounding a number, truncating to only the month/day/year instead of full time, etc), use a custom formatter, or do not attach a formatter to the WOTextField. Alternatively, if your WOTextField is connected to the property of an EOEnterpriseObject, you can override the set method for the property so it rounds the same way the formatter does. For example, if the property holds an integer and the NSNumberFormatter discards fractional information, the value held in the property matches the value displayed by the text field, and no loss of information occurs.

Reference 2571405
Problem The WOXMLDecoder throws a WOXMLException when you try to decode an object with a key that contains spaces.
Description The previous version of the XML coder allows you to encode keys containing spaces, but throws when you try to decode these keys. (The current version of the XML coder also throws when you try to encode keys containing spaces.)
Workaround   Whenever you use the various encode or decode "for key" methods, make sure that the keys are valid XML names. Additionally, if you encode a NSDictionary with encodeObjectForKey, make sure the keys in the NSDictionary are valid XML names. Otherwise the encoding or decoding process may fail with a WOXMLException.

Reference 2574946
Problem WOXMLCoding has an additional method
Description There is a new classForCoder() method in the WOXMLCoding interface that is the same as the classForCoder() method in the NSCoding interface. The WOXMLCoder uses the method to specify the type attribute of an encoded object element.For the classes with built-in support from the WOXMLCoder that implement the NSCoding interface, the classForCoder() method that already exists gets used.
Workaround   N/A

Reference 2605569
Problem WOApplication.setDebuggingEnabled has been removed from API.
Description This functionality is now handled by NSLog.
Workaround   See the NSLog documentation.

Reference 2607502
Problem Some dynamic elements are deprecated.
Description WOQuicktime, WONestedList, WOCheckBoxList, and WORadioButtonList are deprecated components and are made available for compatibility only.
Workaround   The following alternatives exist for the deprecated elements.WOQuicktime -> JavaWOSmil framework and its classesWONestedList -> WOJExamples/WXNestedListWORadioButtonList -> WOJExamples/WXRadioButtonListWOCheckBoxList -> WOJExamples/WXCheckBoxList

Reference 2661559
Problem Project Builder WO, ProjectBuilder on Windows, and Project Builder on Mac OS X do not provide an intuitive way to adding a global server resource (e.g. Localizable.strings) for localized WebObjects applications.
Description For localized WebObjects applications, developers usually provide a default global resource(for example, flag.gif or Hello.wo). This resource is used when the language specified by the user's browser is not supported by the application. However, adding a global server resource (for example, Localizable.strings) is not intuitive in Project Builder WO, ProjectBuilder on Windows, and Project Builder on Mac OS X.
Workaround   Consider the Localizable.strings file as an example. For Project Builder WO (and ProjectBuilder on Windows), localize the file as per normal but do not remove the file from disk when prompted. On the UI, you will notice that it disappears as global server resource. Close the project. Edit the project's PB.project file using a text editor. Search for the "WOAPP_RESOURCES" key. ?Add "Localizable.strings" as part of the value, within the parentheses. Edit the Makefile. Search for the "GLOBAL_RESOURCES" key and append "Localizable.strings" to the value. Reopen the project.For Project Builder on Mac OS X, if the project was imported from Project Builder WO (or ProjectBuilder on Windows), then the global resource is handled correctly and appears in the "Resources" area and is labeled as "Global". If the project was created from scratch, first create "Localizable.strings" and localize it to the languages you want. Subsequently create another new file with the same name " Localizable.strings" and drag it to the "Resources" area.

Reference 2678075
Problem If you append a string to a response after you initialize the response's content to a NSData object, the content in the NSData object is forgotten.
Description WebObjects allows you to build a response by first initializing the content using setContent(String) or setContent(NSData), and then appending content using appendContentString(String) and appendContentData(NSData). However, there is an asymmetry in the WOResponse implementation: If you initialize the content with an NSData object and then append a string, WebObjects forgets the content in the NSData object.
Workaround   Don't use setContent(NSData) if you plan to append a string to the response. Instead, set the content to an empty string and then append the NSData object. After than you can append as many strings and NSData objects as you want.

Reference 2697244
Problem Cookies always expire when the browser gets closed.
Description WOCookie allows you to create cookies using the rfc2109 specification . Specifically, it allows you to set an integer instead of a date in order to expire the cookie. Unfortunately, even this specification has been out for some time some browsers do not support it and in consequence any information passed throw this header(max-age) gets ignored. The default behavior of the browser when no expiration information is passed is to expire the cookie after the session is closed.
Workaround   To ensure the best interoperability use WOCookie's api that handle dates instead: public static WOCookie cookieWithName (String aName, String aValue, String aPath, String aDomain, NSTimestamp aDate, boolean isSecure);public WOCookie(String aName, String aValue, String aPath, String aDomain, NSTimestamp aDate, boolean isSecure);or create a cookie with "public WOCookie(String aName, String aValue)" and later on set the expiration date using: public void setExpires(NSTimestamp aDate).

Reference 2710445
Problem Adding images inside of a folder causes problem for Project Builder projects.
Description If the images (or other resources) are inside of a folder in the project directory and they are added individually to the Resources or WebServerResources, Project Builder will end up copying them directly into the Resources or WebServerResources directory in the respective build product.However, you are faced with a conundrum. If you specify the name of the resources as "folderName/myImage.gif", for example, you will be able to find the image during development but not deployment. If you specify the name as "myImage.gif", you will be able to find the resource during deployment but not development.
Workaround   There isn't really a workaround, as this is the expected behavior for Project Builder (which differs greatly from ProjectBuilderWO). What you should do is add the folder that contains the resources (e.g. "folderName") as a folder reference to "Resources" or "WebServerResources"; do not add the individual resources directly. Project Builder will not directly keep track of the individual resources, but the directory hierarchy will be preserved when you build (e.g. "folderName" will exist in the "WebServerResources" directory in the build project, and "folderName" will contain all of your resources). This is essentially what is done for WebObjects component templates (directories ending with .wo, containing the HTML template and the WebObjects declarations). See the documentation for Project Builder for further details.

Reference 2732201
Problem Submitting data on a page from a frame doesn't seem to work.
Description If you have a page with frames and in one of them you submit some data that you want to reflect in the other frame, you will see that after the first page you get what looks like stale responses. The problem is that after the first request you start getting cached responses, as they're not going through the whole request response cycle. This is because from WOF 4.5 to 5.O the pageRefreshOnBacktrackEnabled default value changed from false to true to avoid problems with some proxy servers.
Workaround   In your application code call setPageRefreshOnBacktrackEnabled with false as an argument to avoid caching the responses. This problem should just be seen while using frames, as in this case when there is no way to distinguish between someone using the back arrow or someone using frames.

Reference 2788309
Problem WOFileUpload adds the ".bin" extension to certain files.
Description InternetExplorer:mac does not recognize certain extensions, such as ".plist", and converts all such files to MacBinary. Unfortunately, InternetExplorer:mac preserves the filename. In such cases, the WOFileUpload component appends the missing ".bin" extension.
Workaround   Ask each client using InternetExplorer:mac to define a File Helper for the file type, e.g., "Property List" for the extension ".plist".

Reference 2809459
Problem Formatters attached to a WOTextField have additional requirements.
Description Any Formatter attached to a WOTextField is required to support function composition using its format() and parseObject() methods. format(parseObject(format(obj))) and parseObject(format(parseObject(text))) must be legal operations. The parseObject() and format() methods need not be perfect inverse functions, but the results of the composition should be logical. For example, with a NSNumberFormatter set to round off any fractional data, the parseObject() method will initially return a real number. But after the initial format() invocation ensures the number conforms to this NSNumberFormatter's pattern, the number will always be the same integer, no matter how many parseObject() and format() operations are used.This is necessary as WOTextFields are both input and output elements, and forms may be resubmitted without change any number of times. Using function composition ensures that the value from the first form submission is the same value used in all subsequent form submissions, until the form value is actually changed by the user.
Workaround   Use another component, like a WOString, which is a display only element.

Reference 2809983
Problem I have recently upgraded to WebObjects 5.1. I have an application that uses dynamic elements, such as WOHyperlink, that has run fine in the past but now raises an exception.
Description Any application that make improper use of dynamic elements could raise an exception at runtime. For example, with WOHyperlink, forgetting to set one of the required bindings may result in a WODynamicElementCreationException. Please note that setting a constant"name" attribute does not suffice. If one wishes to create an anchor without setting any of the required bindings, a valid alternative is to create a WOGenericContainer with the letter "a" for the element name.
Workaround   When using dynamic elements, remember to set the values of required bindings. An easy way to check the validity of a component is to use the WebObjects Builder. Inspecting and attempting to save the component will help uncover validation errors.

Reference 2818115
Problem Unable to send email in Japanese using WOMailDelivery.
Description WOMailDelivery was implemented using sun.net.smtp.SmtpClient, which is no long supported by Sun. This class does not support alternate encodings.
Workaround   Subclass WOMailDelivery, and override the sendEmail method to use the JavaMail API instead of SmtpClient. Create a static method in your class to return an allocated, shared instance.


WebObjects

Reference 2304924
Problem WebObjects is not thread safe with component caching disabled.
Description WebObjects isn't thread safe when AllowsConcurrentHandling is set to YES and CachingEnabled is set to NO.
Workaround   When deploying WebObjects applications, be sure to set -WOCachingEnabled YES.

Reference 2364124
Problem Inner classes require special naming convention in the mapping coder.
Description Specifying the name of an inner class in a mapping model (such as MappingHelper.RelatedLinks) produces a 'NOClassDef' exception.
Workaround   The Sun VM expects the inner classes to be specified with their internal names. In the above example, use MappingHelper$RelatedLinks instead

Reference 2375462
Problem Display group queryOperator string queries behave differently from how they behaved in WebObjects releases prior to 4.5.
Description In previous versions, when you performed a string query with the query operator set to =, the result matched 'caseInsensitiveLike value*' instead of '= value'. This behavior has been fixed for 4.5.
Workaround   Use the "starts with" string qualifier operator. See the stringQualifierOperators method in the WODisplayGroup class specification for more information.

Reference 2688576
Problem Projects containing Java Client interface files fail to compile correctly.
Description When you save an interface file in a Java Client project, the Interface Builder palettes provided with WebObjects add additional information to them. If you rename an interface file in the file system, copy it with another name, or use Project Builder features to create platform or language variants, you need to open the new interface file in Interface Builder and explicitly save it to regenerate the Java Client-specific information.
Workaround   Open affected interface files in Interface Builder and save them explicitly.

Reference 2706712
Problem EOEditingContext complains about locking if used in a direct action.
Description Please see http://kbase.info.apple.com/cgi-bin/WebObjects/kbase.woa/wa/query?type=id&val=88184.
Workaround   Please read the aforementioned KnowledgeBase article.

Reference 2781643
Problem How does one specify persistent, per-user properties except via the command line?
Description The reference documentation for NSProperties indicated that this was possible through a file provided by default by the Java VM. There is no standard for such behavior, and very few JVMs support this.
Workaround   New behavior provided by the WebObjects runtime makes what was promised possible. Please see the reference documentation for NSProperties in the JavaFoundation framework.

Reference 2801365
Problem WOApplication.pageWithName(String, WORequest) has been removed.
Description WOApplication.pageWithName(String, WORequest) has been removed.
Workaround   Use WOApplication.pageWithName(String, WOApplication.application().createContextForRequest(WORequest)) instead.

Reference 2803077
Problem Subclassing Cocoa UI elements in Java does not work
Description It is not possible to subclass UI elements from the Interface Builder palettes to a Java class.
Workaround   Create an Objective C subclass and set the target to a JavaObject.

Reference 2806377
Problem Fatal exception when programmatically creating an EOEditingContext in a Cocoa/EOF java class.
Description In some circumstances, creating an EOEditingContext programmatically in a Cocoa/EOF java class throws a NullPointerException. Specifically when the editing context is created very early in the application startup phase, such as in the NSApplication delegate's constructor or applicationDidFinishLaunching delegate method AND there is no EOEditingContext instantiated in the related Nib file.
Workaround   Leave an EOEditingContext instance in the application's Nib files (One is added to the Nib for you by the WOAssistant).ORInvoke com.webobjects.eointerface.cocoa.EOCocoaUtilities.registerCocoaSet() before programmatically creating an EOEditingContext


WODeploymentGuide

Reference 2340057
Problem Requests to a WebObjects application cause stat calls in Netscape servers.
Description When observing a Netscape server using a tool such as "truss" with the NSAPI or CGI adaptor accepting requests for a WebObjects application, several stat calls are visible. This is indicative of the machine performing system calls to look up directories, which can have a detrimental impact on performance.
Workaround   The stat calls are primarily caused by the presence of a PathCheck directive in Netscape's obj.conf:PathCheck fn=find-pathinfoIf you are not using CGI programs (that is, the NSAPI adaptor with WebObjects and no other CGI programs), this directive can be removed to reduce the number of stat calls.

Reference 2408559
Problem Applications that launch from a terminal shell fail to launch under wotaskd.
Description This situation can occur when the application needs environment settings not available from wotaskd, which runs as root. In particular, an incorrect CLASSPATH environment variable can prevent an application from launching.If you su to root, the shell inherits your environment variables including CLASSPATH. These environment variables do not reflect the environment variables available when the application is started under wotaskd.
Workaround   Modify the wotaskd startup script to provide a CLASSPATH that includes all frameworks your application needs.

Reference 2424573
Problem A POST request to a WebObjects application via Apache 1.3 or later using the CGI adaptor results in null form values.
Description The latest version of Apache passes certain environment variables to the CGI adaptor that contain newline characters. The WebObjects CGI adaptor converts all of these environment variables to headers - which can confuse the application when parsing HTTP headers - resulting in the loss of form values.
Workaround   Use a CGI utility such as printenv (it may be installed by default in your cgi-bin directory but you may need to add execute permission) to determine if you have any environment variables being passed to CGI programs that contain newline characters. A common one is SERVER_SIGNATURE. Modify Apache's configuration file ServerSignature entry to be Off. It may also be possible to use the new SetEnvIf Directive, although this workaround has not been tested.

Reference 2425742
Problem Monitor's Path Wizard can be confused by the back button.
Description If you use the browser's back button in Monitor's Path Wizard, you may see an exception. Monitor is still running, however. The wizard is not correctly keeping track of the current page.
Workaround   Avoid using the browser back button when in the Path Wizard.


WODeveloper

Reference 2327908
Problem Java Client applications need the Java Plugin from Sun.
Description Running Java Client applications in browsers on Windows requires Sun's Java Plugin. Java Client applications run only on a Java 2 (JDK 1.2) or higher virtual machine.
Workaround   Java Client is well prepared for this requirement: In the WOJavaClientApplet element (typically in your project's Main.wo component), set the useJavaPlugin attribute to YES.

Reference 2803412
Problem "Value Type" column in EOModeler is not well described.
Description In EOModeler, the Value Type for an attribute can be set while editing an attribute in "Table Mode". If the "Value Type" column is not visible, use the pop-up menu labled "Add Column" in the lower left corner of the pane.

The Value Type of an attribute in an EOModel controls how the JDBC adaptor handles important details in its negotiations with the database. A Value Type is typically a single character.

For attributes with a Value Class of java.lang.Number the following value types are defined:
b = Byte
s = Short
i = Integer
l = Long
f = Float
d = Double
B = java.math.BigDecimal
c = Boolean

Since java.lang.Number is an abstract superclass, the Value Type controls which concrete class the JDBC adaptor should instantiate based on the raw data provided from the database.

It also controls which JDBC methods are used to send and retrieve the data to and from the database. For attributes with a Value Class of java.lang.String the following value types are defined:
<none>
c
S
C
E

These Value Types affect which method on the java.sql.PreparedStatement are used to transfer text data between the database and the JDBC adaptor. An empty Value Type is backward compatible behavior with WebObjects v4.5 and uses the setString() method if the text is less than the database's advertised maximum varchar length, and setCharacterStream(), if it is too large. If the database fails to advertise a maximum length, the default is 256 characters. A Value Type of 'S' uses setString() regardless of the text's length. A Value Type of 'C' uses setCharacterStream() regardless of the text's length. A Value Type of 'E' converts the text into raw UTF-8 bytes, and then uses setBinaryStream() to save them in a binary typed column in the database. The Value Type of 'c' tells the adaptor to generate SQL using RTRIM to strip off all trailing spaces, such as those found in CHAR columns.

'S' is appropriate for most text columns. 'C' is good for columns which usually contain large amounts of data. 'c' should be used when trailing spaces are not significant in a CHAR column. (It's better to use a VARCHAR column if possible.) We recommend against using 'E', except in extreme cases. It is the database's responsibility to handle text encoding issues, and using 'E' is usually an indication the database is not correctly configured.

For attributes with a Value Class of NSTimestamp the following value types are defined:
<none>
D
t
T
M

These value types affect how the data is transfer between the JDBC adaptor and the database. An empty Value Type uses get/setObject() on the ResultSet and PreparedStatement. It assumes the database can provide a value compatible with a java.sql.Timestamp. A 'D' indicates WebObject's JDBC adaptor should use get/setDate. A 't' indicates get/setTime(), and a 'T' uses get/setTimestamp(). The 'M' value type is a workaround for a bug in some MS SQLServer JDBC drivers. It only support java.sql.Date.

BLOB and CLOB columns are handled specially by the adaptor to support Oracle. The Value Type has no influence.

Workaround   See the description section for information on how to set the Value Type for an attribute.


WOExtensions

Reference 2369994
Problem WOTable WebObjects Extension specification is missing the cellWidth and tableWidth bindings.
Description The documentation should have the following bindings:tableWidth The width of the table. This attribute is passed to the HTML TABLE tag.cellWidth The width of the cells in the table. This attribute is passed to each HTML TD tag in the table.
Workaround   None needed.

Reference 2395684
Problem JSValidatedField WOExtensions component fails to check the validity of fields if the user does not tab through them.
Description The Java Script code for JSValidatedField is only invoked when the user tabs through the field. If the user submits the form without tabbing through the fields, the fields will not be validated.
Workaround   None.

Reference 2593451
Problem Previously, WOKeyValueConditional has lacked the negate binding.
Description In contrast to WOConditional, WOKeyValueConditional has lacked the negate binding in previous versions. The workaround has been to negate the value set in the condition binding.
Workaround   WOKeyValueConditional now has a negate binding. Components that currently use WOKeyValueConditional do not need to be modified to set the new binding. The default value of the negate binding is false, so the condition binding will not be negated.

Reference 2635508
Problem WOApplescript behaves incorrectly.
Description The WOAppleScript component is deprecated. You should not use this component.
Workaround   None.


WOJavaDoc

Reference 2417236
Problem Using InvalidateAllObjects or InvalidateObjectsWithGlobalIDs directly on an object store coordinator or database context can cause deadlocking problems with shared editing contexts.
Description When you invalidate objects via an editing context (shared or non-shared), the context's implementation insures that the shared context it knows about is completely unlocked for the duration of the invalidation process. This prevents deadlocking with locks in EOAccess. For example, if another thread already has locked EOAccess, but needs a shared context's writer lock, your application would deadlock if the current thread still had a reader lock on the shared context.
Workaround   If you need to invalidate objects directly via the object store coordinator or database context classes, be sure that your thread does not hold any locks on any shared contexts. If you are only using the default shared context, you can do this like so:EOSharedEditingContext.defaultSharedEditingContext().surrenderReaderLocks();
myCoordinator.invalidateAllObjects();
EOSharedEditingContext.defaultSharedEditingContext().retrieveReaderLocks();


WOJavaPBHelper

Reference 2600921
Problem If Project Builder crashes, rapid turnaround stops working.
Description If Project Builder crashes, a communication socket does not get cleaned up properly. This prevents future invocations of Project Builder from binding to the socket. The net effect is that rapid turnaround is broken.
Workaround   Reboot your machine.


WOJSPServlet

Reference 2760677
Problem Some makefile variables missing when adding JSP/Servlet support to a ProjectBuilderWO project.
Description When using ProjectBuilderWO, an existing project can add JSP/Servlet integration by adding the JavaWOJSPServlet.framework. However, this does not add some useful Makefile variables to the Makefile.preamble.
Workaround   The text to be added should be:
#
# Variables used for JSP and Servlet integration. In order for JSP and Servlet
# integration to work, the JavaWOJSPServlet framework must be added. All of these
# variables should be exported for use in the JSP/Servlet packaging script.
#
# If the JavaWOJSPServlet framework is added, a WEB-INF directory will be created
# inside the woa. SERVLET_APP_MODE below will also allow for creating a .war
# file from the WEB-INF for JSP or Servlet deployment.
#
# SERVLET_APP_MODE variable defines whether or not a war file should be generated.
# Should be either Deployment or Development (default).
# export SERVLET_APP_MODE = Deployment
#
# SERVLET_WEBAPPS_DIR variable defines the location to create the servlet context
# for this application. If SERVLET_APP_MODE = Deployment, a war file is
# created there, otherwise, the context is created as if a war file was
# unjarred there. $(DSTROOT) can be used as part of the definition.
# export SERVLET_WEBAPPS_DIR =
#
# SERVLET_COPY_JARS variable copies all included framework and application jars to
# the lib directory of the WEB-INF (and the war). This could potentially be
# slow, and large (several megabytes), so only set this if you are going to
# be using WebObjects classes directly from your JSP page or Servlet.
# export SERVLET_COPY_JARS = YES
#

Reference 2787861
Problem When frameworks are updated, some applications that use JSP/Servlet integration may need to be updated manually.
Description When a JSP/Servlet war archive is created, several jars are copied into the war file. At least one jar (WOJSPServlet_client.jar, from the WOJSPServlet.framework) is always copied, and additional framework jars may be copied into the war as well, depending on the project. The copying of additional jars is controlled by the SERVLET_COPY_JARS build/makefile setting.
Workaround   If frameworks are updated, either the application must be rebuilt (recreating the war archive), or the war archive must be manually updated, using the jar tool.

Reference 2812044
Problem When you try to build a JSP/Servlet project that has no .java files in ProjectBuilderWO, and have SERVLET_COPY_JARS = YES, the project will fail to build.
Description SERVLET_COPY_JARS = YES tells the build scripts to copy the application jar and the framework jars into the WAR archive. However, if there are no java source files directly in the Project (for instance, if the Project is a JSP application only referencing WebObjects Frameworks) the build will fail because it cannot find the created application jar.
Workaround   Simply create a "dummy" java file that will be compiled into a "dummy" jar, and the build will proceed.