Monday, December 17, 2012

VFSJFileChooser and XPontus are unmaintained

  Both VFSJFileChooser and XPontus XML Editor are currently "very inactive", I just needed to make it "very official"!

  Surprisingly, as soon as I stopped working on those projects, I started getting tons of emails related to features requests, bugs or general questions.

 It was a nice run...

 While I may still work on Open Source projects, they will always be small to medium. Nowadays, I focus pretty much all my energy on my Consulting company, Rimero Solutions.

 Below is the short story of XPontus and VFSJFilechooser.

XPontus
  XPontus is probably my most successful project in terms of downloads and interest. Sadly the code was written very late at night without "much love" from an API perspective.
   Beer was often around to ease the pain, that's the poor man's truth! I was awake and coding almost all the time...

Audience and expectations
  The first release introduced a basic text editor with syntax highlighting, as well as few features for validating and transforming XML. The program was fast and simple.
  I started getting feedback quickly as well as many requests about code completion and other missing features.

  Around the last release, I realized that editor was widely used. On Sourceforge there was about 30 000 downloads. I would estimate about the same number of combined downloads  from many other sites such as Freshmeat(now freecode it seems), Softpedia, etc.

  XPontus was then expected to reach quickly the same level of functionality than Altova XML Spy and others. One Open Source Developer against many dedicated Corporate developers...

Planning
  It took me a while to get comfortable with Sourceforge. Between research and related coding activities, I kinda rushed things.

  With too many users' requests, I felt like 24h wasn't enough, especially with a full-time on-site job.

  I was still learning some parts of Java Swing while writing the software and I never could perform a full cleanup. I just kept adding new features to please users at the expense of maintenance issues and additional bugs...

Failure to involve other developers
  Maven is often an issue among Java Developers. In real life, not that many people are comfortable with it, especially when it's a multi-project module.

  Because the API was a bit crappy and not very flexible, people got discouraged. I also had to answer tons of questions related to design and the various technologies that I was using.


Support, later on

 Initially, I generated all the installers manually, more control, but time consuming for testing on many platforms. Later on, ej-technologies gave me a free license of Install4j while I received a free copy of IntelliJ by JetBrainsApama designed the new XPontus logo.


Last effort
  I attempted a rewrite in late 2009 using OSGI but I had the impression that it would become a bit like Eclipse Framework, but for Swing.

  The new rewrite was better designed, higher quality but it was too time consuming. I thought about making the project commercial after ensuring that I was using only Apache Licensed libraries.

  I wish that I had the same programming abilities few years ago...

VFSJFileChooser 

Audience
  I always expected VFSJFileChooser to draw interest but not that much. It was a product by a developer and for developers. The library was meant to provide a file dialog component with out-of-the-box remote browsing features. The project was not much advertised.

  VFSJFileChooser was originally supposed to complement XPontus XML Editor by providing a filesystem abstraction layer. The component was then extracted to make it generic.

General planning
  Because it was my second Open Source project, I came prepared.

  I was both organized and I knew my entire Open Source workflow well. My growing Swing experience also helped a lot.

  The scope of the project allowed to be more focused in general. I was more disciplined in terms of programming habits and time allocation.

Community involvement
  As it was a relatively small project that used Ant (and not the evil Maven), I received lots of valuable contributions very quickly.

  Some new members joined the team and were were able to get along very quickly. I didn't have to provide any explanations, nor did I answer more than few technical questions.

  We did two releases together, if I recall correctly, and I was really happy about it. I also didn't feel "alone" anymore.

  My life was getting very unbalanced and I was also exploring new career opportunities, so that was pretty much the end of  it.

Other alternatives
  • otrosvfsbrowser is a File browser for Apache Commons VFS version 2. It was created as alternative to "VFS JFileChooser" and "Commons VFS - UI".
  • vfsjfilechooser2 is a mavenized fork of the dormant vfsjfilechooser project on sf.net.

Saturday, December 08, 2012

emacs-grails-mode enhancements

I'm now using Emacs again as my main Anything (Text Editing, Mail Reading, Blogging, Chat, etc.).

I still use vi and IDEs randomly but I will dedicate more time to master Emacs (don't quote me on that...) and a bit of Lisp.

I was looking for some Emacs packages for Grails Development and I found emacs-grails-mode.
It's nice, but it doesn't seem to provide few things such as running a random Grails command against a project.

During development, most of the time I'm jumping between files using find-file-in-project. Occasionally, I use few functions provided by emacs-grails-mode to switch between files associated to Grails domain classes.

Then, whenever I want to run a Grails command, I switch to a dedicated shell buffer. I read the output and I jump back to the file(s) that I'm working on...

I'm no Lisp coder which is a bit sad from my perspective. If I were fluent with it, I could write couple of Emacs packages or improve few things for my personal taste.


Below is my first attempt to improve emacs-grails-mode. I will soon create a basic project on my corporate GitHub account and push the code there. The license will be GPL v3.

I added the following extensions to emacs-grails-mode.
  • Few functions to run some Grails commands from the project folder.
  • There are are also 3 functions to browse API docs, Wiki docs as well as the latest reference guide.


;; ================================
;; Extensions for grails-mode
;; Author : Yves Zoundi
;; Created : 08-Dec-2012
;; 
;; License: GNU GPL v3 (http://www.gnu.org/licenses/gpl-3.0.txt)
;; Sypnosis:
;;    Run grails command on a project
;;
;; TODO:
;;   - Add some easy keybindings like in Rinari
;;   - Would be nice if auto-completion was there
;;     (including dynamic methods)
;;   - Anything else that would be useful for Grails development
;; ================================
(require 'grails-mode)

;; --------------------------------
;; Main functions
;; --------------------------------
(defun grails/command (str)
  "Run a Grails command (Non interactive)"
  
  (project-ensure-current)
  (setq shell-command-initial-directory 
        (project-default-directory (project-current)))
  ;; store old directory
  (setq old-dir default-directory)

  (setq command-initial-directory 
        (expand-file-name shell-command-initial-directory))
  (cd command-initial-directory)
  
  ;; runs the grails command from the project directory
  (async-shell-command (concat "grails " str) nil nil)

  ;; restore previous directory
  (cd old-dir)
  )

 (defun grails/read-param-and-run (input-hint grails-command)
  "Read an input parameter and invoke a given Grails command"
  (setq grails-command-argument 
        (read-from-minibuffer input-hint))  

  (grails/command 
        (concat grails-command " " grails-command-argument))
 )

;; --------------------------------
;; General functions
;; --------------------------------
(defun grails/icommand ()
  "Enter a Grails command (Interactive)"
  (interactive)  
  (grails/read-param-and-run "Goal:" "")
  )

(defun grails/create-domain ()
  "Create a Grails Domain Class"
  (interactive)
  (grails/read-param-and-run 
   "Domain class:" "create-domain-class")
  )

(defun grails/create-controller ()
  "Create a Grails Controller"
  (interactive)
  (grails/read-param-and-run 
   "Controller Domain class:" "create-controller")
  )

(defun grails/create-service ()
  "Create a Grails Service"
  (interactive)
  (grails/read-param-and-run 
   "Service Domain class:" "create-service")
  )

(defun grails/create-taglib ()
  "Create a Grails Taglib"
  (interactive)
  (grails/read-param-and-run 
   "TagLib Name:" "create-tag-lib")
  )

;; --------------------------------
;; Plugin functions
;; --------------------------------
(defun grails/install-plugin ()
  "Install a Grails plugin"
  (interactive)
  (grails/read-param-and-run 
   "name optionalversion:" "install-plugin")
  )

(defun grails/uninstall-plugin ()
  "Uninstall a Grails plugin"
  (interactive)
  (grails/read-param-and-run 
   "Plugin Name:" "uninstall-plugin")
  )

(defun grails/package-plugin ()
  "Package a Grails plugin"
  (interactive)
  (grails/command "package-plugin")
  )

(defun grails/refresh-dependencies ()
  "Refresh Grails Dependencies"
  (interactive)
  (grails/command "refresh-dependencies")
  )

;; --------------------------------
;; Browse docs (api, wiki, guide)
;; --------------------------------
(defun grails/browse-wiki-docs ()
   "Browse the Wiki Documentation"
   (interactive)
   (browse-url "http://grails.org/Documentation")
)

(defun grails/browse-api-docs ()
   "Browse the API Documentation"
   (interactive)
   (browse-url "http://grails.org/doc/latest/api/")
)

(defun grails/browse-latest-guide ()
   "Browse the official Grails Guide"
   (interactive)
   (browse-url "http://grails.org/doc/latest/guide/single.html")
)

(provide 'emacs-grails-mode-ext)