Stefano Bagnara wrote:
I'm not sure that "next generation frameworks" means "declarative logging.
Neither do I, but by definition one generation follows the next and the current generation doesn't properly address the issue while the next does. Its not just logging however, there are other things, like inheriting exception handling policies, security and other cross cutting concerns.
IMHO declarative logging (the way you described it) cannot and will
never replace standard logging. It could be used together, but not
replace all of logging.
I disagree of course, but only in principle. It's a simple matter of adding logging(and other things) 'after' the functionality instead of 'before' it in the inheritance chain.

Many components in James extend AbstractLogEnabled putting it 'before', I realise this is a stumbling block but its not a massive problem.
It would be a PITA to mantain that style of declarative logging.
Maybe, but I don't think so. If everything is well documented, it shouldn't be a problem.
BTW
if you have more documentation, examples, code,  evangelization
articles, to help me why declarative logging will be used in the next
generation framework I'd be very happy to read it. I'm very interested
in improving the logging aspect of libraries/application as I feel the
logging one of the most problematic issues in current design. I don't
like per class logging (Log.getLogger field), either static or per
instance and I prefer injecting logging services, but I still don't
see how to completely remove logging in favor of a declarative
approach.
How about writing components with no references to loggers or logging whatsoever? (Your mind will instinctively reject this idea...as time goes by you will accept it as the best way...a bit longer and it will become the norm....its already the norm in some organisations....) It's really simple, you add logging (and other things) after, not before. This is the point of components, they are not classes, a good component model supports coupling/binding of functionality at any time. In my eyes (and with the design I am following) a component 'is' a framework, all of its elements are pluggable and you can change individual elements, or add more elements, on a per request basis.

Generational inheritance is not suitable for everything.

Look at it this way, if you view James as a community of components and initially this community does not have a logging component, so sorts mail without logging. A logging component now comes along but because we are using generational inheritance the new logging component literally has to mate with existing components to create a new generation of components that have the logging gene{for example, getting a logger property (gene?) by extending the parent AbstractLogEnabled). This is not want we want, instead what we want is our new logging component to come along and share its inherent ability with the rest of the components in a transparent fashion. In this alternative scenario other components in the community that make up the application inherit logging capabilities through 'nurture' rather than 'nature', i.e. components can become more sophisticated by inheriting from peers as well as parents.
Can you take a class from our repository and show how to
refactor it to use declarative logging (also including the declarative
logging part needed to produce the same log).

Stefano
This is probably a good idea and something I have been looking at doing but I would like to continue studying the code base at present while I get a clear idea of the way forward. The SMTPServer package looks a good target, it has separate classes for each command and is the kind of thing I am looking for. Would it be a good idea to have a wiki page with some clear terms and definitions like what is a container, what is a framework, what is a component, etc? I think it would be good at least summarise their responsibilities and relate them to James concepts. I think it mentions something along those lines on the wiki somewhere and I don't mind starting it off. You may already have definitions for these terms and if so please point me in their direction.

Regards,

Simon

P.S. I am using logging as an example of cross cutting concerns, which is a much more general problem.

Regards,

Simon




Stefano Bagnara wrote:
Simon,

Sorry for being pragmatic, but your framework will have to deal with
this comments if you want to start telling "our framework" instead of
"my framework".

If the framework needs so much text to be explained then it will
probably be not good for James. We need something that people already
know, or alternatively something that people is able to grasp without
reading pages of docs. Maybe you want to try with concrete examples,
diagrams, but not so much text. I admin I read all you wrote and I
still don't understand how your framework works. Bad thing.

You propose a new container framework using interfaces to be
implemented. in 2009 this is a bad practice, currently frameworks use
@annotations, AOP, agnostic (pojo) dependency injection. If we want an
interface based framework then Avalon does a damn good job here,
already.

You also will need a good understanding of other frameworks so to
publish a comparison and use common terms defining what makes your
framework special. What is the most similar framework around, what
does your framework do better? Does your framework try to solve
container issues (class loading, component isolation,
componentreloading, deployment) or application assembly (dependency
injection, component configuration, service discovery/linking,
configuration)?

Stefano

2009/11/18 Simon Funnell <[email protected]>:

Hi,

By the way, its only 'my' framework by virtue of the fact there is no
'our'
to refer to. I could probably refer to it as 'the' framework with you
being
able to infer what I am referring to from experience, but its actually
called 'Platformed' and I intend to make it open source. Also, after some
research and reflection, I actually think its much more suitable (it was
designed for this purpose). There is no escaping some of the differences
in
approach however. I am quite willing to invest some time implementing
some
things which you can take a look at, it really wouldn't take to long to
modify some existing code. Avalon defines interfaces such as Loggable(?)
but
there is no equivalent concept with what I am doing because all things
are
inherently loggable, components do have to be built in a way that enables
loggability (and lots of other things) though. It basically means
breaking
down some of the existing code into smaller chunks that can pieced
together.
These smaller chunks could be recomposed into an alternative
implementation
of existing classes and I could also use these smaller chunks in a
different
arrangement. As I say, I could implement an example which would allow
people
to make an evaluation about any sort of decision or what not.

I think you might actually like it, it was written a while ago and its
only
by looking at it closely again that I remembered how much work I put into
it. My last email didn't accurately reflect the whole architecture, the
micro virtual machines I have touched on are extensible through
'operations'. Current James classes have methods such as initialize,
service, destroy etc, I would have to replace these methods with actual
classes (which implement an interface called Operation). Operations are
stateless instances that implement functionality, micro virtual machines
provide the operations with a context upon which to operate. Different
micro
virtual machines can have contexts like application/session etc depending
on
what's required. If you wanted to log the state of any given machine, at
any
stage, you just plug in a logging operation at the necessary place. This
can
be done dynamically, like for example an individual client matching some
criteria. The smaller things are, the more reusable they are. I could
very
easily create an adapter that takes existing mailet/matchers and
transforms
them into Operations for  micro virtual machines processing the spool.

I've probably said too much/too little so I wont post again until I get
some
feed back, or have something working, which ever comes first. I am still
interested in producing some documentation as well, suggestions are
welcome.

Thanks,

Simon





---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to