Cloud Computing is the most important trend in the IT Industry. Even the biggest critics seem to agree that – in spite of some over-zealous marketeers – Cloud Computing is one of the most important paradigm shifts of the past decades. But what is it all about? Where did it come from? And what's to be expected?
SYS-CON Events announced today that AppZero, pioneer in server-side application virtualization, was named "Silver Sponsor" of the 4th International Cloud Computing Conference & Expo, which will be taking place November 2-4, 2009 at the Santa Clara Convention Center, Santa Clara, CA. AppZero software virtualizes Windows and Unix server applications for nearly instant provisioning as services across a network, on any server (physical or virtual), in the datacenter or in the cloud.
Pundits talking about how Windows 7 is all about Microsoft competing against Apple, recovering with Vista consumer adoption disaster, or getting people off of XP, are missing one other – extremely important – part of the Windows 7 story. Windows 7 and its server counterpart – Windows Server 2008 R2 – are actually the first [...]
SYS-CON Events announced today that Ulitzer was named exclusive "new media" sponsor of the 4th International Cloud Computing Conference & Expo, which will take place November 2 - 3 - 4, 2009, at the Santa Clara Convention Center in Santa Clara, CA. 4th International Cloud Computing Conference & Expo is the leading global Cloud event in its third year. Over 200 corporate sponsors and 10,000 industry professionals participated in Cloud Computing Expo during the past two years, more than all other Cloud-related events put together.
I thought it would be a good idea to call some attention to a new flood of good reads. Two in particular deal with some bleeding-edge performance concepts. Performance is a subject that comes to the forefront more and more often, especially when we're all trying to wring as much sweat as we can out of each and every IT dollar put into play. Much of my day is spent trying to find new patterns to make this a reality. Information like this is invaluable when we're trying to find the correct architectural answer to the enterprise IT puzzles we're faced with.
We spend a lot of time talking to business managers about how their operations run. The perspective that we commonly face is one of "this is how we do it; we are looking for software to do it better." But from a business perspective, that is the wrong approach.
Unlike most of my blog posts, where I try to describe the easiest possible way to do things, in this posting, I'll instead go over a Java-based custom JSF component that responds to the Ajax tag. The reason being that there simply aren't any examples out there of how to do this, and at least two people have expressed interest in finding exactly out how this is done. I'd advise anyone considering doing this to make really sure that you can't do the same thing in a Composite Component (you usually can), but sometimes, a Java-based custom JSF component is going to be required.
We're going to cover the following topics here, and it's going to be a little more code than usual, but I suspect that this will end up saving some folks a bunch of time, so lets plow forward. I'll cover:
An ajax listener, connected to your ajax event with the listener attribute, is a method that will be called every time the ajax request is made. For example, let's look at the following page section:
1 Echo test: <h:outputText id="out" value="#{custom.hello}"/>
2 <br/>
3 Echo count: <h:outputText id="count" value="#{custom.count}"/>
4 <br/>
5 <h:inputText id="in" value="#{custom.hello}" autocomplete="off">
6 <f:ajax event="keyup" render="out count eventcount" listener="#{custom.update}"/>
7 </h:inputText>
8 <br/>
9 Event count: <h:outputText id="eventcount" value="#{custom.eventCount}"/>
We've got three bean properties - hello (which is the string entered by the inputText), count (which is a count of the characters in hello, and eventCount (which is a count of the number of ajax requests). We also have a method on the bean, update (line 6), which will be called every time the ajax call is submitted.
The behavior of this page is pretty simple - every time you press a character in the inputText, the complete value of the input is echoed to the outputText "out" (line 1) - the length of "out" is written to "count" (line 3), and the "eventCount" outputText (line 9) has it's value incremented by one.
So - what code is in the bean? Here's the relevant bits:
1 public void setHello(String hello) {
2 this.hello = hello;
3 }
4 public int getCount() {
5 return count;
6 }
7 public int getEventCount() {
8 return eventCount;
9 }
10 public void update(AjaxBehaviorEvent event) {
11 count = hello.length();
12 eventCount++;
13 }
Not so bad - the only thing new here is that AjaxBehaviorEvent class - and we're not even using it. The update method will simply set up the values to be correct, and we let the Ajax render to the rest. So - listeners are easy.
Now, we'll want to create a custom tag in Java. To do that, we'll need to make a few configuration file entries, and write a little java code. But first, let's see it used in the page:
In the XHTML header, we'll say:
1 <html xmlns="http://www.w3.org/1999/xhtml" 2 xmlns:ui="http://java.sun.com/jsf/facelets" 3 xmlns:h="http://java.sun.com/jsf/html" 4 xmlns:f="http://java.sun.com/jsf/core" 5 xmlns:cu="http://javaserverfaces.dev.java.net/demo/custom-taglib">
Setting up the "cu" prefix (line 5) to point to "custom-taglib" (the whole URL is significant). Then later on in the page, we'll use it like so:
<cu:custom id="customId">
We then need to add an entry in web.xml:
1 <context-param> 2 <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 3 <param-value>/WEB-INF/custom-taglib.xml</param-value> 4 </context-param>
This points to our next config file, which is the filename on line 3. Here's its contents, in full:
1 <facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" 4 version="2.0"> 5 <namespace>http://javaserverfaces.dev.java.net/demo/custom-taglib</namespace> 6 <tag> 7 <tag-name>custom</tag-name> 8 <component> 9 <component-type>mycustom</component-type> 10 </component> 11 </tag> 12 </facelet-taglib>
Note that the namespace element on line 5 matches the URL we used for the namespace in the html element of the using page. We said this taglibrary will have one tag "custom" (line 7), which maps to the FacesComponent "mycustom". Where does it find the definition of "mycustom"? In the Java file defining the component, using the new @FacesComponent attribute. Here's the full Java code, leaving out the imports:
1 @FacesComponent(value = "mycustom")
2 public class MyCustom extends UIComponentBase {
3
4 @Override
5 public String getFamily() {
6 return "custom";
7 }
8
9 @Override
10 public void encodeEnd(FacesContext context) throws IOException {
11
12 ResponseWriter responseWriter = context.getResponseWriter();
13 responseWriter.startElement("div", null);
14 responseWriter.writeAttribute("id",getClientId(context),"id");
15 responseWriter.writeAttribute("name", getClientId(context),"clientId");
16 responseWriter.write("Howdy!");
17 responseWriter.endElement("div");
18 }
19 }
In fact, the Java code itself is simple enough that I don't really think it requires any explanation. Putting the cu:custom tag in your page will now render Howdy!, surrounded by a div with the same id and name as you gave the component. All that's left is to add the Ajax. That... is a bit more complicated, but now that we've handled everything else, it's really just incremental.
To use the f:ajax tag, we'd like to, for instance, do something like this:
1 <cu:custom id="customId">
2 <f:ajax render="eventcount" listener="#{custom.updateEventCount}"/>
3 </cu:custom>
Meaning, we'd like to just decorate the tag, and let it do something "smart". In this case, we'll default to "onclick" (since we're dealing with a div, after all, we could also default to "onmouseover", for instance). It'd also be nice if we could still call the ajax listener. That'll require a bit more code. Here's the full Java component, with the additional ajax code. I'll go over it at the end:
1 @FacesComponent(value = "mycustom")
2 public class MyCustom extends UIComponentBase implements ClientBehaviorHolder {
3
4 @Override
5 public String getFamily() {
6 return "custom";
7 }
8
9 @Override
10 public void encodeEnd(FacesContext context) throws IOException {
11
12 ClientBehaviorContext behaviorContext =
13 ClientBehaviorContext.createClientBehaviorContext(context,
14 this, "click", getClientId(context), null);
15
16 ResponseWriter responseWriter = context.getResponseWriter();
17 responseWriter.startElement("div", null);
18 responseWriter.writeAttribute("id",getClientId(context),"id");
19 responseWriter.writeAttribute("name", getClientId(context),"clientId");
20 Map<String,List<ClientBehavior>> behaviors = getClientBehaviors();
21 if (behaviors.containsKey("click") ) {
22 String click = behaviors.get("click").get(0).getScript(behaviorContext);
23 responseWriter.writeAttribute("onclick", click, null);
24 }
25 responseWriter.write("Click me!");
26 responseWriter.endElement("div");
27 }
28
29
30 @Override
31 public void decode(FacesContext context) {
32 Map<String, List<ClientBehavior>> behaviors = getClientBehaviors();
33 if (behaviors.isEmpty()) {
34 return;
35 }
36
37 ExternalContext external = context.getExternalContext();
38 Map<String, String> params = external.getRequestParameterMap();
39 String behaviorEvent = params.get("javax.faces.behavior.event");
40
41 if (behaviorEvent != null) {
42 List<ClientBehavior> behaviorsForEvent = behaviors.get(behaviorEvent);
43
44 if (behaviors.size() > 0) {
45 String behaviorSource = params.get("javax.faces.source");
46 String clientId = getClientId(context);
47 if (behaviorSource != null && behaviorSource.equals(clientId)) {
48 for (ClientBehavior behavior: behaviorsForEvent) {
49 behavior.decode(context, this);
50 }
51 }
52 }
53 }
54 }
55
56 @Override
57 public Collection<String> getEventNames() {
58 return Arrays.asList("click");
59 }
60
61 @Override
62 public String getDefaultEventName() {
63 return "click";
64 }
65 }
At 65 lines, this is probably the longest code example I've ever posted, but most of this is either really easy, or stuff you've seen in the previous section. First, we define what Ajax events we'll accept ("click") and what one is the default ("click" again), on lines 56-64. These are part of the ClientBehaviorHolder interface (line 2). We also had to add a little code to the encodeEnd method, so that we correctly output the DOM event script as part of the div (lines 12-14, 20-24). And lastly, we needed to add a decode method, since our component is no longer output only - the ajax event handling code is always part of the decode process (lines 31-50). This is the part where we actually make sure that that listener is being called.
Did I mention that you can do pretty much the same thing in a composite component? That'll be the subject of a future blog.
Well, I warned you this was a little more complex - hopefully it's all fairly clear. If it isn't - ask in the comments.
It’s been a while since I posted any news JavaFX plug-in for Eclipse, but we’ve been working hard on the following new features: Code assist for syntax keywords, Code assist for system classes, Code assist for attributes of system classes, Code assist for user classes, Code assist for attributes of user classes. Syntax highlight A new version will be released in the [...]
On2 Technologies announced that it has released its new flagship hardware video decoder design, the Hantro(TM) 9190. The 9190 is the tenth generation of the Hantro line of decoders, which are deployed in hundreds of millions of chips worldwide. The 9190 design supports video playback up to full HD (1080p) resolution at 60 frames per second (fps) in multiple formats including On2 VP6 for Adobe Flash Player and Sun JavaFX, DivX 3, 4, 5, 6, H.264, H.263, Sorenson Spark, MPEG-1, MPEG-2, MPEG-4, VC-1/WMV9 and RealVideo 8, 9 & 10, as well as up to 66 megapixel JPEG still images.
The ability to manage SAP environments not system by system but as the tightly integrated landscapes in which they are actually offers massive productivity improvements for IT departments. New landscapes can be provisioned in minutes and can include all types of SAP Business Suite, SAP BusinessObjects Portfolio (ABAP, Java or combined) or legacy applications. Virtual Appliance templates offer ready-to-use systems with zero post-installation effort, and as desired can be pre-seeded with production business data. Monitoring and administration is simplified to manage the SAP applications throughout the system lifecycle.
March Networks announced that the Australian Customs and Border Protection Service has selected the Company's VideoSphere solution to enhance its security operations in multiple airports across the country. The integrated systems include March Networks' Video Management System (VMS) software and Edge encoders, as well as host and storage servers from Sun Microsystems.
Together with Digital Media Research Institute, Inc., SCM Microsystems Japan and DNP are launching a new solution that keeps important digital data safe using cloud computing technologies. The solution is a high-security data storage system developed by DNP, which consists of DNP's TranC'ert DNA software, a SIM card and SCM Microsystems' @MAXX lite secure smart card reader. Digital Media Research Institute, Inc. is providing sales and consulting services for the implementation of the new system. DNP's TranC'ert DNA software splits up and encrypts sensitive or confidential data, and stores it on three servers, which secures and protects the information from loss, damage or theft.
Reuters published an article titled "IBM takes on Google in business Web-mail market" - bold words but hey, this is Big Blue, right? We haven't seen much from IBM in the SaaS space yet, so this move was about time. What is surprising is the positioning of this offering, low function, low price ($36/user/year) but business Web-Mail. This simple Web-Mail offering is not based on Notes but on Outblaze, a more consumer oriented Web-Mail client from a company from Hong Kong that IBM bought cheaply earlier this year.
Adaptivity Chairman and CEO Tony Bishop launched today his Cloud Computing Blog on Ulitzer, Tony is the Founder and CEO of Adaptivity. As Chairman and CEO, Tony leads the team and provides hands-on coaching, thought leadership and executive strategy support for our key clients and partners. He is an innovative IT executive, with an excellent track record in strategy, design, and the implementation of business-aligned enterprise technology platforms across large organizations. He most recently served as SVP and Chief Architect of Wachovia’s Corporate Investment Banking Technology Group, where his team designed, built, and implemented a leading-edge service-oriented architecture and utility computing infrastructure.
Google Wave, the amorphous open source widgetry that Google has trouble explaining but contends – silly Google – will replace e-mail, the most viral application ever, started moving into a wider test group of some 100,000 users Wednesday ahead of a still wider release in December. It’s akin to a limited launch. Wave reportedly got a million requests for early access.
The RESTful architectural style [1], with its URL addressable, resource oriented approach allows you to define Web services which can have multiple runtime representation in a variety of different media types. You define a Web resource, encapsulating the desired functionality within a business method, accessible via a URI over the HTTP protocol and its different “verbs”: GET, POST, PUT, DELETE [2]. The transferred content may be either HTML, XML, binary data or images, which, depending on the business use case often require to be embedded within the same message.
We are standing on the threshold of a new transition in information technology and communications; a radical departure from current practice that promises to bring us new levels of efficiency at a vastly reduced cost. Cloud computing is full of potential, bursting with opportunity and within our grasp. But, remember, that clouds always appear to be within our grasp and bursting clouds promise only one thing: rain!
The Connecting to the Cloud series of articles, which I wrote for IBM DeveloperWorks, is now available in Japanese. The series introduces cloud platforms such as Force.com and Amazon SQS, including code samples in Java, and governance and policy, again including code samples (an Amazon policy expressed in JSON). The Gateway "onramp" model is described
Remember that ad Oracle ran a few weeks ago on the front page of the Wall Street Journal and later on the back cover of the Economist and repeated on its web site claiming "Sun + Oracle is Faster" than IBM? Oracle's claim for an undefined Oracle-Sun box was supposedly based on TPC-C results that it promised would be disclosed at Oracle OpenWorld October 14.
In this age of collaborative technologies and social media, is there still a place for in-person meetings and real phone calls? Yes! The idea of "going primitive" can actually give you a strategic advantage in your communications.
To meet the messaging and collaboration needs of the world's largest telcos, service providers and most demanding enterprise customers, Sun Microsystems has announced availability of Sun Java(TM) Communications Suite 7. With more than 170 million seats of earlier versions deployed, this new release builds upon proven strengths in scalability, reliability and performance while providing better interoperability and enabling differentiated services with a low total cost of ownership. To learn more, visit http://sun.com/comms.
Today, this global leader in Java learning and powered by over 50,000 developers in its global community, announced the worldwide availability of SkillScan, its cutting-edge, automated tool to assess the Java skills of job candidates. SkillScan is used by recruiters and hiring managers to screen Java candidates and staff teams with the right combination of skills. In less than two hours, SkillScan provides a comprehensive and conclusive report of candidate skills in Java programming, sub-topics in Java, and related technologies.
You might be thinking, pfft, I'm never going to need to use Binary Serialization...that's old school. And you might be right, but think about this: Azure Storage charges you by how much you're storing and some aspects of Azure also charge you based on the bandwidth consumed. Do you want to store/transmit a big-ass bloated pile of XML or do you want to store/transmit a condensed binary serialization of your object graph?
Aonix, the provider of the PERC product line for embedded and real-time Java developers, announced Java™ virtual machine support for the low-cost BeagleBoard with its flagship product PERC Ultra. More developers and projects will be able to quickly and more cost efficiently launch development that takes advantage of PERC’s new graphics support via the ARM®-based BeagleBoard.
Aonix, the provider of the PERC product line for embedded and real-time Java developers, announced a new release of its PERC Ultra product with support for AWT/Swing graphics libraries. This release is the first support of AWT/Swing graphics libraries in PERC Ultra for embedded and real-time systems.