Archives pour: Novembre 2006
30.11.06
BPMN in Eclipse SOA Tools Platform
A eclipse based visual editor for BPMN.
29.11.06
OpenFTS
An Open Source PostgreSQL Full Text Search engine.
ServingXML XML Pipeline Framework
ServingXML is an open source, Apache 2.0 licensed, framework for flat/XML data transformations. It defines an extensible markup vocabulary for expressing flat-XML, XML-flat, flat-flat, and XML-XML processing in pipelines. ServingXML currently comes with a console app, and also documents an API for imbedding the software in a standard Java or J2EE application.
Patterns and Best Practices for Enterprise Integration
A site filled with high quality articles and MOM oriented enterprise design patterns.
Remoting streams with JBoss Remoting
JBoss remoting includes support for remoting streams, which means that when reading the stream on server side, it will actually drive the reading of the client side stream.
It is important to note that this feature DOES NOT copy the stream data directly from the client to the server, but is a true on demand stream. Although this is obviously slower than reading from a stream on the server that has been copied locally, it does allow for true streaming on the server. It also for better memory control by the user (verses the framework trying to copy a 3 Gig file into memory and blowing up
).
This is awesome ! and fully documented
.
MantaRay JMS stream bodies
MantaRay JMS provider seems to take special care when dealing with JMS messages whose body is a stream.
This is very interesting, because, you generally use streams when you need to process an unknown and unbounded amount of data which can be very large.
In that scenario, it is very important to make sure that the amount of memory required to process the data is bounded, so if you need your stream to go through a JMS Queue or Topic and the JMS provider sucks at dealing with streams then you're screwed. Typically, this means that even if you're dealing with a stream, the whole data is gonna be loaded in memory and this is bad when you deal with very large documents !
I need to take the time to run a memory profile of that JMS provider.
ObjectLab Kit - Date calculations library
ObjectLab Kit came out of our frustration to have to re-do the same kind of code over and over each time we joined a new company and Bank. Most banks will require basic Date calculation, we did spot another open source project for this but their licence forbids most financial institution from using it. This one is released under the business-friendly Apache 2.0 license.
Jacn - Seamless JSF and Spring (without XML)
Faut que je jette un coup d'oeil à ça ![]()
27.11.06
Create Lightweight Spring Plug-Ins—à la Eclipse
A very interesting article that explains how to add a simple eclipse like extension point feature to a Spring application.
Necessitas - Ivy Eclipse classpath container
Very handy for iy projects. Same would be great for Maven 2 projects ... ![]()
24.11.06
XStream - Mappingless Java/XML Binder
This is yet another Java/XML binding framework, but its main advantage is its ability to work without any mapping or metadata whatsoever which makes it a good candidate for transparent configuration mapping.
And indeed, it is used in Maven 2, for pom.xml 's plugins' configuration elements to Java objects unmarshalling amongst other things.
23.11.06
HCIL IHM Research projects
Impressive, some might even be usefull ![]()
21.11.06
Dependency Finder
An alternate solution to Classdep with a GUI ![]()
Easing third party jar mavenization with Classdep
Maven 2 is a great tool, but one of the boring parts of working with a maven managed project is that often you need to reference that third party JAR which is not itself mavenized and you therefore need to mavenize it yourself. You can do that the dirty way, which is writing a minimalist POM without all the dependencies but you lose all the point of Maven.
I want to do it the right way but I got fed up of the guess work involved with identifying dependencies of such a third party JAR so I studied how to ease that process.
The first part involves listing the JAR external dependency classes. I used a tool called Classdep from the JINI project.
I'm describing the process with JBoss Seam 1.1.0-BETA2. First of all, I unjared %SEAM_HOME%\jboss-seam.jar in %SEAM_HOME%\jboss-seam\ because Classdep seems to be able to work only on class files, not on a jar.
So to list Seam's dependency classes:
Code:
| java -jar %JINI_HOME%\lib\classdep.jar | |
| -cp %SEAM_HOME%\jboss-seam\ | |
| %SEAM_HOME%\jboss-seam\ | |
| -in org.jboss.seam | |
| -edges |
The command returns on standard output:
Code:
| com.sun.el.ExpressionFactoryImpl | |
| java.beans.BeanInfo | |
| java.beans.IntrospectionException | |
| java.beans.Introspector | |
| java.beans.PropertyDescriptor | |
| java.beans.PropertyEditor | |
| java.beans.PropertyEditorManager | |
| java.io.BufferedReader | |
| java.io.ByteArrayOutputStream | |
| java.io.DataInputStream | |
| java.io.File | |
| java.io.IOException | |
| java.io.InputStream | |
| java.io.InputStreamReader | |
| java.io.ObjectInputStream | |
| java.io.OutputStream | |
| java.io.PrintStream | |
| java.io.Serializable | |
| java.io.StringReader | |
| java.io.UnsupportedEncodingException | |
| java.lang.Boolean | |
| java.lang.Byte | |
| java.lang.Character | |
| java.lang.Class | |
| java.lang.ClassLoader | |
| java.lang.ClassNotFoundException | |
| java.lang.Comparable | |
| java.lang.Double | |
| java.lang.Enum | |
| java.lang.Error | |
| java.lang.Exception | |
| java.lang.Float | |
| java.lang.IllegalAccessException | |
| java.lang.IllegalArgumentException | |
| java.lang.IllegalStateException | |
| java.lang.InstantiationException | |
| java.lang.Integer | |
| java.lang.InterruptedException | |
| java.lang.Iterable | |
| java.lang.Long | |
| java.lang.NoClassDefFoundError | |
| java.lang.NoSuchFieldError | |
| java.lang.NoSuchFieldException | |
| java.lang.NoSuchMethodException | |
| java.lang.NumberFormatException | |
| java.lang.Object | |
| java.lang.Runnable | |
| java.lang.RuntimeException | |
| java.lang.SecurityException | |
| java.lang.Short | |
| java.lang.String | |
| java.lang.StringBuffer | |
| java.lang.StringBuilder | |
| java.lang.System | |
| java.lang.Thread | |
| java.lang.ThreadLocal | |
| java.lang.Throwable | |
| java.lang.UnsupportedOperationException | |
| java.lang.Void | |
| java.lang.annotation.Annotation | |
| java.lang.reflect.AnnotatedElement | |
| java.lang.reflect.Array | |
| java.lang.reflect.Constructor | |
| java.lang.reflect.Field | |
| java.lang.reflect.InvocationTargetException | |
| java.lang.reflect.Method | |
| java.lang.reflect.Modifier | |
| java.lang.reflect.ParameterizedType | |
| java.lang.reflect.Type | |
| java.math.BigDecimal | |
| java.math.BigInteger | |
| java.net.URL | |
| java.net.URLDecoder | |
| java.net.URLEncoder | |
| java.rmi.RemoteException | |
| java.security.Permissions | |
| java.security.Principal | |
| java.security.acl.Acl | |
| java.security.acl.AclEntry | |
| java.security.acl.Group | |
| java.security.acl.LastOwnerException | |
| java.security.acl.NotOwnerException | |
| java.security.acl.Permission | |
| java.sql.Date | |
| java.sql.Time | |
| java.sql.Timestamp | |
| java.text.DateFormat | |
| java.text.MessageFormat | |
| java.text.ParseException | |
| java.text.SimpleDateFormat | |
| java.util.AbstractMap | |
| java.util.ArrayList | |
| java.util.Arrays | |
| java.util.Collection | |
| java.util.Collections | |
| java.util.Comparator | |
| java.util.Date | |
| java.util.Enumeration | |
| java.util.HashMap | |
| java.util.HashSet | |
| java.util.Hashtable | |
| java.util.Iterator | |
| java.util.LinkedList | |
| java.util.List | |
| java.util.ListIterator | |
| java.util.Locale | |
| java.util.Map | |
| java.util.Map$Entry | |
| java.util.MissingResourceException | |
| java.util.NoSuchElementException | |
| java.util.Properties | |
| java.util.Queue | |
| java.util.ResourceBundle | |
| java.util.Set | |
| java.util.SortedSet | |
| java.util.StringTokenizer | |
| java.util.TimeZone | |
| java.util.TreeSet | |
| java.util.UUID | |
| java.util.concurrent.Callable | |
| java.util.concurrent.TimeUnit | |
| java.util.concurrent.atomic.AtomicInteger | |
| java.util.concurrent.locks.ReentrantLock | |
| java.util.zip.ZipEntry | |
| java.util.zip.ZipException | |
| java.util.zip.ZipFile | |
| javassist.bytecode.AnnotationsAttribute | |
| javassist.bytecode.ClassFile | |
| javax.ejb.ApplicationException | |
| javax.ejb.EJBContext | |
| javax.ejb.EJBException | |
| javax.ejb.NoSuchObjectLocalException | |
| javax.ejb.Remove | |
| javax.ejb.Timer | |
| javax.ejb.TimerHandle | |
| javax.el.BeanELResolver | |
| javax.el.CompositeELResolver | |
| javax.el.ELContext | |
| javax.el.ELContextListener | |
| javax.el.ELException | |
| javax.el.ELResolver | |
| javax.el.ExpressionFactory | |
| javax.el.ListELResolver | |
| javax.el.MapELResolver | |
| javax.el.ResourceBundleELResolver | |
| javax.el.ValueExpression | |
| javax.faces.FacesException | |
| javax.faces.application.Application | |
| javax.faces.application.FacesMessage | |
| javax.faces.application.FacesMessage$Severity | |
| javax.faces.application.NavigationHandler | |
| javax.faces.application.StateManager | |
| javax.faces.application.StateManager$SerializedView | |
| javax.faces.application.ViewHandler | |
| javax.faces.component.UIComponent | |
| javax.faces.component.UIViewRoot | |
| javax.faces.context.ExternalContext | |
| javax.faces.context.FacesContext | |
| javax.faces.convert.Converter | |
| javax.faces.el.EvaluationException | |
| javax.faces.el.MethodBinding | |
| javax.faces.el.ValueBinding | |
| javax.faces.event.PhaseEvent | |
| javax.faces.event.PhaseId | |
| javax.faces.model.DataModel | |
| javax.faces.model.SelectItem | |
| javax.interceptor.InvocationContext | |
| javax.jms.JMSException | |
| javax.jms.Message | |
| javax.jms.ObjectMessage | |
| javax.jms.Queue | |
| javax.jms.QueueConnection | |
| javax.jms.QueueConnectionFactory | |
| javax.jms.QueueSender | |
| javax.jms.QueueSession | |
| javax.jms.TextMessage | |
| javax.jms.Topic | |
| javax.jms.TopicConnection | |
| javax.jms.TopicConnectionFactory | |
| javax.jms.TopicPublisher | |
| javax.jms.TopicSession | |
| javax.jms.TopicSubscriber | |
| javax.naming.InitialContext | |
| javax.naming.NameNotFoundException | |
| javax.naming.NamingException | |
| javax.persistence.Entity | |
| javax.persistence.EntityManager | |
| javax.persistence.EntityManagerFactory | |
| javax.persistence.Id | |
| javax.persistence.Persistence | |
| javax.persistence.Query | |
| javax.portlet.ActionResponse | |
| javax.portlet.PortletRequest | |
| javax.portlet.PortletSession | |
| javax.security.auth.Subject | |
| javax.security.auth.callback.Callback | |
| javax.security.auth.callback.CallbackHandler | |
| javax.security.auth.callback.NameCallback | |
| javax.security.auth.callback.PasswordCallback | |
| javax.security.auth.callback.UnsupportedCallbackException | |
| javax.security.auth.login.AppConfigurationEntry | |
| javax.security.auth.login.AppConfigurationEntry$LoginModuleControlFlag | |
| javax.security.auth.login.Configuration | |
| javax.security.auth.login.LoginContext | |
| javax.security.auth.login.LoginException | |
| javax.security.auth.spi.LoginModule | |
| javax.servlet.ServletContext | |
| javax.servlet.ServletException | |
| javax.servlet.ServletRequest | |
| javax.servlet.http.Cookie | |
| javax.servlet.http.HttpServletRequest | |
| javax.servlet.http.HttpServletResponse | |
| javax.servlet.http.HttpSession | |
| javax.servlet.http.HttpSessionActivationListener | |
| javax.transaction.SystemException | |
| javax.transaction.TransactionManager | |
| javax.transaction.UserTransaction | |
| net.sf.cglib.proxy.Enhancer | |
| net.sf.cglib.proxy.Factory | |
| net.sf.cglib.proxy.MethodInterceptor | |
| net.sf.cglib.proxy.MethodProxy | |
| org.apache.commons.logging.Log | |
| org.apache.commons.logging.LogFactory | |
| org.dom4j.Document | |
| org.dom4j.DocumentException | |
| org.dom4j.Element | |
| org.dom4j.io.SAXReader | |
| org.drools.RuleBase | |
| org.drools.RuleBaseFactory | |
| org.drools.WorkingMemory | |
| org.drools.compiler.DrlParser | |
| org.drools.compiler.PackageBuilder | |
| org.drools.compiler.PackageBuilderConfiguration | |
| org.hibernate.Filter | |
| org.hibernate.FlushMode | |
| org.hibernate.Query | |
| org.hibernate.Session | |
| org.hibernate.SessionFactory | |
| org.hibernate.cfg.AnnotationConfiguration | |
| org.hibernate.cfg.Configuration | |
| org.hibernate.collection.PersistentCollection | |
| org.hibernate.lob.ReaderInputStream | |
| org.hibernate.util.ReflectHelper | |
| org.hibernate.validator.ClassValidator | |
| org.hibernate.validator.InvalidValue | |
| org.jboss.cache.PropertyConfigurator | |
| org.jboss.cache.aop.PojoCache | |
| org.jboss.ejb3.embedded.EJB3StandaloneBootstrap | |
| org.jboss.ejb3.embedded.EJB3StandaloneDeployer | |
| org.jboss.kernel.plugins.bootstrap.standalone.StandaloneBootstrap | |
| org.jboss.resource.adapter.jdbc.local.LocalTxDataSource | |
| org.jboss.resource.connectionmanager.CachedConnectionManager | |
| org.jboss.resource.connectionmanager.CachedConnectionManagerReference | |
| org.jboss.resource.connectionmanager.TransactionSynchronizer | |
| org.jboss.security.auth.callback.UsernamePasswordHandler | |
| org.jboss.tm.TransactionManagerLocator | |
| org.jboss.tm.usertx.client.ServerVMClientUserTransaction | |
| org.jboss.util.naming.NonSerializableFactory | |
| org.jbpm.JbpmConfiguration | |
| org.jbpm.JbpmContext | |
| org.jbpm.context.exe.ContextInstance | |
| org.jbpm.db.GraphSession | |
| org.jbpm.db.TaskMgmtSession | |
| org.jbpm.graph.def.Node | |
| org.jbpm.graph.def.ProcessDefinition | |
| org.jbpm.graph.exe.ExecutionContext | |
| org.jbpm.graph.exe.ProcessInstance | |
| org.jbpm.graph.exe.Token | |
| org.jbpm.jpdl.el.ELException | |
| org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator | |
| org.jbpm.persistence.db.DbPersistenceServiceFactory | |
| org.jbpm.taskmgmt.def.Task | |
| org.jbpm.taskmgmt.exe.TaskInstance | |
| org.jbpm.taskmgmt.exe.TaskMgmtInstance | |
| org.jbpm.util.ClassLoaderUtil | |
| org.xml.sax.EntityResolver | |
| org.xml.sax.InputSource |
and on error output some stuff which can safely be ignored:
Code:
| couldn't find: org.jboss.seam.actionparam.ActionParamMethodBinding: No file for: MethodBinding | |
| couldn't find: org.jboss.seam.actionparam.ActionParamValueBinding: No file for: ValueBinding | |
| couldn't find: org.jboss.seam.util.UnifiedELValueBinding: No file for: ValueBinding | |
| couldn't find: org.jboss.seam.util.UnifiedELMethodBinding: No file for: MethodBinding | |
| couldn't find: org.jboss.seam.pageflow.Page: No file for: Node | |
| couldn't find: org.jboss.seam.pageflow.PageflowParser: No file for: JpdlXmlReader | |
| couldn't find: org.jboss.seam.jbpm.SeamVariableResolver: No file for: VariableResolver | |
| couldn't find: org.jboss.seam.core.Dispatcher: No file for: TimerHandle | |
| couldn't find: org.jboss.seam.core.ManagedJbpmContext: No file for: Synchronization | |
| couldn't find: org.jboss.seam.core.TaskInstance$1: No file for: TaskInstance | |
| couldn't find: org.jboss.seam.core.ProcessInstance$1: No file for: ProcessInstance | |
| couldn't find: org.jboss.seam.intercept.ClientSideInterceptor: No file for: MethodInterceptor | |
| couldn't find: org.jboss.seam.intercept.JavaBeanInterceptor: No file for: MethodInterceptor | |
| couldn't find: org.jboss.seam.intercept.EJBInvocationContext: No file for: InvocationContext | |
| couldn't find: org.jboss.seam.intercept.EE5SeamInvocationContext: No file for: InvocationContext | |
| couldn't find: org.jboss.seam.core.Dispatcher. Asynchronous | |
| couldn't find: org.jboss.seam.core.Dispatcher. AsynchronousEvent | |
| couldn't find: org.jboss.seam.core.Dispatcher. AsynchronousInvocation | |
| couldn't find: org.jboss.seam.core.Dispatcher. TimerHandleProxy | |
| couldn't find: org.jboss.seam.core.Dispatcher. TimerProxy | |
| couldn't find: org.jboss.seam.core.Dispatcher$TimerProxy: No file for: Timer | |
| couldn't find: org.jboss.seam.core.ManagedHibernateSession: No file for: HttpSessionActivationListener | |
| couldn't find: org.jboss.seam.core.ManagedPersistenceContext: No file for: HttpSessionActivationListener | |
| couldn't find: org.jboss.seam.core.UiComponent$1: No file for: UIComponent | |
| couldn't find: org.jboss.seam.jsf.ListDataModel: No file for: ListDataModel | |
| couldn't find: org.jboss.seam.jsf.ArrayDataModel: No file for: ArrayDataModel | |
| couldn't find: org.jboss.seam.jsf.MapDataModel: No file for: DataModel | |
| couldn't find: org.jboss.seam.jsf.SetDataModel: No file for: DataModel | |
| couldn't find: org.jboss.seam.drools.DroolsActionHandler: No file for: ActionHandler | |
| couldn't find: org.jboss.seam.drools.DroolsAssignmentHandler: No file for: AssignmentHandler | |
| couldn't find: org.jboss.seam.drools.DroolsDecisionHandler: No file for: DecisionHandler | |
| couldn't find: org.jboss.seam.remoting.messaging.SubscriptionRegistry$1: No file for: ExceptionListener | |
| couldn't find: org.jboss.seam.jsf.AbstractSeamPhaseListener: No file for: PhaseListener | |
| couldn't find: org.jboss.seam.jsf.SeamApplication11: No file for: Application | |
| couldn't find: org.jboss.seam.jsf.SeamApplicationFactory: No file for: ApplicationFactory | |
| couldn't find: org.jboss.seam.jsf.SeamELResolver: No file for: ELResolver | |
| couldn't find: org.jboss.seam.jsf.SeamNavigationHandler: No file for: NavigationHandler | |
| couldn't find: org.jboss.seam.jsf.SeamStateManager: No file for: StateManager | |
| couldn't find: org.jboss.seam.jsf.SeamVariableResolver: No file for: VariableResolver | |
| couldn't find: org.jboss.seam.jsf.SeamViewHandler: No file for: ViewHandler | |
| couldn't find: org.jboss.seam.mock.MockApplication: No file for: Application | |
| couldn't find: org.jboss.seam.mock.MockExternalContext: No file for: ExternalContext | |
| couldn't find: org.jboss.seam.mock.MockFacesContext: No file for: FacesContext | |
| couldn't find: org.jboss.seam.mock.MockHttpServletRequest: No file for: HttpServletRequest | |
| couldn't find: org.jboss.seam.mock.MockHttpSession: No file for: HttpSession | |
| couldn't find: org.jboss.seam.mock.MockLifecycle: No file for: Lifecycle | |
| couldn't find: org.jboss.seam.mock.MockNavigationHandler: No file for: NavigationHandler | |
| couldn't find: org.jboss.seam.mock.MockRenderKit: No file for: RenderKit | |
| couldn't find: org.jboss.seam.mock.MockResponseStateManager: No file for: ResponseStateManager | |
| couldn't find: org.jboss.seam.mock.MockServletContext: No file for: ServletContext | |
| couldn't find: org.jboss.seam.mock.MockStateManager: No file for: StateManager | |
| couldn't find: org.jboss.seam.mock.MockViewHandler: No file for: ViewHandler | |
| couldn't find: org.jboss.seam.remoting.SeamRemotingServlet: No file for: HttpServlet | |
| couldn't find: org.jboss.seam.security.filter.SeamSecurityFilter: No file for: Filter | |
| couldn't find: org.jboss.seam.servlet.SeamCharacterEncodingFilter: No file for: Filter | |
| couldn't find: org.jboss.seam.servlet.SeamExceptionFilter: No file for: Filter | |
| couldn't find: org.jboss.seam.servlet.SeamListener: No file for: ServletContextListener | |
| couldn't find: org.jboss.seam.servlet.SeamRedirectFilter$1: No file for: HttpServletResponseWrapper | |
| couldn't find: org.jboss.seam.servlet.SeamRedirectFilter: No file for: Filter | |
| couldn't find: org.jboss.seam.servlet.SeamServletFilter: No file for: Filter | |
| couldn't find: org.jboss.seam.util.EL$1: No file for: ELContext |
Now I'm using the first output as is to guess what JAR provides them but this is because I know them quite well.
This might not be always that easy, so an automatic way to find what Maven artifact provides those would be great ![]()
19.11.06
Preserving lexical information when modifying an XML document
When modifying an existing document, the easiest solution is to load it from storage (DOM, SAX or STaX), modify it and write it back to storage, but that process destroys original XML layout, comments, white spaces, etc ...
SAX2's property http://xml.org/sax/properties/lexical-handler allows to catch lexical events such as whitespaces. It might allow to preserve lexical information when writing back a modified XML document.
Code:
| // Set the lexical handler | |
| saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", | |
| lexicalInformationPreserverHandler); |
I'll have to try that when I find the time ![]()
14.11.06
Spring-Annotation
An independant initiative to add support for annotation based configuration to Spring.
Despite the 1.0 version tag, it is not very mature yet. It should be based on the new Spring DSL framework but is not.
Looking forward for it though.
Finally Java in GPL ...
It has been on every one in IT business's wish list for a while and finally there it is ... Java GPLed.
That's great news for the IT industry in general even if in my own professionnal experience, Java not being GPLed has never been an issue.
Nonetheless, congrats !