Category Archives: Software

Scalix Brings Group Calendaring to Linux

eWeek is running an article on groupware for Linux:

Companies looking to migrate from Exchange to a Linux-based messaging system or that want broader groupware functionality will find a good solution in Scalix’s Email and Calendaring Platform. From the user’s perspective, the Outlook experience is very good, although the Web client could use some improvement. Email and Calendaring Platform is priced at $60 per user, $600 for a server with 500 mailboxes and $3,500 for the Enterprise Edition. More information is available at www.scalix.com.

I know that many clients are using Microsoft products only for groupware, so this is important.

VoIP and Presence

Corporate and personal communications is undergoing an obvious revolution right before our eyes. I won’t comment on this aspect of VoIP since there are so many doing so, particularly in the large news publications. However, we’re missing something: presence.

Instant messaging has boomed and become an almost integral part of our society, with youth leading this integration. Have we not noticed that this form of communication is almost entirely controlled by a select few corporations? To name a few:

This is all a Bad Thing™! Lets reminisce for a moment about good, old fashioned, email service. This technology is completely decentralized and relies on each entity having their own SMTP system. If I want to send you mail, I simply do a DNS lookup to find your mail server and off I go. This server can either be provided by your ISP, out-sourced to another provider or you may have set it up internally.

Contrast this with IM, where your messages are being routed by a third-party who:

  • Is not receiving money from you
  • Made you accept a disclaimer that basically guarantees less than nothing
  • Doesn’t really want to interface with the other IM providers

To actually start discussing VoIP now, the above prevents good presence for VoIP applications.

Thankfully, the defacto VoIP protocol, SIP, has full support for an SMTP-like distrbuted model using SRV records in DNS. This allows the DNS system to be queries for the correct SIP server for a domain and therefore gives us nice, convenient addresses for voice communications using the familiar “user@domain” form.

Built on top of SIP, there is SIMPLE or the S I M P L E. This upgrades your SIP infrastructure to support full presence and instant messaging capabilities. So far, I know of very few clients that have full SIMPLE support:

Also, I believe that Microsoft‘s Windows Messenger is available in a SIP edition.

A major open instant messaging protocol, Jabber, also has the above mentioned SRV capability. It seems to be under implemented in practice, however, with many people not even bothering. Jabber uses the XMPP protocol and bridges exist to allow SIMPLE to interoperate with it.

I’m rambling here. To get to the point, it seems that integrating SIP hardware devices : Analog Telephone Adapters (ATAs), like those from Sipura, and desk phones like those from Polycom; with presence provided either by SIMPLE or XMPP, is a problem. See, when you are using a great hardware phone for actual calling, you can’t do decent presence. How will my Jabber client know that I’m on the phone in order to set my status to “On the phone”?

My conclusion is that we should really be using softphones. Why not? Don’t we all have laptops and Bluetooth headsets? :-) Well, I intend to get myself fully setup this way. To heck with all the other ways of getting voice service. Also, Jabber isn’t a great candidate unless you use something like the myJabber Instant Messaging Client for XMPP and myJabber AE Soft Phone combination, which is non-standard.

More to come on this topic once I get a copy of eyeBeam for Mac OS X to play with.

ReferenceField can not be searchable

Under Archectypes 1.3 (final), I had a ReferenceField setup with searchable=True and this caused a TypeError when saving the object:

Traceback (innermost last):
  Module ZPublisher.Publish, line 100, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 40, in call_object
  Module Products.CMFFormController.FSControllerPageTemplate, line 98, in __call__
  Module Products.CMFFormController.BaseControllerPageTemplate, line 39, in _call
  Module Products.CMFFormController.ControllerBase, line 191, in getNext
  Module Products.CMFFormController.Actions.TraverseTo, line 36, in __call__
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 40, in call_object
  Module Products.CMFFormController.FSControllerPythonScript, line 105, in __call__
  Module Products.CMFFormController.Script, line 141, in __call__
  Module Products.CMFCore.FSPythonScript, line 104, in __call__
  Module Shared.DC.Scripts.Bindings, line 306, in __call__
  Module Shared.DC.Scripts.Bindings, line 343, in _bindAndExec
  Module Products.CMFCore.FSPythonScript, line 160, in _exec
  Module None, line 11, in content_edit
   - <fscontrollerpythonscript at /plone1/content_edit used for /plone1/organization.2004-10-04.8620291094>
   - Line 11
  Module Products.Archetypes.BaseObject, line 573, in processForm
  Module Products.Archetypes.BaseObject, line 566, in _processForm
   - __traceback_info__: (<organization at /plone1/organization.2004-10-04.8620291094>, <field Notes(text:rw)>, <bound method Organization.setNotes of <organization at /plone1/organization.2004-10-04.8620291094>>)
  Module Products.Archetypes.CatalogMultiplex, line 60, in reindexObject
  Module Products.CMFMember.CatalogTool, line 51, in catalog_object
  Module Products.ZCatalog.ZCatalog, line 513, in catalog_object
  Module Products.ZCatalog.Catalog, line 381, in catalogObject
  Module Products.ZCTextIndex.ZCTextIndex, line 163, in index_object
  Module Products.ZCTextIndex.ZCTextIndex, line 173, in _index_object
  Module Products.Archetypes.BaseObject, line 475, in SearchableText
  Module Products.Archetypes.BaseObject, line 475, in <lambda>
  Module Products.Archetypes.utils, line 276, in getValue
TypeError: DisplayList keys must be strings or ints, got <extension class Acquisition.ImplicitAcquirerWrapper at 775140>

The only reference to this that I’ve found is on the list. Setting searchable=False avoids the issue. I do not know if this is an actual bug.

Hacking iChat for Generic SIP Support

The Setting

At this week’s OJUG meeting, I mentioned to Patrick Linskey that I would really like to see iChat as a client to generic SIP servers. He said that it may be possible given Cocoa’s design, so I’ve been looking into it. Here is a set of related links:

  1. Apple iChat Technology Brief,
  2. Blog entry on the subject, gives some protocol details
  3. Another entry discussing the protocols

I also took a look around to see what iChat is doing under the covers. First, when iChat is running, it uses 2 pieces:

  • /Applications/iChat.app/Contents/MacOS/iChat
  • /System/Library/PrivateFrameworks/InstantMessage.framework /iChatAgent.app/Contents/MacOS/iChatAgent

When you are doing audio or video communications, you will notice access another shared library:

  • /System/Library/PrivateFrameworks/VideoConference.framework

The above is where it gets interesting. I ran class-dump on it, output available here. Of particular interest is an interface called SIPManager. There is also a lot of RTP and SDP related things in there, but I’m now over my head in regards to grokking Objective-C.

Where Do We Go From Here?

I believe it is very important to have a general SIP client that has iChat’s audio quality and integration into the operating system. Can we hack it?

OJUG on August 26th, 2004

I attended this past week’s OJUG meeting in Ottawa, which was very useful. Patrick Linskey, CTO of SolarMetric (developers of Kodo JDO) and co-author of Bitter EJB. He discussed JDO 2.0 JSR 243.

I am very interested in the next version of JDO as I’ve used Hibernate with great success and am looking for something similar, but standards based.

Some implementations of JDO 1.0 and 2.0 are listed at JDO Central. Kodo JDO 3.2 Beta has many of the JDO 2.0 features.

Some of my notes from the presentation:

  1. The big problem in the OR/M world is not the M, but rather the remoteness of data being manipulated
  2. JDO is an Abstract API for Object Persistence
  3. OR/M is an old, well understood problem. It has been solved many times and there is probably little room for real innovation. This is the counter for those that believe that a specification stifles innovation. Isn’t there room for innovation at the API level?
  4. Provides portability between relational and non-relational datastores
  5. Can support J2ME if you provide a Java Collections implementation since J2ME does not provide one
  6. You shouldn’t see the JDO API very often. Most of your data access happens through your object model. You will only see the API for queries & deletions. (Supposing your container is handling transactions.)
  7. Very much tries to do things the Java Way
  8. There is no such thing as POJO persistence
  9. Regarding some Java OR/M implementations that use object proxies: proxies are not the real objects. This will bite you in unusual places. The example is that EmployeeProxy does not extend PersonProxy.
  10. The current problem with bytecode manipulation is that there is no standard to prevent multiple tools from stepping on each other
  11. Gavin King is no longer on the JDO 2.0 committee
  12. No more “autocommit” support!
  13. Uses named queries. You can override a named query with a custom piece of SQL for each targeted database, if necessary
  14. Kodo has a cool workbench
  15. We all should watch TSS
  16. Primary key support: transparent (implementation specific), application identity or simple identity and non-durable
  17. SolarMetric has a disconnected operation and synchronization product
  18. No criteria API, but third party tools can provide this by generating JDOQL. Neither is there find-by-example, but this can also be implemented externally

We all went over to the Mayflower II for beer and conversation after the meeting. A good time was had by all.

Cheers,

A.

Looking for Enterprise Java Developers

We are looking for two Java developers for a project starting shortly. Please do not bother to apply if you do not meet the following criteria:

  • Portfolio of code; or

  • Demonstratable involvement in an Open Source Java project; and

  • Experience with tools such as Ant Subversion and XDoclet; and

  • Experience with UNIX integration and development;

Update: This is for a consulting firm that is waiting to hear whether they have been selected for a medium sized project. They want to have potential team members selected in advance.

Update: This project has not been given funding.

Thanks.

A.

It’s All About Graphs

Stefano Mazzocchi has an interesting entry It’s All About Graphs

Exerpt:

People in all sort of communities realize how important semi-structured data is and how much it will be in the future. These people tend to think that XML will solve the problem for them and once we have a serious XML query language, we’ll be set forever.

Well, wrong. Relations are tables, XML documents are trees, and, guess what, RDF models are graphs. Yep, you got it, RDF can describe both.

A colleague and I have been discussing the various post-relational approaches to structured data. We have a pair of very interesting use cases to work on. I’ll try and post more on this topic eventually.

WordPress CSS Guides

There is an excellent WordPress CSS Guides site, check it out:

These tutorial pages are an attempt to help explain some more about the CSS that controls your WordPress weblog, and enable you to both see how CSS affects your page, and hopefully remove any worries you have about it.

Maven vs Ant

Updated: Since I’ve noticed quite a few Google hits on this entry, I thought I’d post some more information.

I’ve finally figured out what Maven is all about. (No one seems to say it outright.) This enlightenment comes after writing a previous post

The basic difference is fundamental: where Ant allows you to build your own targets to do anything you wish, Maven takes your description of your project (directory structure, etc) and uses standard, pre-written, tasks (goals in Maven-speak) to achieve the usual build needs.

Maven has a bunch of built-in plugins and goals. You can write your own using Jelly.

I’ll be updating this post with some more info shortly. (Ok, so I guess it took a while. My conclusion seems to be staying with Ant, particularly with the addition of new extensions.)

Some relatively clean information is available here

JJar

JJAR promises to be a tool/service that the Java community sorely needs. We are all too familiar with Jar hell.

From the site:

A distributed repository consisting of jars from various projects (which we call packages) as well as version and dependency information about those packages. This logical repository consists of a central main repository, and any number of sub-repositories, each responsible for a given project (or projects.)

A toolset to allow the navigation and fetching from this repository, as well as direct access to repository information, such as project dependencies.

The general idea is that you setup a repository for your jars, including full dependancy information, which then allows you to use the Ant task as noted here

However, I see very little activity on this project. CVS has nothing interesting in over 2 years. Anyone know its status?

I do intend to test it this week, even though it seems inactive. (Probably because of Maven

Sam Greenblatt

Just came back from a great presentation by Sam Greenblatt of Computer Associates

He was very charismatic but I felt that he chanted the Open Source thing too much. I use Open Source everyday, what does it mean for CA? His topic was CA’s use of Plone and its integration into their management tools.

And Sam needs to blog!

Now coming to you from WordPress

After some deliberation, I’ve settled on WordPress for my blogging needs. It mostly came down to ease of use, since I realized that I simply was not producing anything of interest and that the smoothest solution would help this.

On my list of additions is still a Wiki, with integration into my blog posts. Any ideas?

Tighter Integration of JAXB & JAX-RPC

Working with the XML specifications for Java has always been a pleasure for me. Yes, some criticise them fiercely, however I feel they are mostly adequate for t he task.

I recently encountered a problem with JAXB; the specification requires two behaviours which I find to cause integration hassles:

  1. You must use ObjectFactory to get new beans,
  2. ObjectFactory creates beans with null references

Both issues crop up when using JAXB with a container such as PicoContainer, Spring or anything else that expects to be able to instantiate empty beans without special knowledge.

The second issue becomes a difficulty when using JAXB beans with “dot notation”. For example, you cannot simply create an empty bean and then try and set a property like car.engine.timing since the reference to engine is null until you create an Engine object and assign it. Would it be more appropriate to recursively populate the bean?

George Datuashvili mentioned on the JAXB mailing list:

“In future JAX-RPC 2.0 will be based on JAXB 2.0, and since JAX-RPC already requires EJB bindings, your issue will have to be resolved by JAXB or JAX-RPC working groups.”

That thread also talks about using java.lang.Proxy, which I find very interesting.

JBoss 3.2.2 and the Java Web Services Developer Pack

While attempting to deploy an EJB jar on a fresh installation of JBoss 3.2.2 I received the following error: (Sorry about the long lines.)

java.lang.NoSuchMethodError: org.apache.bcel.generic.InstructionFactory.createNewArray(Lorg/apache/bcel/generic/Type;S)Lorg/apache/bcel/generic/Instruction;

Looked like a version mismatch to me, which would be wierd because JBoss should be using the version of Apache BCEL that shipped with it, no? But what if we have a traitor among us?

I quickly remembered all the cruft that the Java Web Services Developer Pack wanted me to install in the JRE’s endorsed directory, might something there be the culprit?

Indeed, it seems that xsltc.jar contains a version of BCEL. (A rant for another day: even if it makes people do more deployement work, please do not include dependancies in your jars.) I believe that some versions of the Xalan jar also include BCEL, so beware.

Solution: I hope this doesn’t have any side-effects, but you can solve the immediate problem by copying the version of BCEL that ships with JBoss 3.2.2 into your endorsed directory. The BCEL jar is probably located at $JAVA_HOME/server/default/lib/bcel.jar and you want to put it in $JAVA_HOME/jre/lib/endorsed.

How little things can become time-sinks.

Packaging Taglibs

Keeping track of the tld files for a framework or API is an error-prone process, very much so when using a framework like Struts or JSTL that has multiple tag libraries .

A better solution is to package the TLD files along with the rest of the library’s classes and other resources. This is actually mandated by the JSP specification, but who reads specs anyway. IBM developerWorks has a great series on JSP best practices, or which one of the articles explains this technique:

http://www.ibm.com/developerworks/java/library/j-jsp09023/

The short explanation is to put the TLD files in the META-INF directory of the jar file and reference them in your deployement descriptor like so:


<taglib>
<taglib-uri>http://www.newInstance.com/taglibs/site-utils</taglib-uri>
<taglib-location>/WEB-INF/lib/newInstance-taglib_1-1.jar</taglib-location>
</taglib>

Some of the other articles in the series are worthwhile as well.

In addition to this simple use of advanced jar packaging, there is a multitude of other abilities that are completely ignored, I will post some more on this subject this week.

Choosing an Application Framework

Since I do not believe that Struts is the be all and end all of application frameworks, I’ve been looking around at the competition. There are quite a few. Since I believe that this IoC (Inversion of Control) thing is a Good Thing, I’ve restricted my search to those frameworks that manage not only the “actions” of an application but also it’s components.

Currently, there is the following:

I’ve been hearing some Bad Things about WebWork lately, nothing substantiated though.

Another possibility is too do something homegrown on top of PicoContainer.

In then end, I realise that it is a very difficult topic. But I have a plan: I want to put together an evaluation sheet for frameworks. Please email me your thoughts and I will condense them into another posting.