From: <ms...@us...> - 2010-10-22 15:33:15
|
Revision: 11616 http://wonder.svn.sourceforge.net/wonder/?rev=11616&view=rev Author: mschrag Date: 2010-10-22 15:33:05 +0000 (Fri, 22 Oct 2010) Log Message: ----------- trunk merge + i give up trying to get those mergeinfos on ibox to go away ... they just keep coming back Modified Paths: -------------- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/DirectAction.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LifebeatRequestHandler.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LocalMonitor.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Ajax/AjaxExample2/Resources/Properties branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxRemoteLogging.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/wonder.js branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/BusinessLogic/ERAttachment/Sources/er/attachment/package.html branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOPasswordField.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOTextField.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/foundation/ERXPatcher.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERJars/.classpath branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERProfiling/Sources/er/profiling/PFProfiler.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/JavaMonitorFramework/Sources/com/webobjects/monitor/_private/MHost.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/JavaMonitorFramework/Sources/com/webobjects/monitor/_private/MInstance.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/JavaMonitorFramework/Sources/com/webobjects/monitor/_private/MSiteConfig.java Added Paths: ----------- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/MInstanceTask.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXUnmodeledToManyRelationship.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERJars/Libraries/log4j-1.2.16.jar Removed Paths: ------------- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERJars/Libraries/log4j-1.2.14.jar Property Changed: ---------------- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.css branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.extras.js branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.js branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/bg.png branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/indicator.gif branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox/darkbox.css branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/closelabel.gif branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/loading.gif branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/lightbox.css branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/logging/ERXLog4JConfiguration.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERWorkerChannel/Tests/er/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERWorkerChannel/Tests/er/workerchannel/ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERWorkerChannel/Tests/er/workerchannel/ERTestClientThread.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERWorkerChannel/Tests/er/workerchannel/ERTestWorkUnit.java branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Misc/ERWorkerChannel/Tests/er/workerchannel/ERWorkerThredsTestCase.java Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/Wonder:11280-11593 + /trunk/Wonder:11280-11615 Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/DirectAction.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/DirectAction.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/DirectAction.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -1,10 +1,10 @@ package com.webobjects.monitor.wotaskd; /* -\xA9 Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. +� Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. -IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (\xD2Apple\xD3) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. +IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (�Apple�) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. -In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple\xD5s copyrights in this original Apple software (the \xD2Apple Software\xD3), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. +In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple�s copyrights in this original Apple software (the �Apple Software�), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. @@ -12,6 +12,7 @@ SUCH DAMAGE. */ + import java.util.Enumeration; import com.webobjects.appserver.WOActionResults; @@ -413,11 +414,18 @@ } else { try { if (command.equals("STOP")) { - theApplication.localMonitor().terminateInstance(anInstance); + //we need to expect a response here + if (theApplication.localMonitor().terminateInstance(anInstance) == null) + throw new MonitorException("No response to STOP " + anInstance.displayName()); } else if (command.equals("REFUSE")) { - theApplication.localMonitor().stopInstance(anInstance); + //we need to expect a response here + if (theApplication.localMonitor().stopInstance(anInstance) == null) + throw new MonitorException("No response to REFUSE " + anInstance.displayName()); } else if (command.equals("ACCEPT")) { - theApplication.localMonitor().setAcceptInstance(anInstance); + if (theApplication.localMonitor().setAcceptInstance(anInstance) == null) + throw new MonitorException("No response to ACCEPT " + anInstance.displayName()); + //we got a response, cancel any force quit task + anInstance.cancelForceQuitTask(); } else if (command.equals("QUIT")) { anInstance.setShouldDie(true); } @@ -538,6 +546,8 @@ String error = anInstance.statisticsError(); if (error != null) { errorResponse.addObject(error); + //reset the error + anInstance.resetStatisticsError(); } // Continue, because wotaskd is expecting a response here. @@ -606,6 +616,11 @@ (NSLog.debugLoggingAllowedForLevelAndGroups(NSLog.DebugLevelCritical, NSLog.DebugGroupDeployment)) ) { NSLog.debug.appendln("Exception getting Statistics for instance: " + ((MInstance) instanceArray.objectAtIndex(j)).displayName()); } + //if we get an exception and the instance state is running, that could mean the app may have been too + //busy to respond of may have locked up in either case, we need to notify + //java monitor which instance its having problems with + if (badInstance.isRunning_W()) + badInstance.setStatisticsError(me.getMessage()); responses[j] = null; } } @@ -622,8 +637,8 @@ for (int i=0; i<theCount; i++) { WOResponse aResponse = responses[i]; + MInstance anInstance = (MInstance) instArray.objectAtIndex(i); if (aResponse != null) { - MInstance anInstance = (MInstance) instArray.objectAtIndex(i); anInstance.updateRegistration(new NSTimestamp()); if (aResponse.headerForKey("x-webobjects-refusenewsessions") != null) { anInstance.setRefusingNewSessions(true); @@ -679,6 +694,10 @@ NSLog.err.appendln("Wotaskd getStatisticsForInstanceArray: Error parsing PList: " + queryInstanceResponse + " from " + anInstance.displayName()); } } + else if (anInstance.isRunning_M()) { + //display a hint that this instance is running but did not respond to a query statistics request + anInstance.setStatisticsError("No statistics for " + anInstance.displayName()); + } } } @@ -923,4 +942,5 @@ aResponse.appendContentString(portString); return aResponse; } + } Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LifebeatRequestHandler.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LifebeatRequestHandler.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LifebeatRequestHandler.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -1,10 +1,10 @@ package com.webobjects.monitor.wotaskd; /* -\xA9 Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. +� Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. -IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (\xD2Apple\xD3) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. +IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (�Apple�) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. -In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple\xD5s copyrights in this original Apple software (the \xD2Apple Software\xD3), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. +In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple�s copyrights in this original Apple software (the �Apple Software�), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. @@ -188,6 +188,7 @@ if (instance != null) { instance.registerStop(new NSTimestamp()); instance.setShouldDie(false); + instance.cancelForceQuitTask(); } } finally { theApplication._lock.endReading(); @@ -205,6 +206,7 @@ if (instance != null) { instance.registerCrash(new NSTimestamp()); instance.setShouldDie(false); + instance.cancelForceQuitTask(); } } finally { theApplication._lock.endReading(); Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LocalMonitor.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LocalMonitor.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/LocalMonitor.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -1,10 +1,10 @@ package com.webobjects.monitor.wotaskd; /* -\xA9 Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. +� Copyright 2006 - 2007 Apple Computer, Inc. All rights reserved. -IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (\xD2Apple\xD3) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. +IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. (�Apple�) in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. -In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple\xD5s copyrights in this original Apple software (the \xD2Apple Software\xD3), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. +In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple�s copyrights in this original Apple software (the �Apple Software�), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. @@ -45,6 +45,8 @@ import com.webobjects.monitor._private.ProtoLocalMonitor; import com.webobjects.monitor._private.String_Extensions; +import er.extensions.foundation.ERXProperties; + public class LocalMonitor extends ProtoLocalMonitor { WOTimer aScheduleTimer; WOTimer anAutoRecoverTimer; @@ -54,6 +56,9 @@ boolean _shouldUseSpawn = true; String spawningGrounds = null; Application theApplication = (Application )WOApplication.application(); + final int _forceQuitDelay = ERXProperties.intForKeyWithDefault("WOTaskd.killTimeout", 120000); + final int _receiveTimeout = ERXProperties.intForKeyWithDefault("WOTaskd.receiveTimeout", 5000); + final boolean _forceQuitTaskEnabled = ERXProperties.booleanForKeyWithDefault("WOTaskd.forceQuitTaskEnabled", false); public LocalMonitor() { @@ -442,6 +447,19 @@ public WOResponse terminateInstance(MInstance anInstance) throws MonitorException { if (!anInstance.isRunning_W()) return null; + + //if WOTaskd.forceQuitTaskEnabled is true, setup a task to check + //the instance, if it still doesn't die, then force a QUIT command when + //the timer elapses, minimum is 60 seconds, default 120 seconds + if (_forceQuitTaskEnabled) { + if (_forceQuitDelay >= 60000) { + anInstance.scheduleForceQuit(new MInstanceTask.ForceQuit(anInstance), _forceQuitDelay); + } + else { + NSLog.err.appendln("WOtaskd.killTimeout: " + _forceQuitDelay + " is too small. 60000 milliseconds is the minimum"); + } + } + catchInstanceErrors(anInstance); NSDictionary xmlDict = createInstanceRequestDictionary("TERMINATE", null, anInstance); return sendInstanceRequest(anInstance, xmlDict); @@ -449,6 +467,20 @@ public WOResponse stopInstance(MInstance anInstance) throws MonitorException { if (!anInstance.isRunning_W()) return null; + + //if WOTaskd.forceQuitTaskEnabled is true, setup a task to check the instance, this will retry WOTaskd.refuseNumRetries times + //the timer elapses minimum is 60 seconds, default 3600 seconds (the default session timeout) + //a force quit if WOTaskd.refuseNumRetries is reached and the instance is still alive + //an ACCEPT will cancel the monitoring + if (_forceQuitTaskEnabled) { + if (_forceQuitDelay >= 60000) { + anInstance.scheduleRefuseTask(new MInstanceTask.Refuse(anInstance, ERXProperties.intForKeyWithDefault("WOTaskd.refuseNumRetries", 3)), _forceQuitDelay, _forceQuitDelay); + } + else { + NSLog.err.appendln("WOtaskd.killTimeout: " + _forceQuitDelay + " is too small. 60000 milliseconds is the minimum"); + } + } + catchInstanceErrors(anInstance); NSDictionary xmlDict = createInstanceRequestDictionary("REFUSE", null, anInstance); return sendInstanceRequest(anInstance, xmlDict); @@ -490,7 +522,7 @@ try { WOHTTPConnection anHTTPConnection = new WOHTTPConnection(anInstance.host().name(), anInstance.port().intValue()); - anHTTPConnection.setReceiveTimeout(5000); + anHTTPConnection.setReceiveTimeout(_receiveTimeout); boolean requestSucceeded = anHTTPConnection.sendRequest(aRequest); Copied: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/MInstanceTask.java (from rev 11615, trunk/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/MInstanceTask.java) =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/MInstanceTask.java (rev 0) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Applications/wotaskd/Sources/com/webobjects/monitor/wotaskd/MInstanceTask.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -0,0 +1,90 @@ +package com.webobjects.monitor.wotaskd; + +import java.util.TimerTask; + +import com.webobjects.appserver.WOApplication; +import com.webobjects.foundation.NSLog; +import com.webobjects.monitor._private.MInstance; +import com.webobjects.monitor._private.MonitorException; + +public abstract class MInstanceTask extends TimerTask { + + MInstance _instance; + + public MInstanceTask(MInstance instance) { + super(); + _instance = instance; + } + + public static class ForceQuit extends MInstanceTask { + + public ForceQuit(MInstance instance) { + super(instance); + } + + @Override + public void run() { + Application app = (Application) WOApplication.application(); + app._lock.startReading(); + try { + _instance.setShouldDie(true); + _instance.setForceQuitTask(null); + cancel(); + } + finally { + app._lock.endReading(); + } + } + + } + + public static class Refuse extends MInstanceTask { + + private int _numberOfRetriesBeforeForceQuit; + private int retries = 0; + + public Refuse(MInstance instance, int numberOfRetriesBeforeForceQuit) { + super(instance); + _numberOfRetriesBeforeForceQuit = numberOfRetriesBeforeForceQuit; + } + + @Override + public void run() { + + Application app = (Application) WOApplication.application(); + app._lock.startReading(); + LocalMonitor localMonitor = app.localMonitor(); + try { + + if (retries >= _numberOfRetriesBeforeForceQuit) { + //we only send a force quit if the instance is still running + if (_instance.isRunning_W()) + _instance.setShouldDie(true); + + _instance.setForceQuitTask(null); + //stop this task from starting again + cancel(); + } + else if (_instance.isRefusingNewSessions() == false) { + //resend the REFUSE command + if (localMonitor.stopInstance(_instance) != null) { + //we got a response, let's reset the retry + //if retries reaches the max (WOTaskd.refuseNumRetries), force quit the instance + retries = 0; + } + } + + } + catch (MonitorException e) { + NSLog.err.appendln("Exception while scheduling forceQuit: " + e.getMessage()); + } + finally { + ++retries; + app._lock.endReading(); + } + + } + + } + +} Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Ajax/AjaxExample2/Resources/Properties =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Ajax/AjaxExample2/Resources/Properties 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Examples/Ajax/AjaxExample2/Resources/Properties 2010-10-22 15:33:05 UTC (rev 11616) @@ -75,3 +75,4 @@ SeleniumTestsEnabled=true +er.extensions.ERXApplication.DefaultEncoding=UTF-8 \ No newline at end of file Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxRemoteLogging.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxRemoteLogging.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/Sources/er/ajax/AjaxRemoteLogging.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -16,13 +16,14 @@ /** * Allows you to log <code>window.console</code> JS messages from the browser to * a logger on the server. Pretty helpful when trying to debug JS problems that - * do not occur on your machine. As you will to a roundtrip to the server on - * each message, it's pretty costly and should be used with care. + * do not occur on your machine. As you will to a round trip to the server on + * each message, it's pretty costly and should be used with care. * * @author ak * * @binding logger the log4j logger to append to (default: "AjaxRemoteLogging") * @binding level the log4j logging level to use (default: "info") + * @binding throttle the number of milliseconds to collect statements before actually sending (default: 100) * @binding filter a javascript function that returns true on a single argument * msg when the logging should go to the server * @@ -32,12 +33,14 @@ private WOAssociation _logger; private WOAssociation _filter; private WOAssociation _level; + private WOAssociation _throttle; public AjaxRemoteLogging(String arg0, NSDictionary arg1, WOElement arg2) { super(arg0, arg1, arg2); _filter = (WOAssociation) arg1.objectForKey("filter"); _logger = (WOAssociation) arg1.objectForKey("logger"); _level = (WOAssociation) arg1.objectForKey("level"); + _throttle = (WOAssociation) arg1.objectForKey("throttle"); } @Override @@ -45,6 +48,7 @@ String level = "info"; String logger = getClass().getSimpleName(); String filter = null; + Object throttle = "100"; if (_filter != null) { filter = (String) _filter.valueInComponent(context.component()); @@ -55,13 +59,17 @@ if (_level != null) { level = (String) _level.valueInComponent(context.component()); } + if (_throttle != null) { + throttle = _throttle.valueInComponent(context.component()); + } String url = context.directActionURLForActionNamed(Log.class.getName(), null); StringBuffer buf = new StringBuffer(); buf.append("<script type='text/javascript'>\n"); buf.append("WonderRemoteLogging.install({url: '").append(url); buf.append("', level: '").append(level); buf.append("', logger: '").append(logger); - buf.append("', filter: ").append(filter); + buf.append("', throttle: ").append(throttle); + buf.append(" , filter: ").append(filter); buf.append("});\n"); buf.append("</script>"); response.appendContentString(buf.toString()); Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.css ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.css:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.extras.js ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.extras.js:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.js ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/ibox.js:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/bg.png ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/bg.png:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/indicator.gif ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/images/indicator.gif:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox/darkbox.css ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/darkbox/darkbox.css:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images:11280-11593,11594-11615* Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/closelabel.gif ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/closelabel.gif:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/loading.gif ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/images/loading.gif:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/lightbox.css ___________________________________________________________________ Added: svn:mergeinfo + /trunk/Wonder/Frameworks/Ajax/Ajax/WebServerResources/ibox/skins/lightbox/lightbox.css:11280-11615 Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/wonder.js =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/wonder.js 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Ajax/Ajax/WebServerResources/wonder.js 2010-10-22 15:33:05 UTC (rev 11616) @@ -1068,8 +1068,26 @@ uploader.submit(); } }; +var AFU = AjaxFlexibleUpload; + var WonderRemoteLogging = { + options: {}, + sendTimer: 0, + messages: [], + + sendLog: function() { + var parts = WonderRemoteLogging.options.url.split("\?", 2) + var finalUrl = parts[0] + "/" + WonderRemoteLogging.options.logger + "?" + (parts.length > 1? parts[1]: ""); + var request = new Ajax.Request(finalUrl, {method: 'POST', parameters: { + l: WonderRemoteLogging.options.level, + m: WonderRemoteLogging.messages.join("\n") + }}); + WonderRemoteLogging.messages = []; + WonderRemoteLogging.sendTimer = null; + }, + install: function(options) { + WonderRemoteLogging.options = options; try{ window.console = window.console || {}; } catch(e) {} @@ -1077,17 +1095,19 @@ window.console.filter = options.filter || function(msg) {return true}; window.console.log = function(msg) { if(window.console.filter(msg)) { - var parts = options.url.split("\?", 2) - var finalUrl = parts[0] + "/" + options.logger + "?l=" + escape(options.level) + "&m=" + escape(msg) + "&" + (parts.length > 1? parts[1]: ""); - var request = new Ajax.Request(finalUrl, {method: 'GET'}); + if(WonderRemoteLogging.sendTimer) { + clearTimeout(WonderRemoteLogging.sendTimer); + WonderRemoteLogging.sendTimer = null; + } + WonderRemoteLogging.messages.push(msg); + WonderRemoteLogging.sendTimer = setTimeout(WonderRemoteLogging.sendLog, options.throttle); } if(window.console.oldlog) { window.console.oldlog(msg); } } - }, + } } -var AFU = AjaxFlexibleUpload; var WonderJSON = { eoStub: function(eo) { Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/BusinessLogic/ERAttachment/Sources/er/attachment/package.html =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/BusinessLogic/ERAttachment/Sources/er/attachment/package.html 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/BusinessLogic/ERAttachment/Sources/er/attachment/package.html 2010-10-22 15:33:05 UTC (rev 11616) @@ -121,6 +121,20 @@ Content-Disposition header. This will typically cause the browser to download the attachment versus displaying inline. Defaults false.</dd> </dl> +<h2>Image Processing Properties</h2> +<p> +While ERAttachment will try and automatically figure out a library for image processing operations such as thumbnailing and resizing, you can configure it yourself using +appropriate properties. Here are some properties that apply to image processing libraries configuration. +</p> + +<dl> + <dt>er.attachment.thumbnail.imageProcessor</dt> + <dd>Values for this property can be one of sips, imageio, imagemagick or java</dd> + + <dt>er.attachment.ImageProcessor.imageMagickBinFolder</dt> + <dd>Indicates the directory path of the ImageMagick binaries.</dd> +</dl> + <h2>Path Templates</h2> <p> Several attachment types define filesystem and webserver paths for storing and accessing attachments. A very simple set of Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo ___________________________________________________________________ Modified: svn:mergeinfo - /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo:2739-11458 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo:11280-11593 + /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo:2739-11458 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html ___________________________________________________________________ Modified: svn:mergeinfo - /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html:2736-11587 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html:11280-11593 + /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html:2736-11587 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.html:11280-11615 Property changes on: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod ___________________________________________________________________ Modified: svn:mergeinfo - /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod:2736-11587 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod:11280-11593 + /branches/Wonder_2_0_0_Branch/Wonder/Common/Frameworks/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod:2736-11587 /trunk/Wonder/Frameworks/Core/ERExtensions/Components/Nonlocalized.lproj/ERXLog4JConfiguration.wo/ERXLog4JConfiguration.wod:11280-11615 Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOPasswordField.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOPasswordField.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOPasswordField.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -30,6 +30,7 @@ * @binding hiddenValue the string to display when hidden (optional) * @binding disabled whether or not the input field is disabled (optional) * @binding name the name of the input field (optional) + * @binding readonly whether or not the input field is readonly (optional) * * @author mschrag */ @@ -38,6 +39,7 @@ private WOAssociation _hiddenValue; private WOAssociation _hashValue; + private WOAssociation _readonly; public ERXWOPasswordField(String name, NSDictionary associations, WOElement template) { super("input", associations, null); @@ -46,6 +48,7 @@ } _hiddenValue = (WOAssociation) _associations.removeObjectForKey("hiddenValue"); _hashValue = (WOAssociation) _associations.removeObjectForKey("hashValue"); + _readonly = (WOAssociation) _associations.removeObjectForKey("readonly"); } protected String type() { @@ -56,10 +59,14 @@ WOAssociation disabled = (WOAssociation) ERXKeyValueCodingUtilities.privateValueForKey(this, "_disabled"); return disabled != null && disabled.booleanValueInComponent(context.component()); } + + protected boolean isReadonlyInContext(WOContext context) { + return _readonly != null && _readonly.booleanValueInComponent(context.component()); + } public void takeValuesFromRequest(WORequest request, WOContext context) { WOComponent component = context.component(); - if (!isDisabledInContext(context) && context._wasFormSubmitted()) { + if (!isDisabledInContext(context) && context._wasFormSubmitted() && !isReadonlyInContext(context)) { String name = nameInContext(context, component); if (name != null) { String value = request.stringFormValueForKey(name); @@ -97,6 +104,9 @@ if (hiddenValue != null) { response._appendTagAttributeAndValue("value", hiddenValue, true); } + if (isReadonlyInContext(context)) { + response._appendTagAttributeAndValue("readonly", "readonly", false); + } } protected void _appendCloseTagToResponse(WOResponse response, WOContext context) { Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOTextField.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOTextField.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/components/_private/ERXWOTextField.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -41,6 +41,7 @@ protected WOAssociation _numberFormat; protected WOAssociation _useDecimalNumber; protected WOAssociation _blankIsNull; + protected WOAssociation _readonly; public ERXWOTextField(String tagname, NSDictionary nsdictionary, WOElement woelement) { super("input", nsdictionary, woelement); @@ -52,6 +53,7 @@ _numberFormat = (WOAssociation)_associations.removeObjectForKey("numberformat"); _useDecimalNumber = (WOAssociation)_associations.removeObjectForKey("useDecimalNumber"); _blankIsNull = (WOAssociation)_associations.removeObjectForKey("blankIsNull"); + _readonly = (WOAssociation)_associations.removeObjectForKey("readonly"); if(_dateFormat != null && _numberFormat != null) { throw new WODynamicElementCreationException("<" + getClass().getName() + "> Cannot have 'dateFormat' and 'numberFormat' attributes at the same time."); @@ -66,10 +68,14 @@ WOAssociation disabled = (WOAssociation) ERXKeyValueCodingUtilities.privateValueForKey(this, "_disabled"); return disabled != null && disabled.booleanValueInComponent(context.component()); } + + protected boolean isReadonlyInContext(WOContext context) { + return _readonly != null && _readonly.booleanValueInComponent(context.component()); + } public void takeValuesFromRequest(WORequest worequest, WOContext wocontext) { WOComponent component = wocontext.component(); - if(!isDisabledInContext(wocontext) && wocontext._wasFormSubmitted()) { + if(!isDisabledInContext(wocontext) && wocontext._wasFormSubmitted() && !isReadonlyInContext(wocontext)) { String name = nameInContext(wocontext, component); if(name != null) { String stringValue; @@ -164,6 +170,9 @@ } woresponse._appendTagAttributeAndValue("value", stringValue, true); } + if (isReadonlyInContext(wocontext)) { + woresponse._appendTagAttributeAndValue("readonly", "readonly", false); + } } protected void _appendCloseTagToResponse(WOResponse woresponse, WOContext wocontext) { Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOAccessUtilities.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -74,6 +74,8 @@ /** * Collection of EOAccess related utilities. + * + * EOAccess provides the data access mechanisms for the Enterprise Objects technology. */ public class ERXEOAccessUtilities { /** logging support */ @@ -2230,4 +2232,42 @@ entity.setAttributesUsedForLocking(atts); } } + + /** + * @param rootEntityName + * @return a list of all concrete entity names that inherit from + * rootEntityName, including rootEntityName itself if it is + * concrete. + */ + public static NSArray<String> entityHierarchyNamesForEntityNamed(EOEditingContext ec, String rootEntityName) { + + NSMutableArray<String> names = new NSMutableArray<String>(); + EOEntity rootEntity = entityNamed(ec, rootEntityName); + NSArray<EOEntity> entities = entityHierarchyForEntity(ec, rootEntity); + + for (EOEntity entity : entities) { + names.add(entity.name()); + } + return names.immutableClone(); + + } + + /** + * @param rootEntity + * @return a list of all concrete entities that inherit from rootEntity, + * including rootEntity itself if it is concrete. + */ + public static NSArray<EOEntity> entityHierarchyForEntity(EOEditingContext ec, EOEntity rootEntity) { + NSMutableArray<EOEntity> entities = new NSMutableArray<EOEntity>(); + + if (!rootEntity.isAbstractEntity()) { + entities.add(rootEntity); + } + @SuppressWarnings("unchecked") + NSArray<EOEntity> subEntities = rootEntity.subEntities(); + for (EOEntity subEntity : subEntities) { + entities.addAll(entityHierarchyForEntity(ec, subEntity)); + } + return entities.immutableClone(); + } } Modified: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java 2010-10-22 15:24:27 UTC (rev 11615) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXEOControlUtilities.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -69,6 +69,8 @@ /** * Collection of EOF utility method centered around * EOControl. + * + * EOControl provides infrastructure for creating and managing enterprise objects. */ public class ERXEOControlUtilities { @@ -1462,7 +1464,7 @@ // and then we need to add back in any updated objects that now DO match the qualifier that didn't originally match the qualifier NSArray updatedObjects = ERXEOControlUtilities.updatedObjects(editingContext, entityNames, qualifier); - if (updatedObjects != null) { + if (updatedObjects.count() > 0) { Enumeration updatedObjectsEnum = updatedObjects.objectEnumerator(); while (updatedObjectsEnum.hasMoreElements()) { Object obj = updatedObjectsEnum.nextElement(); @@ -1481,7 +1483,7 @@ if (includeNewObjects) { NSMutableArray insertedObjects = ERXEOControlUtilities.insertedObjects(editingContext, entityNames, qualifier); - if (insertedObjects != null) { + if (insertedObjects.count() > 0) { if (cloneMatchingObjects != null) { cloneMatchingObjects.addObjectsFromArray(insertedObjects); } @@ -1507,7 +1509,7 @@ while (i-- > 0) { EOEditingContext theEC = (EOEditingContext)parentEditingContexts.objectAtIndex(i); NSArray objectsMatchingQualifier = ERXEOControlUtilities.insertedObjects(theEC, entityNames, qualifier); - if (objectsMatchingQualifier != null) { + if (objectsMatchingQualifier.count() > 0) { // fault the previous batch down objects = EOUtilities.localInstancesOfObjects(theEC, objects); @@ -1532,7 +1534,7 @@ if (removeDeletedObjects) { NSArray deletedObjects = ERXEOControlUtilities.deletedObjects(editingContext, entityNames, qualifier); - if (deletedObjects != null) { + if (deletedObjects.count() > 0) { if (cloneMatchingObjects == null) { cloneMatchingObjects = objectsToFilter.mutableClone(); objectsToFilter = cloneMatchingObjects; @@ -1596,28 +1598,24 @@ } /** - * Returns the array of objects of the given type that have been inserted into + * @return the array of objects of the given type that have been inserted into * the editing context and match the given qualifier. Yes, it's odd that it * returns NSMutableArray -- it's an optimization specifically for objectsWithQualifier. + * Returns an empty array if no objects match. * * @param editingContext the editing context to look in * @param entityNames the names of the entity to look for * @param qualifier the qualifier to restrict by */ public static NSMutableArray insertedObjects(EOEditingContext editingContext, NSArray<String> entityNames, EOQualifier qualifier) { - NSMutableArray result = null; + NSMutableArray result = new NSMutableArray(); NSDictionary insertedObjects = ERXArrayUtilities.arrayGroupedByKeyPath(editingContext.insertedObjects(), "entityName"); for (String entityName : entityNames) { NSArray insertedObjectsForEntity = (NSArray) insertedObjects.objectForKey(entityName); if (insertedObjectsForEntity != null && insertedObjectsForEntity.count() > 0) { NSArray inMemory = EOQualifier.filteredArrayWithQualifier(insertedObjectsForEntity, qualifier); if (inMemory.count() > 0) { - if (result == null) { - result = inMemory.mutableClone(); - } - else { - result.addObjectsFromArray(inMemory); - } + result.addObjectsFromArray(inMemory); } } } @@ -1625,27 +1623,22 @@ } /** - * Returns the array of objects of the given type that have been updated in - * the editing context and match the given qualifier. + * @return the array of objects of the given type that have been updated in + * the editing context and match the given qualifier. Returns an empty array if no objects match. * * @param editingContext the editing context to look in * @param entityNames the names of the entity to look for * @param qualifier the qualifier to restrict by */ public static NSMutableArray updatedObjects(EOEditingContext editingContext, NSArray<String> entityNames, EOQualifier qualifier) { - NSMutableArray result = null; + NSMutableArray result = new NSMutableArray(); NSDictionary updatedObjects = ERXArrayUtilities.arrayGroupedByKeyPath(editingContext.updatedObjects(), "entityName"); for (String entityName : entityNames) { NSArray updatedObjectsForEntity = (NSArray) updatedObjects.objectForKey(entityName); if (updatedObjectsForEntity != null && updatedObjectsForEntity.count() > 0) { NSArray inMemory = EOQualifier.filteredArrayWithQualifier(updatedObjectsForEntity, qualifier); if (inMemory.count() > 0) { - if (result == null) { - result = inMemory.mutableClone(); - } - else { - result.addObjectsFromArray(inMemory); - } + result.addObjectsFromArray(inMemory); } } } @@ -1653,15 +1646,15 @@ } /** - * Returns the array of objects of the given type that have been deleted from - * the editing context and match the given qualifier. + * @return the array of objects of the given type that have been deleted from + * the editing context and match the given qualifier. Returns an empty array if no objects match. * * @param editingContext the editing context to look in * @param entityNames the names of the entity to look for * @param qualifier the qualifier to restrict by */ public static NSMutableArray deletedObjects(EOEditingContext editingContext, NSArray<String> entityNames, EOQualifier qualifier) { - NSMutableArray result = null; + NSMutableArray result = new NSMutableArray(); NSDictionary deletedObjects = ERXArrayUtilities.arrayGroupedByKeyPath(editingContext.deletedObjects(), "entityName"); for (String entityName : entityNames) { NSArray deletedObjectsForEntity = (NSArray) deletedObjects.objectForKey(entityName); @@ -1669,12 +1662,7 @@ NSArray inMemory = EOQualifier.filteredArrayWithQualifier(deletedObjectsForEntity, qualifier); if (inMemory.count() > 0) { if (inMemory.count() > 0) { - if (result == null) { - result = inMemory.mutableClone(); - } - else { - result.addObjectsFromArray(inMemory); - } + result.addObjectsFromArray(inMemory); } } } Copied: branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXUnmodeledToManyRelationship.java (from rev 11615, trunk/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXUnmodeledToManyRelationship.java) =================================================================== --- branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXUnmodeledToManyRelationship.java (rev 0) +++ branches/Wonder_5_0_0_WebObjects_5_4_Branch/Wonder/Frameworks/Core/ERExtensions/Sources/er/extensions/eof/ERXUnmodeledToManyRelationship.java 2010-10-22 15:33:05 UTC (rev 11616) @@ -0,0 +1,298 @@ +package er.extensions.eof; + +import java.util.concurrent.ConcurrentHashMap; + +import com.webobjects.eocontrol.EOAndQualifier; +import com.webobjects.eocontrol.EOEditingContext; +import com.webobjects.eocontrol.EOQualifier; +import com.webobjects.eocontrol.EOSortOrdering; +import com.webobjects.foundation.NSArray; +import com.webobjects.foundation.NSMutableArray; + +import er.extensions.eof.ERXEOAccessUtilities; +import er.extensions.eof.ERXEOControlUtilities; +import er.extensions.eof.ERXEnterpriseObject; +import er.extensions.eof.ERXFetchSpecification; +import er.extensions.eof.ERXKey; +import er.extensions.eof.ERXQ; +import er.extensions.eof.ERXS; + +/** + * A class than is composited into an EO to provide common toMany functionality + * for the case where the toMany cannot be modeled in EOF due to the unusually + * large size possibilities of the toMany relationship. + * + * This class is for simple to many relationships, has not been te... [truncated message content] |