Vaadin vs SmartGWT

Hi,

I was looking at the comparison chart in this website between Vaadin and SmartGWT. The rating is almost equal between them. However I felt that the rating should be better for SmartGWT, because the core components in SmartGWT are more more higher than Vaadin. I mean, there are lots of advanced components in SmartGWT than Vaadin, you can find number of examples @ http://www.smartclient.com/smartgwt/showcase/#main… Our team is actually evaluating Vaadin and GWT, I believe SmartGWT is better than anything else. Can some have different opinion on this? if so, pls correct me.

Thanks,
Trivedi

The rating is rather coarse leveled:

  • One star - Almost no widgets built in - just the basic HTML form controls and some simple extras. Framework assume that one creates all the widgets himself per application
  • Two stars - Good foundation, but in many cases needs extending in order to build top notch UI:s.
  • Three stars - One of the best set of widgetsets out there.

I agree that smartgwt widgetset is great. One of the best on a client-side framework.

Vaadin Team regularly looks into competition and identifies where we should improve the widgetset. When one finds any use-cases where one of the competitors is ahead we try to put that use-case into our “todo-list”. If you end up selecting Vaadin, please do no hesitate to add any of those use-cases to dev.vaadin.com as a ticket.

On thing that I disagree is that you should only look at core widgets. If we would include all the features to core, the core would grow huge. Even though having all widgets in core sometimes is convenient, in many cases it complicates and slows things down. In practice - huge core contributes to large download size for the widgetset (javascript libraries).

Instead there is a active add-on ecosystem around Vaadin - you can find components for many many purposes there. Use (and building of) add-ons is made really simple in Vaadin - I hope that this focus on extensibility and add-on ecosystem turns out to be on of the most important factors in your decision.

You are asking that on a Vaadin Forum, so take the answers with a grain of salt :)

IMO the frameworks are quite different. For me - some of the most important differentiating factors are:

  • Vaadin is a server-side framework, while as GWT (and SmartGWT) are client-side frameworks. Thus the programming model is much simpler in Vaadin (your code can call any server-side API:s directly). One the other hand client-side frameworks move more work to client to ease server-load.
  • Licensing model is somewhat different. There is just one Vaadin Framework and it is free and Apache -licensed. There are
    several editions of SmartGWT
    with different licenses and pricing. On the other hand - there are also handful of optional dual-licensed add-ons to Vaadin.
  • SmartGWT is a wrapper around native SmartClient. This makes
    the size of javascript library fairly large
    . If you decide on using a client-side framework, you might want to check out
    Ext GWT
    that is (more) native GWT.

If there are any particular features you find missing from Vaadin, it would be great to hear of them. Maybe there is already a solution out there or if not, we can add them to our todo-list.

Thank you for the quick response on this, I really liked the framework and have been trying out some prototype activities with this. It is really coming up well, however we found some interesting & required components in smartGWT, which were not there in Vaadin. For ex:
http://www.smartclient.com/smartgwt/showcase/#grid_nested_form
http://www.smartclient.com/smartgwt/showcase/#grid_custom_filter_builder
http://www.smartclient.com/smartgwt/showcase/#effects_lf_corners

Ofcourse, I could see many of such nice components in smartGWT. I didn’t find any such components in Vaadin, Infact I would like to see them in Vaadin as well, since it really fits to our needs.

Some other questions:

When you say that Vaadin is a server-side framework, how does it compare to a client-side framework in Performance metrics? We are concerned about performance of the application in terms of server load & quick response times. Is there any performance comparison between different frameworks with Vaadin?

I must agree with you the concerns that raised on core library footprint, which is very large in case of smartGWT compared to Vaadin… and I like the concept of add-on thing in Vaadin.

I really appreciate your detailed explanation and would like to hear more from you.

Thanks,
Trivedi

You can nest any UI components in Vaadin Table cells, but there is no way of adding content to span the whole row as in nested form example. There is in fact already a
Ticket
about that. I hope I will get implemented in near future.

My recommendation for implementing this use-case is to use
PopupView

In Vaadin, there is a flexible
filtering mechanism
for implementing custom filters.

Those corner effects are quite unique. In Vaadin window borders are defined in theme. You can override their looks by extending one of the included themes. It should be possible to implement any of these borders in the theme. To see some of the included window borders, see
this example (select window tab)
.

I have not seen such comparative benchmark. To see some discussion about performance in Vaadin scope, see
this presentation
.

As per our usability requirements, we should show the detail information without hiding the background information(row below) of a table. Is it possible to inject a component by breaking the table into two parts and keep the new component in between? May be a stupid idea… need your help here

May be too much to ask for… could you pls tell me in which version this component is planned to be included?

The rest were fitting our requirements, thanks for your help.

Thanks,
Trivedi

I see. Fully agreed.

In that case one workaround could be to open the form under the table (and thus resize the table for the time of editing). I agree that this is not as good, but would probably be sufficient for the use-case.

Sounds complex. I would not try it.

The ticket has not been scheduled yet.

I really appreciate you for quick responses. Let me ask you another question, in ExtGWT, there is grid component that suites to our needs (http://www.sencha.com/examples/pages/grid/plugins.html). Can I integrate this into Vaadin? I see a section in Vaadin book on integrating GWT components, is that the same process to get ExtGWT widgets into Vaadin?

thanks,
Trivedi

I have not tried to integrate Ext GWT components myself, it should be doable. Just follow the instructions on the book. If you decide to integrate that, please publish the integration so that others can use it also.

Also note that Ext GWT is licensed with GPL-license. You either have to buy a license from Sencha or publish your application source code with GPL-compatible license.

Hi Joonas,

We we able to extend the Vaadin Table component to get expandable behavior, that’s coming up really good. However, we are having one issue with polling updates from server using ProgressIndicator or Refresher add-on. Need your suggestion here.

We are deploying Vaadin applications as portlets inside Liferay. Actually we have two portlets A & B (for ex) residing inside same WAR application. Portlet A sets some data inside portletsession attribute and PortletB access it and updates the contents of Table. So to get that updated info on to the client side we started using ProgressIndicator (invisible). Things are working fine, however the Progress indicator is keep pulling information eventhough there is no change in the table data. How can I make this component is to poll only if there is change in table or some component in server side.

I was looking at Vaadin ICEPush component also, but it works only with ServletApplication not with PortletApplicaitons. I found this during my experiments. Also looked at Refresher and found that it is exactly similar to ProgressIndicator without visual component.

Please guide me here. I found interesting component in Icefaces (Ajax push), can I use it here? Let me know what are the best approaches here to solve this problem. We can’t live with ProgressIndicator for sure. The server push mechanism is going to one of the highest criteria for us (as you might be knowing, using event (JSR 286 portlet events) inside Liferay would refreshes the page, which we don’t want at all)

Thanks for your quick responses and I really appreciate for your time.

Trivedi

How could the client side know that there are no changes in the server-side without asking? Good side is that if there are no changes, no changes are sent and thus poll is really lightweight. So it might be that you really need to use ICEPush…

ICEFaces Ajax push is in fact the same implementation as used by ICEPush add-on you already tried.

Why the ICEPush did not work with portlets? It might be a resolvable problem…

Both polling (ProgressIndicator, Refresher) and push (ICEPush) in will only refresh the changed parts of the page - not the whole page. I would use polling if the number of concurrent users in the view is relatively small (exact threshold depends on acceptable polling frequency - it should be quite ok to have 1000 users in the view with 5 sec frequency).

Is there a way that I can have some method inside ProgressIndicator (thru extending it) and invoke that from the server if there are any changes to it? Which will make the component to pull information from the server instead of polling for specified intervals?

Please take a look at the below code that Artur put in:
http://dev.vaadin.com/svn/incubator/ICEPushAddon/src/org/vaadin/artur/icepush/ICEPush.java

It has the below code in which the exception block is getting executed in the case of Porlet deployment:

// Push changes
ApplicationContext context = app.getContext();
if (context instanceof WebApplicationContext) {
PushContext pushContext = PushContext
.getInstance(((WebApplicationContext) context)
.getHttpSession().getServletContext());
pushContext.push(ICEPush.PUSH_GROUP);
} else {
throw new RuntimeException(“Only servlet deployment is supported”);
}

Infact, I tried changing this ICEPush.hava code to have another push(ServletContext context) method that takes servletContext as parameter. I am actually passing the servletContext object from the portlet application to this push() method, but I was getting “NULL” object in pushContext reference. Not sure, what could be the wrong.

Thanks,
Trivedi

Nope. The only way of passing this info to client is either by polling or by push. Only push solution currently is ICE Push.

Still - for the most cases polling is effective enough. How many concurrent users you are expecting for the view?

Have not looked at ICE Push implementation. Artur - is there a simple way to get ICE Push to work within a portal?

In our application, we might have atleast 10 portlet applications using Progress Indicator. And regarding the users, it might go to 1000 concurrent users (really I am not joking). So my concern is that, would it be fine if I have 1000 concurrent users running 10 (or 15) portlets with ProgressIndicator component?

Thanks,
Trivedi

Only the portlets on currently open pages are polling. So if there are 1000 pages open concurrently (one refresher / page), with 5 sec polling interval you would be getting 200 polling requests per second. As polling requests are really lightweight, 200 ajax-requests / second should not be a problem even for single low-end server. That said - you should definitely validate this with a benchmark before going to production.

With one scalability test we did, we measured a single EC2 (large) instance to handle 1129 requests per second for 3000 concurrent Apache JMeter threads and only used about 60-70% CPU. It should be noted that these requests did a lot more than just polling “are there any changes”.

What is the best value for “interval” on Progress Indicator to poll? For us, 5 secs may not be suitable (or right) value. This will make the user to see updates in every 5 secs. For instance, assume that the server took 0.5 secs to process some heavy work, however the updates would be visible to user after 5 secs (may be 4.5 secs). In my test application, I kept this value as 0.5 secs, so with that frequency… having Progress Indicator for 5 Portlets on single Portal page with 1000 users using system concurrently, would that be reliable and manageable?

I would be most happiest guy if Artur Signell provides solution to make ICEPush works for Portlets application as well. Atleast if he can guide us on how to do this, we will implement and contribute it back to this community.

Thanks,
Trivedi

It has been awhile since I had the time to look at ICEPush but I think the problem is that the push servlet needs to be deployed in a different way in a portlet environment. There must be an URL that the client/browser can call and in a portlet environment you cannot simply generate urls to use, like ICEPush uses “*.icepush” for its push requests. It might be possible to get it to work by deploying the ICE Push servlet separately, provided you can get the client part to use the correct URL.

Hi Artur,

What I understand from your description above is that it is possible to make ICEPush to work for Portlet applications as well, but what I didn’t understand was that “how” to make it working?

Thanks,
Trivedi

Hi Artur,

Could you please tell me whether we can make this ICEPush add-on working for Vaddin portlets? Please help me.

thanks,
Trivedi

Hi trivedi,

did you make some progress on ICEPush on Portlet issue ?

I’m also very interested in getting this working soon so we could try team up to patch ICEPush to make it working
in Liferay (maybe, even better, with the help of artur ).

Let me know if you are still interested.

Cheers,
Luke

Hi Luke,

Its nice to have ICEPush working in portlet applications. I like your idea to get together and make this ICEPush working on portlets. Surely we can do this.

I was actually looking for ICEPush to achieve IPC between portlets without page refresh, the same have been achieved using below steps:

  1. javascript events (client side events) to notify the receiver portlet (check liferay client side IPC)
  2. jQuery ajax call to invoke receiver portlet render method in which I am making changes to the UI
  3. using vaadin.forceSync() to read updates from the server and refersh the display.

Thanks,
Trivedi