We also have a few of these tasks as dependent on the integration of Spring into the code tree.

If we phase in the Spring support, and try to use spring and plexus at the same time we can't phase those tasks in because it'll likely break the plexus support.

A rough timeline / order of tasks.

Isolated Changes, No Spring Dependency.
#)  Replace plexus-cli with commons-cli
#)  Replace plexus CommandLine with ProcessBuilder
#)  Replace plexus-digest with commons-codec implementation.
#)  Bring plexus-expression-evaluator into archiva code-tree.
#)  Use slf4j instead of plexus logger.
#)  Use commons-io to replace plexus-utils equivalents.
#)  Use commons-lang to replace plexus-utils equivalents.
#)  Create AnonymousProjectReader
#)  Migrate away from plexus-webdav to atlassian DAVServlet
#)  Migrate webwork/xwork to Struts 2

Changes Depending on Spring Integration.

#)  Create jetty bundle (MRM-688)
#)  Add Spring deps into existing codebase.
#)  Create alternative descriptors to use Spring for existing codebase.
   (At this point in time we now have a plexus and spring option.
    We could attempt to set up a profile to use one over the other)
#)  Switch plexus-registry for PlexusJavaConfig
#)  Migrate plexus-cache to SpringCache
#)  Switch from JDO/JPox to JPA.
#)  Help RedBack use Spring.
#)  Integrate RedBack / Spring into Archiva.
#)  Switch plexus-scheduler for SpringScheduler
#)  Switch plexus-taskqueue for other Queue (JMS?)

(More comments inline)

Brett Porter wrote:

On 19/02/2008, at 9:37 AM, Joakim Erdfelt wrote:

org.codehaus.plexus.cache.Cache;

Used:
  archiva-repository-layer
  archiva-policies
Plan:
  Use ehcache directly
  or use Spring Caching (which uses ehcache)

the latter sounds best. Also worth reviewing whether this is a design issue - I'm surprised the policies needs a cache?

The cache-failures-policy uses it.
Easy, Once Spring is in place.


org.codehaus.plexus.commandline.DefaultExecutableResolver;
org.codehaus.plexus.commandline.ExecutableResolver;

Used:
  archiva-webapp-test
Plan:
  Investigate Need.

agreed.


  Fork into archiva if truely needed.

well - there should be no problem with using plexus-utils if it provides something for the time being. commons-exec did start moving again too, I noticed.

Nice.  Haven't looked at commons-exec yet.
I fear archiva-webapp-tests is woefully out of date. Do we limp it along? Archive it? Send it to sandbox?



org.codehaus.plexus.tools.cli.AbstractCli;

Used:
  archiva-cli
Plan:
  Use commons-cli instead.

I also like the one by Sam Pullara that I used in the continuum data management tools - you might like to check it out (uses annotations)

I'll check it out, sounds nifty. But honestly, do we really need archiva-cli ? ;-) It would be easy enough to do, has no dependency on Spring and would remove a dependency on Plexus.




org.codehaus.plexus.util.cli.Commandline;
org.codehaus.plexus.util.cli.CommandLineUtils;
org.codehaus.plexus.util.cli.StreamConsumer;
org.codehaus.plexus.util.cli.WriterStreamConsumer;

Used:
  archiva-webapp-test
Plan:
  Use JDK 1.5 and java.lang.ProcessBuilder

Sounds good if it has the necessary functionality.

Its easy enough to use.  Used it in a bunch of places.
Our needs within archiva-webapp-test seems straight forward enough.
This would be easy to do, has no dependency on Spring or Plexus.



org.codehaus.plexus.component.repository.exception.ComponentLifecycleException; org.codehaus.plexus.component.repository.exception.ComponentLookupException;
org.codehaus.plexus.context.Context;
org.codehaus.plexus.context.ContextException;
org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException; org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
org.codehaus.plexus.PlexusConstants;
org.codehaus.plexus.PlexusContainer;
org.codehaus.plexus.PlexusTestCase;

Used:
  archiva-cli
  archiva-repository-layer
  archiva-webapp
  archiva-artifact-reports
  archiva-configuration
  archiva-core-consumers
  archiva-database
  archiva-database-consumers
  archiva-indexer
  archiva-lucene-consumers
  archiva-proxy
  archiva-scheduled
  archiva-webapp
Plan:
  Switch to Spring Container.

We need to assess the impact of this on the webapp - I think we can take all the plexus-isms out of there and just use the annotations, then we could switch to the spring objectfactory pretty easily.

Well, I'm worried about the POJOs using the Plexus specifics like Initializable, Startable, ContextAware, etc...
Those will be hard to coexist with Spring I suspect.
This will be time consuming, and difficult to do.



org.codehaus.plexus.digest.ChecksumFile;
org.codehaus.plexus.digest.Digester;
org.codehaus.plexus.digest.DigesterException;

Used:
  archiva-policies
  archiva-commons
  archiva-core-consumers
  archiva-transaction
  archiva-database-consumers
Plan:
  Migrate to commons-codec

Are you sure it provides this? I thought these were convenience wrappers for streaming, etc.

Its not a 1 to 1 mapping of functionality, but with commons-codec in the picture, making a Checksum utility within Archiva is trivially easy.
Easy to do, no dependency on Spring / Plexus for this one.


org.codehaus.plexus.evaluator.DefaultExpressionEvaluator;
org.codehaus.plexus.evaluator.EvaluatorException;
org.codehaus.plexus.evaluator.ExpressionEvaluator;
org.codehaus.plexus.evaluator.ExpressionSource;
org.codehaus.plexus.evaluator.sources.PropertiesExpressionSource;
org.codehaus.plexus.evaluator.sources.SystemPropertyExpressionSource;

Used:
  archiva-repository-layer
  archiva-configuration
Plan:
  Migrate expression-evaluator to archiva codebase.

Need more info on what this does - seems like something the container should handle?

This is used in a bunch of places to provide a consistent ${expression} evaluation, in poms, config files, etc... It provides a bunch of expression sources that can be utilized in a search stack for values. There used to be a commons-el that might work too, but I fear that might be the ultimate in overkill for the usecase we have. This isn't that hard to do, has no dependency on Spring, and would remove a dependency on plexus.


org.codehaus.plexus.jdo.DefaultConfigurableJdoFactory;
org.codehaus.plexus.jdo.JdoFactory;

Used:
  archiva-scheduled
  archiva-database
Plan:
  Migrate to JDK 1.5 + JPA + Annotations

Bigger job, but long term seems to make sense. This can be isolated in the database module for now. Also not sure why JDO stuff is in -scheduled.

It shows up in the archiva-scheduled test cases.
Used to set up a few tests.
This would be a *BIG* Job, large amount of impact to the archiva-database codebase only (i hope). This would also eliminate a need for modello (another dependency I'd like to eliminate).


org.codehaus.plexus.logging.AbstractLogEnabled;
org.codehaus.plexus.logging.Logger;

Used:
  archiva-repository-layer
  archiva-webapp
Plan:
  Use slf4j directly

+1

This would be a simple change that can be done in small changes to the code tree. This is easy, has no Spring dependency, and moves up closer to eliminating Plexus.



  Develop redback <-> spring integration and use it.

+1

Big job, probably bigger than the JDO -> JPA effort.
But I think this would be worth it.


org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry;
org.codehaus.plexus.registry.Registry;
org.codehaus.plexus.registry.RegistryException;
org.codehaus.plexus.registry.RegistryListener;

Used:
  archiva-artifact-reports
  archiva-configuration
  archiva-core-consumers
  archiva-database-consumers
  archiva-indexer
  archiva-lucene-consumers
  archiva-proxy
  archiva-repository-layer
  archiva-scheduled
  archiva-security
  archiva-webapp
Plan:
  Use commons-configuration
  or Spring JavaConfig

Will need to look into this. I might just want to migrate the registry to commons.

Using Spring JavaConfig we gain some annotation based configurations too.
This would also eliminate a need for modello.




org.codehaus.plexus.scheduler.AbstractJob;
org.codehaus.plexus.scheduler.CronExpressionValidator;
org.codehaus.plexus.scheduler.Scheduler;

Uses:
  archiva-scheduled
  archiva-webapp
Plan:
  Use Spring Scheduler / Quartz.

+1

Medium difficulty level.  This is only half of the scheduling picture.
We need a persistent queue of tasks too.




org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
org.codehaus.plexus.taskqueue.execution.TaskExecutor;
org.codehaus.plexus.taskqueue.Task;
org.codehaus.plexus.taskqueue.TaskQueue;
org.codehaus.plexus.taskqueue.TaskQueueException;

Used:
  archiva-scheduled
  archiva-webapp
Plan:
  Move to Spring JMS?

I don't think it needs that - commons-collections and quartz can probably do it :)

Spring JMS exists already and provides a persisted queue for messages.
We can get far more detailed in our tasks with this approach.
We can even add a 'IndexNewArtifact' task with each uploaded / found artifact that persists to disk to ensure they get processed even with an archiva restart. We even gain the ability to go distributed with search/indexing in the future.



  Use commons-io equivalents

+1

Very Easy change. No dependency on Spring, and brings us closer to eliminating Plexus.




org.codehaus.plexus.util.StringUtils;

Used:
  archiva-repository-layer
Plan:
  Switch to commons-lang

+1

Also a very easy change. No dependency on Spring, and brings us closer to eliminating plexus.


org.codehaus.plexus.util.xml.pull.XmlPullParserException;

Used:
  archiva-artifact-converter
  archiva-webapp
Plan:
  Implement AnonymousProjectReader idea from 1.0 days to
  read the xml / modelVersion and then load the appropriate
  ProjectModel###Reader object.

Already implemented using StAX using the modello stax reader. That would be the fastest approach - just reuse what Maven provides.

Great.  Not an option (yet).
As the maven Artifact libs are not friendly to missing content.
We'll be right back to the issues we had with missing poms not allowing content to be indexed / downloaded / browsed / etc... The project readers in place in Archiva have been historically faster and less memory intensive than their maven component alternatives.



Plan:
  Fork it.could.webdav into new archiva-davserver component.

Let's look at this separately - I don't really want to maintain a DAV implementation - I think we should work with someone else that does.

Atlassian has a DAVServlet that we might be able to get away with.
We'll have to check ASL license compatibility and whatnot, but it might be a good alternative. I'd also like to get a DAVServlet that coexists with the top level URL so that we can get OSX and Win32 native clients working with archiva as well. (A problem with the existing it.could.webdav impl)


org.codehaus.plexus.xwork.action.PlexusActionSupport;

Used:
  archiva-webapp
Plan:
  Switch to SwingMVC

Swing?

Whoops. SpringMVC


I'm not convinced SpringMVC is a good move - we would be better going to struts2 or staying with Webwork since it's minimal impact to the code. The other doesn't bring any obvious benefit for all the work?

I've been checking out some performance / scalability / tooling / testing tests recently at my office with regards to web frameworks.
SpringMVC beat everything but Struts 1.x in performance.
And SpringMVC makes testing really easy to boot.
That's my motivation behind it.

But yes, it would have a big impact.
So, lets just consider something lower impact, moving from xwork/webwork to Struts 2. I think we have some friends in the struts 2 community to help us out if we hit a roadblock or two. Beside, we should be supporting out Apache brethren too.

Good proposal, though - when will you be getting started?

Some time between now and the end of the year.

My time is limited at the moment, but I still have a desire to help move the project forward.

- Joakim

Reply via email to