From 9dab20edbb3ddbe12e425f7b9752d02f51cc9371 Mon Sep 17 00:00:00 2001 From: D Tim Cummings Date: Thu, 28 Feb 2019 06:45:17 +1000 Subject: [PATCH 01/13] Reformat so human legible --- .../AjaxAutoComplete.wo/AjaxAutoComplete.html | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html b/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html index 31cc846ae0e..032dd695f1d 100644 --- a/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html +++ b/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html @@ -1 +1,16 @@ - \ No newline at end of file + + + + + + + + + + \ No newline at end of file From a93555630136908297e7922eac585b42ef104855 Mon Sep 17 00:00:00 2001 From: D Tim Cummings Date: Fri, 1 Mar 2019 08:02:17 +1000 Subject: [PATCH 02/13] Fix AutoComplete div nesting so compatible with prototype 1.7.3 Otherwise scrolling of page before typing in text field would cause drop-down menu to appear offset from correct position by the amount page had been scrolled. --- .../Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html b/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html index 032dd695f1d..3c874366416 100644 --- a/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html +++ b/Frameworks/Ajax/Ajax/Components/AjaxAutoComplete.wo/AjaxAutoComplete.html @@ -3,7 +3,7 @@ - + \n"); res.appendContentString(String.valueOf(str)); } else { - String actionUrl = AjaxUtils.ajaxComponentActionUrl(ctx); AjaxUtils.appendScriptHeader(res); res.appendContentString("new Ajax.Autocompleter('" + fieldName + "', '" + divName + "', '" + actionUrl + "', "); - AjaxOptions.appendToResponse(createAjaxOptions(), res, ctx); + AjaxOptions.appendToResponse(options, res, ctx); res.appendContentString(");"); AjaxUtils.appendScriptFooter(res); } From 3bb37d831b39b5e53c1d1ac1501d8fa710bd2581 Mon Sep 17 00:00:00 2001 From: Markus Stoll Date: Tue, 16 Apr 2019 16:03:10 +0200 Subject: [PATCH 04/13] bugfix, idicator is only a string containing the container id --- Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java b/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java index e28928e674a..b12a1a37519 100644 --- a/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java +++ b/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxAutoComplete.java @@ -159,7 +159,7 @@ protected NSDictionary createAjaxOptions() { ajaxOptionsArray.addObject(new AjaxOption("tokens", AjaxOption.STRING_ARRAY)); ajaxOptionsArray.addObject(new AjaxOption("frequency", AjaxOption.NUMBER)); ajaxOptionsArray.addObject(new AjaxOption("minChars", AjaxOption.NUMBER)); - ajaxOptionsArray.addObject(new AjaxOption("indicator", indicator(), AjaxOption.SCRIPT)); + ajaxOptionsArray.addObject(new AjaxOption("indicator", indicator(), AjaxOption.STRING)); ajaxOptionsArray.addObject(new AjaxOption("updateElement", AjaxOption.SCRIPT)); ajaxOptionsArray.addObject(new AjaxOption("afterUpdateElement", AjaxOption.SCRIPT)); ajaxOptionsArray.addObject(new AjaxOption("onShow", AjaxOption.SCRIPT)); From 4115f3eaa073e2393e83ee3ce3b3025768568100 Mon Sep 17 00:00:00 2001 From: Markus Stoll Date: Thu, 18 Apr 2019 13:19:00 +0200 Subject: [PATCH 05/13] maven: disable parallel builds --- .mvn/maven.config | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .mvn/maven.config diff --git a/.mvn/maven.config b/.mvn/maven.config deleted file mode 100644 index 3944d880ef2..00000000000 --- a/.mvn/maven.config +++ /dev/null @@ -1 +0,0 @@ --T1C From dc6189c57a4c46522dd065f136493c044dc672cd Mon Sep 17 00:00:00 2001 From: Samuel Pelletier Date: Thu, 2 May 2019 11:20:08 -0400 Subject: [PATCH 06/13] Add generics infos to EOGlobalId conversion methods. --- .../extensions/eof/ERXEOControlUtilities.java | 42 ++++++++++--------- .../extensions/eof/ERXFetchResultCache.java | 2 +- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java index 33fda213e33..a9cb3e000cc 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java @@ -1871,15 +1871,16 @@ public static EOQualifier localInstancesInQualifier(EOEditingContext ec, EOQuali * @param eos the NSArray of EOEnterpriseObjects * @return a NSArray of EOGlobalIDs */ - public static NSArray globalIDsForObjects(NSArray eos) { - int c = eos != null ? eos.count() : 0; - NSMutableArray ids = new NSMutableArray(c); - for (int i = 0; i < c; i++) { - EOEnterpriseObject eo = (EOEnterpriseObject)eos.objectAtIndex(i); + public static NSArray globalIDsForObjects(NSArray eos) { + if (eos == null) { + return new NSArray<>(); + } + NSMutableArray ids = new NSMutableArray(eos.count()); + for (EOEnterpriseObject eo : eos) { EOEditingContext ec = eo.editingContext(); EOGlobalID gid = ec.globalIDForObject(eo); ids.addObject(gid); - } + } return ids; } @@ -1887,18 +1888,21 @@ public static NSArray globalIDsForObjects(NSArray eos) { * Aggregate method for EOEditingContext.objectForGlobalID(). * NOTE: this only returns objects that are already registered, if you * need all objects from the GIDs, use {@link #faultsForGlobalIDs(EOEditingContext, NSArray)}. + * @param ec the EOEditingContext in which the EOEnterpriseObjects should be faulted + * @param globalIDs the EOGlobalIDs + * @return a NSArray of EOEnterpriseObjects * @see com.webobjects.eocontrol.EOEditingContext#objectForGlobalID(EOGlobalID) */ - public static NSArray objectsForGlobalIDs(final EOEditingContext ec, final NSArray globalIDs) { - NSArray result = null; + public static NSArray objectsForGlobalIDs(final EOEditingContext ec, final NSArray globalIDs) { + NSArray result = null; if ( globalIDs != null && globalIDs.count() > 0 ) { - final NSMutableArray a = new NSMutableArray(); - final Enumeration e = globalIDs.objectEnumerator(); + final NSMutableArray a = new NSMutableArray<>(); + final Enumeration e = globalIDs.objectEnumerator(); while ( e.hasMoreElements() ) { - final EOGlobalID theGID = (EOGlobalID)e.nextElement(); - final EOEnterpriseObject theObject = ec.faultForGlobalID(theGID, ec); + final EOGlobalID theGID = e.nextElement(); + final T theObject = (T) ec.faultForGlobalID(theGID, ec); if ( theObject != null ) a.addObject(theObject); @@ -1915,23 +1919,23 @@ public static NSArray objectsForGlobalIDs(final EOEditingContext ec, final NSArr * @param gids the EOGlobalIDs * @return a NSArray of EOEnterpriseObjects */ - public static NSArray faultsForGlobalIDs(EOEditingContext ec, NSArray gids) { + public static NSArray faultsForGlobalIDs(EOEditingContext ec, NSArray gids) { int c = gids.count(); - NSMutableArray a = new NSMutableArray(c); + NSMutableArray a = new NSMutableArray<>(c); for (int i = 0; i < c; i++) { - EOGlobalID gid = (EOGlobalID)gids.objectAtIndex(i); - EOEnterpriseObject eo = ec.faultForGlobalID(gid, ec); + EOGlobalID gid = gids.objectAtIndex(i); + T eo = (T) ec.faultForGlobalID(gid, ec); a.addObject(eo); } return a; } - public static NSArray faultsForRawRowsFromEntity(EOEditingContext ec, NSArray primKeys, String entityName) { + public static NSArray faultsForRawRowsFromEntity(EOEditingContext ec, NSArray primKeys, String entityName) { int c = primKeys.count(); - NSMutableArray a = new NSMutableArray(c); + NSMutableArray a = new NSMutableArray<>(c); for (int i = 0; i < c; i++) { NSDictionary pkDict = (NSDictionary)primKeys.objectAtIndex(i); - EOEnterpriseObject eo = ec.faultForRawRow(pkDict, entityName); + T eo = (T) ec.faultForRawRow(pkDict, entityName); a.addObject(eo); } return a; diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXFetchResultCache.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXFetchResultCache.java index 3880beff60a..4b3c86fb7f1 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXFetchResultCache.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXFetchResultCache.java @@ -117,7 +117,7 @@ protected long cacheTime(NSArray eos, EOFetchSpecification fs) { * @param eos * @param fs */ - public void setObjectsForFetchSpecification(EODatabaseContext dbc, EOEditingContext ec, NSArray eos, EOFetchSpecification fs) { + public void setObjectsForFetchSpecification(EODatabaseContext dbc, EOEditingContext ec, NSArray eos, EOFetchSpecification fs) { String identifier = ERXFetchSpecification.identifierForFetchSpec(fs); synchronized (cache) { currentDatabase = dbc.database(); From 6c41c8c560529c1440ec9820b90e38167c3a39f2 Mon Sep 17 00:00:00 2001 From: Samuel Pelletier Date: Thu, 2 May 2019 11:23:55 -0400 Subject: [PATCH 07/13] Add NSData support to ERRest json serialization. --- Frameworks/EOF/ERRest/Sources/er/rest/ERXRestUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestUtils.java b/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestUtils.java index a70d230078b..2442a8d16de 100644 --- a/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestUtils.java +++ b/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestUtils.java @@ -10,6 +10,7 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQuery; +import java.util.Base64; import java.util.Calendar; import java.util.Date; @@ -172,6 +173,9 @@ else if (value instanceof OffsetDateTime) { else if (value instanceof NSData && ((NSData)value).length() == 24) { formattedValue = NSPropertyListSerialization.stringFromPropertyList(value); } + else if (value instanceof NSData) { + formattedValue = Base64.getEncoder().encodeToString(((NSData) value).bytes()); + } else { formattedValue = value.toString(); } @@ -445,7 +449,7 @@ else if (valueType != null && TemporalAccessor.class.isAssignableFrom(valueType) } else { TemporalQuery query = null; - Class valueTypeClass = valueType.getClass(); + Class valueTypeClass = valueType; if (valueTypeClass.equals(LocalDate.class)) { query = LocalDate::from; } From 391f3884a3c9755497cd34628a16d24e444e6cdf Mon Sep 17 00:00:00 2001 From: Johann Werner Date: Thu, 16 May 2019 17:50:48 +0200 Subject: [PATCH 08/13] git should ignore the build directory --- Frameworks/Mail/ERCMail/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 Frameworks/Mail/ERCMail/.gitignore diff --git a/Frameworks/Mail/ERCMail/.gitignore b/Frameworks/Mail/ERCMail/.gitignore new file mode 100644 index 00000000000..378eac25d31 --- /dev/null +++ b/Frameworks/Mail/ERCMail/.gitignore @@ -0,0 +1 @@ +build From 2ca3909dc05216e16a7740c23e3e7538dd786c3e Mon Sep 17 00:00:00 2001 From: Johann Werner Date: Thu, 16 May 2019 17:51:37 +0200 Subject: [PATCH 09/13] account for redirects when getting WO disk image files --- .../er/woinstaller/WebObjectsInstaller.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Utilities/WOInstall/Sources/er/woinstaller/WebObjectsInstaller.java b/Utilities/WOInstall/Sources/er/woinstaller/WebObjectsInstaller.java index 12a3b07bf2e..2fc82f7d1c9 100644 --- a/Utilities/WOInstall/Sources/er/woinstaller/WebObjectsInstaller.java +++ b/Utilities/WOInstall/Sources/er/woinstaller/WebObjectsInstaller.java @@ -5,8 +5,11 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; @@ -113,13 +116,16 @@ else if (!destinationFolder.mkdirs()) { protected InputStream getInputStream(IWOInstallerProgressMonitor progressMonitor) throws IOException { File woDmgFile = null; + InputStream woDmgIs = null; if ("file".equals(woDmgUri.getScheme())) { woDmgFile = new File(woDmgUri); if (!woDmgFile.exists()) { throw new IllegalStateException("The file " + woDmgFile.getName() + " was not found"); } + woDmgIs = new BufferedInputStream(new FileInputStream(woDmgFile)); + } else { + woDmgIs = new BufferedInputStream(urlToInputStream(woDmgUri.toURL())); } - InputStream woDmgIs = new BufferedInputStream(woDmgFile == null ? woDmgUri.toURL().openStream() : new FileInputStream(woDmgFile)); InputStream woPaxGZIs; if (woVersion == 53) { @@ -132,7 +138,32 @@ protected InputStream getInputStream(IWOInstallerProgressMonitor progressMonitor } return new GZIPInputStream(woPaxGZIs); } - + + private InputStream urlToInputStream(URL url) { + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + connection.connect(); + int responseCode = connection.getResponseCode(); + if (responseCode < 400 && responseCode > 299) { + String redirectUrl = connection.getHeaderField("Location"); + try { + URL newUrl = new URL(redirectUrl); + return urlToInputStream(newUrl); + } catch (MalformedURLException e) { + URL newUrl = new URL(url.getProtocol() + "://" + url.getHost() + redirectUrl); + return urlToInputStream(newUrl); + } + } + + return connection.getInputStream(); + } catch (Exception e) { + throw new RuntimeException(e); + } +} + protected long getLength() { return rawLength; } From 0feace32d69ff5c89802273ed2a959b5cab2ce78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Thu, 6 Jun 2019 17:58:49 +0200 Subject: [PATCH 10/13] added womonitor REST call for setting instance arguments --- .../webobjects/monitor/application/AdminAction.java | 8 +++++++- .../monitor/application/AdminApplicationsPage.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java index f28707dac42..e3a1aa0f2b2 100644 --- a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java +++ b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java @@ -478,6 +478,12 @@ public void weeklyScheduleRangeAction() { applicationsPage().weeklyStartHours(instances, Integer.parseInt(beginScheduleWindow), Integer.parseInt(endScheduleWindow), Integer.parseInt(weekDay)); } + public void setAdditionalArgsAction() { + String arguments = (String) context().request().formValueForKey("args"); + if (arguments != null) + applicationsPage().setAdditionalArgs(instances, arguments); + } + public void turnScheduledOnAction() { applicationsPage().turnScheduledOn(instances); } @@ -635,4 +641,4 @@ public WOActionResults performActionNamed(String s) { public Session mySession() { return (Session) session(); } -} \ No newline at end of file +} diff --git a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminApplicationsPage.java b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminApplicationsPage.java index 4c070c229e5..9af11af5e9f 100644 --- a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminApplicationsPage.java +++ b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminApplicationsPage.java @@ -168,6 +168,18 @@ public void turnScheduledOff(NSArray nsarray) { sendUpdateInstancesToWotaskds(); } + public void setAdditionalArgs(NSArray instances, String arguments) { + for(Enumeration enumeration = instances.objectEnumerator(); enumeration.hasMoreElements();) { + MInstance instance = (MInstance) enumeration.nextElement(); + String instArgs = instance.additionalArgs(); + if (instArgs == null || !arguments.equals(instArgs)) { + instance.setAdditionalArgs(arguments); + processedInstance(instance); + } + } + sendUpdateInstancesToWotaskds(); + } + public void turnRefuseNewSessionsOn(NSArray nsarray) { for(Enumeration enumeration = nsarray.objectEnumerator(); enumeration.hasMoreElements();) { MInstance minstance = (MInstance) enumeration.nextElement(); From 71bbfc81ca19fa542b86003b1d7d0ecefa653c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Fri, 7 Jun 2019 09:10:29 +0200 Subject: [PATCH 11/13] documentation for the admin/setAdditionalArgs REST call --- .../monitor/application/AdminAction.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java index e3a1aa0f2b2..36beb2cd7a0 100644 --- a/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java +++ b/Applications/JavaMonitor/Sources/com/webobjects/monitor/application/AdminAction.java @@ -117,6 +117,12 @@ * bounces the application (starts a few instances per hosts, set the rest to refusing sessions and auto-recover) * * + * setAdditionalArgs + * 'OK' or
+ * error message + * updates the instances' additional command line arguments + * + * * info * JSON or
* error message @@ -191,6 +197,21 @@ * *

*

+ * The direct action setAdditionalArgs must be invoked with the following argument: + * + * + * + * + * + * + * + * + * + * + * + *
ArgumentValueDescription
argsstringthe additional arguments to be passed to the instance on startup
+ *

+ *

* Possible status codes: * * From a4bedcd7d6c784408984c147c033b0ec08f8ad98 Mon Sep 17 00:00:00 2001 From: Samuel Pelletier Date: Thu, 13 Jun 2019 19:33:12 -0400 Subject: [PATCH 12/13] Add support for attributes using Factory or Conversion classes and methods to ERXQuery. --- .../Sources/er/extensions/eof/ERXQuery.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java index e08a2b1b566..a735190703b 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java @@ -851,6 +851,18 @@ protected static void setupAdaptorChannelEOAttributes(EOAdaptorChannel adaptorCh if (externalType != null) adaptorSelectAttribute.setExternalType(externalType); if (className != null) adaptorSelectAttribute.setClassName(className); if (valueType != null) adaptorSelectAttribute.setValueType(valueType); + + adaptorSelectAttribute.setAdaptorValueConversionClassName(selectAttribute.adaptorValueConversionClassName()); + adaptorSelectAttribute.setAdaptorValueConversionMethodName(selectAttribute.adaptorValueConversionMethodName()); + adaptorSelectAttribute.setFactoryMethodArgumentType(selectAttribute.factoryMethodArgumentType()); + adaptorSelectAttribute.setValueFactoryMethodName(selectAttribute.valueFactoryMethodName()); + // Defined in the ERXAttributeExtension EOAttribute but not visible by the compiler we use a runtime trick... + // adaptorSelectAttribute.setValueFactoryClassName(selectAttribute.valueFactoryClassName()); + try { + String valueFactoryClassName = (String) NSKeyValueCoding.DefaultImplementation.valueForKey(selectAttribute, "valueFactoryClassName"); + NSKeyValueCoding.DefaultImplementation.takeValueForKey(adaptorSelectAttribute, valueFactoryClassName, "valueFactoryClassName"); + } + catch (Exception e) {} // Fail if ERXAttributeExtension is not loaded but you cannot use factory class anyway } adaptorChannel.setAttributesToFetch(adaptorSelectAttributes); } From 2d0dd4cc4f445885fe01a1a7e054f7c2448598b2 Mon Sep 17 00:00:00 2001 From: Samuel Pelletier Date: Thu, 13 Jun 2019 19:35:27 -0400 Subject: [PATCH 13/13] Simplify ERXQuery's formatValueForAttributeForInlineUse method and add support for NSData and custom classes. --- .../Sources/er/extensions/eof/ERXQuery.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java index a735190703b..ef44c54ad3f 100644 --- a/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java +++ b/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXQuery.java @@ -4,6 +4,7 @@ import java.lang.reflect.InvocationTargetException; import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.regex.Matcher; @@ -28,6 +29,7 @@ import com.webobjects.eocontrol.EOQualifier; import com.webobjects.eocontrol.EOSortOrdering; import com.webobjects.foundation.NSArray; +import com.webobjects.foundation.NSData; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSForwardException; import com.webobjects.foundation.NSKeyValueCoding; @@ -43,6 +45,7 @@ import er.extensions.eof.ERXEOAccessUtilities.ChannelAction; import er.extensions.foundation.ERXProperties; +import er.extensions.foundation.ERXStringUtilities; import er.extensions.jdbc.ERXSQLHelper; /** @@ -1824,24 +1827,19 @@ protected String formatValueForAttributeForInlineUse(EOSQLExpression sqlExpressi // If the formattedValue is "NULL" then the formatValueForAttribute() did not // do its job and we'll do the best we can here if (formattedValue == null || formattedValue.equals("NULL")) { - if (value instanceof String) { - formattedValue = sqlExpression.formatStringValue((String)value); - } else if (value instanceof NSTimestamp) { - NSTimestamp timestamp = (NSTimestamp) value; - formattedValue = formattedTimestampForInlineUse(sqlExpression, timestamp, attribute); - } else if (value instanceof Boolean) { - boolean boolValue = (Boolean) value; - // If stored in the database as a string then format as string - // otherwise format as a number 1 or 0. - if (attribute.externalType().toLowerCase().contains("char")) { - formattedValue = "'" + boolValue +"'"; - } else if (boolValue) { - formattedValue = EOSQLExpression.sqlStringForNumber(1); - } else { - formattedValue = EOSQLExpression.sqlStringForNumber(0); - } + // Ask the attribute to convert the value to adaptor type, this reduce the number of cases. + // Possible value type are now String, Date, Number or NSData + Object attributeValue = attribute.adaptorValueByConvertingAttributeValue(value); + if (attributeValue instanceof String) { + formattedValue = sqlExpression.formatStringValue((String)attributeValue); + } else if (attributeValue instanceof Date) { + Date date = (Date) attributeValue; + formattedValue = formattedTimestampForInlineUse(sqlExpression, date, attribute); + } else if (value instanceof NSData) { + NSData data = (NSData) value; + formattedValue = "X'" + ERXStringUtilities.byteArrayToHexString(data._bytesNoCopy()) + "'"; } else { - formattedValue = value.toString(); + formattedValue = attributeValue.toString(); } } } @@ -1857,7 +1855,7 @@ protected String databaseProductName(EOEntity entity) { return plugin.databaseProductName().toLowerCase(); } - protected String formattedTimestampForInlineUse(EOSQLExpression sqlExpression, NSTimestamp timestamp, EOAttribute attribute) { + protected String formattedTimestampForInlineUse(EOSQLExpression sqlExpression, Date timestamp, EOAttribute attribute) { EOEntity entity = attribute.entity(); String databaseProductName = databaseProductName(entity); //NSTimestampFormatter formatter = new NSTimestampFormatter("%Y-%m-%d %H:%M:%S");