On Mar 10, 2015, at 3:16 PM, Roger Riggs <roger.ri...@oracle.com> wrote:
> On 3/10/2015 5:50 AM, Paul Sandoz wrote:
>> On Mar 6, 2015, at 7:58 PM, Roger Riggs <roger.ri...@oracle.com> wrote:
>>>> 2) I know there has been a lot of discussion about the use of CF,
>>>>     but I have a few more comments:
>>>>          a) Both onExit and onProcessExit are implemented to 
>>>> unconditionally
>>>>         throw UOE. Is the intention to make the implementation of these
>>>>         methods optional? If so, then UOE should be documented, If not,
>>>>         then I think they can be abstract, right?
>>> There are existing non-jdk implementations of Process and it would be source
>>> incompatible if default implementations were not supplied.  So, not 
>>> abstract.
>>> 
>>> Since the behavior applies to Process, the note in the class documentation
>>> defines the behavior.
>>> "Methods of {@code Process} that are not otherwise specified or overridden 
>>> throw
>>> {@link java.lang.UnsupportedOperationException}."
>>> 
>>> More direct documentation could be provided in the override of onExit
>>> but that would raise the visibility to ordinary developers who should use
>>> onProcessExit that returns the correctly typed CF and not onExit.
>>> The note should be sufficient for implementers without distracting the 
>>> ordinary developer.
>>> 
>>> Perhaps, a description similar to that used in destroy(), the behavior of 
>>> Processes
>>> returned from ProcessBuilder can be more tightly specified. Alternatively,
>>> ProcessBuilder could specify the behavior of Process instances it returns, 
>>> at present,
>>> the behavior of the Process instances is split between the two classes.
>>> 
>> Throwing USO for default implementations is a warning sign to me that 
>> something does not fit quite right. It feels like we are giving up :-)
> It is an artifact of extending the API of an externally subclassable class.
>> 
>> I now see Process.getPid was previously added and it throws USO by default. 
>> So we might be stuck due to the tricky nature of this area.
> Added early in 9, IMHO it can be revisited if necessary.

Perhaps, it seems more to point to a fundamental trickiness we cannot easily 
avoid.


>> 
>> Any sub-type of Process that does not override getPid will essentially 
>> result in that USO being propagated to many ProcessHandle methods that 
>> depend on the PID (parent, children, allChildren, info, compareTo). That 
>> effectively renders ProcessHandle almost useless for sub-types outside of 
>> our control that that not been updated.
> For those methods, the default behavior can be specified, except for compareTo
> they already have return values that allow for the fact that the information 
> may
> not be available, either due to OS restrictions (permissions) or is not 
> provided.
> Empty lists for children, nulls returned from info, and even allowing for an 
> unavailable parent.

That's a separate issue. 

If i get a ProcessHandle given to me, i do not know it's source, i dunno if 
it's gonna barf if i operate on it.


>> 
>> Is it common to sub-type Process?
> Subclassing is very limited; usually for some kind of interposition or 
> delegation.

Ok.


>> If so then perhaps Process should not extend ProcessHandle and instead there 
>> should be a way to view a Process as a ProcessHandle, whose default 
>> implementation is:
>> 
>>   return ProcessHandle.of(getPid()); // throws USO if getPid does
>> 
>> (java.lang.ProcessImpl could implement Processhandle thereby the 
>> implementation is "return this".)
> Only if ProcessImpl extends ProcessHandle but it already extends Process and 
> if Process does not extend ProcessHandle...
> 

Doh! scrap that optimisation, i keep wanting ProcessHandle to be an iface.


> Regardless, the same methods parent, children, allChldren, info, compareTo 
> would be useful
> on Process and will have the same issues with subclassing and default 
> implementations.
> 

For all but comparison one could go through the view, it's a little more 
verbose, but not terrible.


> It is not a high priority to provide first class support for external 
> subclasses of Process.
> The focus is on Processes created by ProcessBuilder.
> 

Ok. We should probably call that out more clearly in the docs if that is the 
design direction.

Paul.

Reply via email to