Wednesday, August 13, 2008

Netbeans6.1 Plugin - Export as archive version 1.02.1

Read all about the Export as archive version 1.01.1.

In this version I have provided a dialog to choose the archive name and the folder in which the archive has to be created. The rest is the same.

I have a question from users
1. Is the dialog neccessary
2. If not all the time, would a check box "Don't show dialog again" suffice

Do provide your comments.

Wednesday, June 11, 2008

Netbeans6.1 Plugin - Use System Desktop

This plugin taps into the potential of java.awt.Desktop and allows users to open/edit, view in browser and send by mail the selected node. the caveats are as follows.

1. Behaviour is not guaranteed to be as expected. For example browse and open can do the same thing - open in the default editor. My testing has shown that only html and xml files open properly in browser.
2. Mail - Selected file is not intriduced as an attachment since the mailto protocol does not support attachments.
3. There are no options to set. What ever is set on the operating system will be used.
4. When file association are not set; For example for file there might not be a file association. In these case you get an IOException which is shown to the user.
5. Works with Netbeans 6.1 and JDK6 only
6. Tested Platforms - Netbeans 6.1 and JDK6 Update 10 on Windows XP
7. BIG NOTE: If an application is not associated with the given file. it does not bring up the "Open With" dialog

Screen Shots

Note: This plugin is not supported for NB with Java 5
if installed with Java 5, then you see an empty menu under Tools-->Desktop

The plugin is now available from within the Plugin manager.

Thursday, June 05, 2008

Netbeans6.1 Plugin - Export as archive

Netbeans has been a fascination for me. Ere it was Forte For Java which was then rechristened as sun java studio. Those were the days. Then Netbeans 5.0 happened. It was time to bid adieu to Java studio. In my current place of work, I am the source of frustration and amusement to many people since I am the only one to use Netbeans when the rest of the organisation is eclipse based. So you can see that friction is high because I am one against many in a debate on which is better - Netbeans or Eclipse. (see my previous post on why I find Netbeans as a better option). In one such debate came the notion of export as. Eclipse has many options for their Export As feature. But Netbeans does not. And so this plugin.

You can download the plugin from the netbeans plugin portal Export as archive. It is not available in the Plugin-manager now pending verification.

Supported Platform - Netbeans 6.1
You can click the Download button on the banner to the left to get Netbeans.

Plugin details -
The source code is available at

Now for the interesting parts.
The action extends from CookieAction and Over-rides two methods of interest
  • performAction(Node[] activatedNodes)
  • enable(Node[] activatedNodes).
first the enable method
This ensures if for a selected node the export option should be enabled or not. I would have preferred along with that a visible option. But since that is not available will survive with it though. So the way I am enabling the option is checking with the DataObject. If the DataObject does not have a primary file, then don't enable other wise enable it.

performAction method - delegates call to a simple private method.
This method picks up the primary file from the DataObject, constructs an Ant Script. The idea of using an Ant Script was inspired by Geertjan's blog. Earlier I used a grossly inefficient way - traversing directories and adding them to a Zip stream.

Steps to create such a Plugin
1. Create a New Project - Choose Netbeans Module-->Module
2. In the next screen fill up the entries but ensure that the Standalone radio button is selected.Tis marked in a red box.
3. Finish the wizard.
4. Click on the Project and Select New (Bring up the New File wizard)
5. Select Conditionally Enabled radio button and DataObject from the dropdown/combo box
6. In the next screen you can choose any combinations
7. Complete the wizard steps.
8. Provide implementation for the performAction method.
Simple 8 steps.
What to expect in future? For now I am thinking of two things. You can pour in your views.
1. Multiple Selected nodes (With restrictions of course)
2. Wizard like facility to choose destinations.

Enjoy archiving your projects.

Friday, January 25, 2008

my Experiences with Netbeans

For a long time I was enamoured by Forte For Java with their broken App theme. Then I gave up with Netbeans turning out to be lighter and swifter. Since that time I have been developing with Netbeans much to the amusement and sometime frustration of my colleagues who use Eclipse. I have worked with eclipse enough time to hate it. I hate it all the more when it gives me OutOfmemory error when I run a build using ANT. But I digress. The objective of this blog is not to make Netbeans look good by describing Eclipse as bad.

What role does an IDDE play in the development life cycle?

Most of the time an IDDE is linked with DnD type of programming suitable for GUI building. But an IDDE is more than that. The following are what I looked for and got from Netbeans (6 being the best till date).

1. No Spoon feeding - Let the IDDE make me write code related to business need and prevent me from templates and boiler plates. Netbeans does not provide different types of code templates like what Eclipse does. For ex. in Eclipse if I type test and use ctrl+space it gives me a lot of options. Netbeans does not do that. (10 for Eclipse, -1 for Netbeans)

2. The IDDE should be very responsive. A user action should result in near-immediate response. For ex. If i do a ctrl+space, my IDDE should not go into a Zombie state and hang for a long time or worse crash. (10 for Netbeans, -1 for eclipse)

3. Bare platform should be sufficient. It is wrong to assume that a desktop/library developer would not be needing web components. In Eclipse you need to pull in plugins and additional things, cross your fingers, toes, hands and legs and pray that this would work. Netbeans gives it to me without much ado. - No plugins needed. (10 For Netbeans, -5 for Eclipse)

4. User Interface and accessibility. Less said about eclipse, the better. Sad part is NB6 has moved a little in the eclipse direction. Most of the key board short cuts have changed and it needed some trying around to figure out how to get the NB 5 Keyboard mappings. Eclipse Debug window is a pain. To add a watch statement, I need to right click on the breakpoint and select a menu option. Pain!!!
(Would have given 10 to Netbeans but they deserve to be punished for the Key mapping fiasco. So for this I give 5 to Netbeans and -1 to Eclipse)

5. Bloated workspace: I hate the concept of the workspace in eclipse. Every time I create a workspace, I need to give a lot of MBs for the .metadata folder. Check the properties of that folder any time and you would wonder, why do I need plugins in my workspace when my eclipse installation has it. Change settings in the workspace and when I move to a new workspace, I need to change the same settings again? Why? In my 10 years of working with technology I never found a need for such a feature. Netbeans use XML to maintain the information instead of copying needed plugins to the workspace. Infact there is no concept of workspace in netbeans.
(10 for Netbeans and -1 for Eclipse).

6. If there was one feature in Eclipse which I liked very much was the CVS feature. Netbeans 5 was pathetic in terms of diff, commiting etc. But with NB 6, Netbeans has thrashed eclipse soundly. ( So 5 for Netbeans and 10 for Eclipse for getting it right earlier)

7. Web tech debugging. Ever tried debugging a JSP in Eclipse, by just setting your break point and invoking the debugger. In Netbeans I just need to do that. The time I saved by NB Debugger feature is legendary. (-1 for Eclipse, 10 for Netbeans). I would have given -10 for this feature to eclipse, but did not since it would seem vengeful.

On a final note - Netbeans should be watchful that it does not fall into the trap of Eclipse of being unwieldy with nice features that dont work.

So total Score
Netbeans : 49
Eclipse : 9

Friday, June 01, 2007

Travails with JMS on IBM websphere 6 %$#@*&

When a programmer wants to check if his code/artifact would work across all containers, Websphere comes in to throw a spanner in the works. First you have to unlearn all that you have leached out from Websphere 5 (no good except for nostalgia). Second these are the problems you face during installation
1. Something new - Profiles. you can create as many profiles as you want. If you have used Firefox, you would know about profiles.
2. Then you do a host of updgrades - I guess if your server version shows, you do have a stable environment.
3. JMS configurations have become a nightmare. I have an app which uses about 15 messaging destinations and you know what - using the destination names for your validations or logic is on websphere 6. What code works on Glassfish, JBoss, Weblogic is not guaranteed to work on Websphere simply because of many things which are as follows.
  1. Java Connector architecture - Learn the specs carefully
  2. Buses - Start point for your JMS configuration
  3. Bus Members - Create A bus and Add bus member - which is your server profile instance
  4. When you create a Bus member a Messaging instance is created. Check that it is created and started. If the state is not started, a good idea is to restart web-sphere at this point. Even after restart if the engine is not started, then even God cannot help you. Delete the Bus. Stop websphere, go to the profiles_root/databases/ and delete the Something<> directory
  5. Start websphere and follow the process from 2 to 4 again till you get it right.
  6. Go to your Bus and configure your destinations -(see also the note at the end)
  7. It is a good idea to restart websphere if you are unlucky yet again
  8. Now go to the Resource\JMS and choose the particular messaging provider and configure your JNDI names for the destinations and connection factories.
  9. Do a test if are able to lookup the JNDI names properly. if the tests fail restart websphere (yes once again) and retest. This should work. If not start again from Step 2
  10. Hopefully by now, you must have got it.
Now for some more points which you should check for in your code or deployment.
  1. If your have a code like - qConnection.stop- it wont work on websphere 6. You cannot stop connections, though you can still close sessions. Why is this restriction? The plain answer is "I don't know"
  2. Second when you have created a connection and are creating a session, if you get a time out error, restart the messaging engine in the Bus and try again. it should work. It did for me
  1. Destinations and JNDI names and destination names
If any where you have the following type of code-

Destination _dest = jmsMessage.getReplyTo();
if(_dest instanceof Queue){

((Queue)_dest).getQueueName(); will not return the name you entered for the JMS queue in the messaging providers' area; instead you will get the name of the destination registered under your Bus. so if you had given a name as MYQ in the destination under the Bus and MYQueue for the JNDI and name under messaging provider's area,

((Queue)_dest).getQueueName() will return MYQ and not MYQueue
Now why is this so. I too don't know. the J2EE specs also doesn't mention clearly what shoudl be returned by javax.jms.Queue#getQueueName()

2. JNDI registration vis-a-vis Bus Destinations

Take a look at the following configuration

1. Destination under the Bus - MyQ

2. JNDI under the Messaging Provider's area
Name : MyQueue1
Name : MyQueue1
Queue: MyQ

Name : MyQueue2
Name : MyQueue2
Queue: MyQ

If you notice we have the same Bus destination as the Queue for two JNDI destinations.

Queue q1 = (Queue)jndiContext.lookUp("
....some more steps
....Some more steps
(the above two steps finish in a very negligible processing machine time)

and in the mean time somewhere else you are using a message listener on the Queue MyQueue2

Who should recieve the message - the listener or the q1 instance - well really cannot say. My experience is that
q1.recieveNoWait(); gets the message. Now why is this so
Names under Messaging Providers' area are like logical handle to the the same physical location

some thing like this. one = new"Some path"); two = new"Some path");

File objects one and two point to the same location.

So if you are having code like this, it is a good idea to configure different physical destination for each of the JNDI lookups.

Phew. writing this is as traumatic an experience as configuring JMS on Websphere.

Whats the point I am trying to make - as a app server provider, if you cannot make the life of a programmer easier (as a programmer expecting them to make it easier is foolhardy), do not make it more difficult than it is.

It is not good if I only criticize, When it comes to JMS performance, nobody can beat Websphere default messaging and if you couple your app with MQ, then it is the best in the world when it comes to JMS performance.

CIAO, Enjoy Websphere.

PS: I am yet to try Pramati. So judgement stands till I do so.

Tuesday, March 27, 2007

Which one is better: Java or VC++

Now that is one question I get and get from people and all along I am bored answering. I ask one question in return: "have you worked on multi-thread programming?" or "network programming" and then the person slinks away. So the answer to this is "you are comparing watermelon to limes" and when you do that you get no answers or pointers from the comparison. Secondly teachers have really spoiled people by bringing in "pointers" to the question. Well if you can't handle pointers properly and cleanly, then you are half-a-programmer. Programming is all about business implementations? yes and also good programming, effective programming, efficient programming. As the agile world says, the first solution you come up with is not necessarily the best solution. SO back to the discussion. Give me a choice I will jump back to C++ if I am doing systems level jobs. If I am into GUI, server side programming etc - Java is the winner.

Tuesday, July 04, 2006

Some basics of Java which I regularly forget

  1. Real numbers are treated as double unless specifically flagged as float by marking the value with an 'F'
  2. is a pointer to the file rather than a reference to its location and by itself does not encapsulate the physical file.
  3. Integer values are treated as "int" rather than long,
  4. so long micros = 24*60*60*1000*1000 would result in a value different from expectation. so flag the values with an 'L' if you don't want them to be messed with
  5. When using BigDecimal, pass a String representation of the double value rather than the double value to the constructor.
  6. Use fill with GridBagLayout else the component won't occupy the grid area
  7. painting is at two level, System event; when a component is added or removed and VM event; when a component is resized

Why A tech blog

Well I was finding it difficult to write into books with my "genius" handwritings about my explorations in the tech world. Problem was not the writing, problem was the lookup at a later date. I have this tenacious habit of dragging the last 2-3 characters of everyword into a straight line and the result-you can guess. So finally decided to overcome my shyness to blog. So this blog is about WORK; work as in findings and researches in the bread and jam arena. No musings about economics, psychology literature here. Only Technology and technology.
Some Introduction: I started as a C programmer, made an easy migration to C++ and then was lost for a JOB. So took up VB training, then did some work on graphics in Borland C++ and then Java hit the world. Learnt java on my own and with the help of quite a few mentors (Rajasekharam Sir, Jagan Sir, Durga Anna, Praveen, Prashant and a host of others- hope you are reading this). Started working with JDK1.0 and looking back makes you realise that Java programmers of today have it a lot more easier than my peers and me. But if asked to do it again all over, I would certainly do it. My advice to any programmer is this - "Get your basics right". Basics as in 2+2 = 4 and 2*2 = 4 My work during Borland C++ made me do matrices once again (something I thought I left behind when I took up commerce stream for graduation); only to hit me 4 years later. And then I realised that Mathematics is a must - commerce or engineering stream being immaterial. This is the second basic requirement. Not because of the cliche statment of "Maths improves your logic etc". Logic my foot. More because programming is actually 2+2 and nothing more. Well not exactly ;)
Its been a long journey. Java has been my rozi-roti; so cannot ditch it and I ask all those who use eclipse, or netbeans or such IDDEs : "Did you use to write code this in notepad or god-help-you DOS edit before using IDDEs?" If the answer is no; then I would suggest you do that first. IDDEs really spoil the creativity of the beginners. I must say IDDEs are not for beginners.
I beg pardon, I write majority of my code in an advanced text editor - EditPlus.

As days progress, I intend to publish my findings which people can use, share but not plagiarise since what I find might be actually a collation of other findings. And where possible I would credit the individual concerned and where not possible, I would address them as Angel benefactor unknown.

Happy Coding