Hi,

CarbonTransport [1] class in carbon-kernel implements template pattern and
it has the following abstract methods.

   - protected abstract void start();
   - protected abstract void stop();
   - protected abstract void beginMaintenance();
   - protected abstract void endMaintenance();

These abstract methods should be implemented by any class that implements a
carbon transport. (For example NettyListener [2] does this). These abstract
methods are called by the template methods of CarbonTransport class. These
template methods maintain the state of the carbon transport as shown in the
following code block.

void stopTransport() { <- one of the template methods
        if (state.equals(State.STARTED)) {
            state = State.STOPPED; <- state is changed without knowing the
status of stop() call
        } else {
            throw new IllegalStateException("Cannot stop transport " + id +
". Current state: " + state);
        }
        stop(); <- abstract method is called
    }

As shown in the above code block CarbonTransport's template functions
change the state of the transport without knowing the actual state of the
transport after invoking the abstract function (assuming the abstract
method call succeeded).

IMO this behaviour can produce invalid states when the operations of the
abstract method implementations do not complete as expected. IMO in order
to fix this we can introduce an exception type to the abstract method's
signature for the implementations to notify any failure or add a state
return to the signature.

   - protected abstract void start() throws CarbonTransportException;
   - protected abstract void stop() throws CarbonTransportException;
   - protected abstract void beginMaintenance()
    throws CarbonTransportException;
   - protected abstract void endMaintenance()
    throws CarbonTransportException;

Or

   - protected abstract State start();
   - protected abstract State stop();
   - protected abstract State beginMaintenance();
   - protected abstract State endMaintenance();


WDYT?

[1] -
https://github.com/wso2/carbon-kernel/blob/master/core/src/main/java/org/wso2/carbon/kernel/transports/CarbonTransport.java
[2] -
https://github.com/wso2/carbon-transports/blob/master/http/netty/component/src/main/java/org/wso2/carbon/transport/http/netty/listener/NettyListener.java

Thank you.

Best Regards,
Samiyuru

-- 
Samiyuru Senarathne
*Software Engineer*
Mobile : +94 (0) 71 134 6087
[email protected]
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to