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.
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.
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. |
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); } |
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.
OTHER_CLASSPATH = APPROOT/Contents/Resources/Java/ 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. |
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. |
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 |
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 |
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. |
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. |
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()); 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()); |
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. |
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: 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 |
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. |
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 |
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" |
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). |
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. |
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 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 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. |
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. |
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. |
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. |
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). |
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. |
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())); |
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. |
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. |
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 |
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. |
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: 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: 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: 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. |
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. |
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(); |
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. |
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. |