<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Software Gorilla</title>
	<atom:link href="http://www.thesoftwaregorilla.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thesoftwaregorilla.com</link>
	<description>The Software Gorilla</description>
	<lastBuildDate>Mon, 08 Mar 2010 16:05:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Busy times bring new ideas</title>
		<link>http://www.thesoftwaregorilla.com/2010/03/busy-times-bring-new-ideas/</link>
		<comments>http://www.thesoftwaregorilla.com/2010/03/busy-times-bring-new-ideas/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:00:34 +0000</pubDate>
		<dc:creator>Bruce Gruenbaum</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[OpenClient]]></category>
		<category><![CDATA[OpenEdge]]></category>
		<category><![CDATA[4GL]]></category>
		<category><![CDATA[ABL]]></category>
		<category><![CDATA[Dynamic OpenClient]]></category>
		<category><![CDATA[Enterprise Architecture]]></category>
		<category><![CDATA[Java OpenClient]]></category>

		<guid isPermaLink="false">http://www.thesoftwaregorilla.com/?p=283</guid>
		<description><![CDATA[Things have been busy for the last couple of months, but here is a preview of what I have been working on.]]></description>
			<content:encoded><![CDATA[<p>If there is one thing I hate, it&#39;s when things get really busy and I don&#39;t have time to do all the stuff that I want to get to, like updating my blog. That has been the case since my last post back in January. When I wrote that post, I knew I was going into a very busy time, but I did not realize quite how bad it was going to be. The good thing about busy times is that&nbsp;I learn about a&nbsp;lot of new things that give me ideas for my blog, and this has been no exception. The general rule of thumb is that if I am quiet, I&#39;m working on cool stuff.</p>
<p>Part of what I have been doing&nbsp;was&nbsp;getting all my financials ready for my accountant to do his annual review and my taxes. This is my first year running a business in the US and I do a lot of my own accounting. So I spent a lot of time working with Quickbooks, Quicken, and TurboTax. At least that work is out the way, but I learned some interesting stuff that I want to experiment with over the next few months, so look for a couple of posts in the upcoming months on integration with Quickbooks from various directions, including OpenEdge, Progress FUSE, .NET, and Java (specifically Eclipse RCP).</p>
<p>Another thing I have been working on is integration between Microsoft Exchange Server and OpenEdge using Progress FUSE. I have been working on this in conjunction with a business partner and&nbsp;we are&nbsp;going to be providing some interesting experiences and samples of&nbsp;making that integration happen.</p>
<p>I have also been working on a .NET version of the Dynamic OpenClient example that I posted a few months back. I hope to have it ready for release by the end of April.</p>
<p>My company, Intangere, is in the process of developing some very exciting code for those of you that are Progress customers looking for alternative integration strategies with Progress, and we have an announcement that will be coming early in the second quarter.</p>
<p>So look for some very interesting technical posts over the next few months&#8230;</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thesoftwaregorilla.com%2F2010%2F03%2Fbusy-times-bring-new-ideas%2F&amp;linkname=Busy%20times%20bring%20new%20ideas"><img src="http://www.thesoftwaregorilla.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thesoftwaregorilla.com/2010/03/busy-times-bring-new-ideas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows 7 and Google Chrome Browser update</title>
		<link>http://www.thesoftwaregorilla.com/2010/01/windows-7-and-google-chrome-browser-update/</link>
		<comments>http://www.thesoftwaregorilla.com/2010/01/windows-7-and-google-chrome-browser-update/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 19:17:44 +0000</pubDate>
		<dc:creator>Bruce Gruenbaum</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Google Chrome Browser]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows 7 32-bit]]></category>
		<category><![CDATA[Windows 7 64-bit]]></category>
		<category><![CDATA[Windows 7 Upgrade]]></category>

		<guid isPermaLink="false">http://www.thesoftwaregorilla.com/?p=266</guid>
		<description><![CDATA[It's been a couple of months since I first installed Windows 7 and Google Chrome and although I had planned to provide an earlier update, things got pretty busy through December and I am only now coming up for air. So here, at last, is the long-promised update.]]></description>
			<content:encoded><![CDATA[<p>It&#39;s been a couple of months since I first installed Windows 7 and Google Chrome and although I had planned to provide an earlier update, things got pretty busy through December and I am only now coming up for air. So here, at last, is the long-promised update.</p>
<h4>Windows 7</h4>
<p>Windows 7 has now been running on 4 machines here at home since I installed it back in November. Three of the 4 are 32-bit machines. The other is a 64-bit machine.</p>
<p>Two of the 32-bit machines are used by my two teenage kids. My son is studying drafting at college and he uses his machine extensively to run various CAD packages, including AutoCAD. He reports that his machine is much more stable now than it was with Vista, which was what his machine shipped with in March last year.</p>
<p>My daughter is at college, too, but her use of her machine will never really show up any major problems. She uses all the standard stuff like MS Office 2007 and Internet Explorer 8. She used to complain a lot about her machine going to a black screen prior to the Windows 7 upgrade, but I have heard nothing new since.</p>
<p>My wife uses her machine for college studies and accounting-related stuff. We run both Quicken and Quickbooks and it all works fine. We have not seen anything on her machine that causes a problem with one exception.</p>
<h5>Slideshow Screen Saver Hangs</h5>
<p>We have a couple of LaCie 2-Big network drives that contain shared data and backups. Among the shared data on one of the drives is our library of photographs. My wife uses the built-in screensaver that creates a slideshow of photographs onto the display. We have found that this screensaver will work for a period of time, but when she comes back to the machine to start working again, the machine freezes on the screensaver. We have switched to different screensavers and we don&#39;t have the problem with others so we are putting it down to that.</p>
<p>I have seen a similar problem on my 64-bit machine with the screensaver, but the difference is that the interface only becomes unresponsive for a period of about 20 seconds. After that it comes back whereas with the 32-bit machine, it hangs permanently.</p>
<h5>Other Applications</h5>
<p>On my 64-bit notebook I am running a lot of stuff, including Eclipse v3.3, 3.4 and 3.5, Java 1.5 and 1.6, Java EE, Glassfish, MySQL, Visual Studio 2008, DIRECTV Supercast which allows me to watch NFL games on my notebook, and Netflix&#39;s video player. Other than the issue with the screensaver, I have had no problem with this machine. It has been substantially more stable than when it was running Vista and I&#39;d go as far as to say that it is more stable than my work notebook which runs Windows XP SP3.</p>
<h5>Homegroups</h5>
<p>A couple of people asked me about Homegroups and how effective they were. I set up a homegroup expecting that it would simplify things, but all it really does is ease file sharing. There is not a lot of value to it that I do not get from having a central share on the LaCie 2-big drive, so I have switched off the homegroup functionality.</p>
<h4>Google Chrome Browser</h4>
<p>I installed Google&#39;s Chrome Browser on my machine a while ago, but had not really used it. I had been using Internet Explorer 8 and did not really spend much time evaluating it.</p>
<p>A while ago, I was looking for a browser I could use at work. Corporate restrictions had me using Internet Explorer 6 which is not satisfactory. I had previously used Opera, but it fell short on a number of things that I needed it to do. I decided to re-evaluate Firefox and Chrome.</p>
<p>I ended up going with Google Chrome. Chrome is much faster than any of the others. It loads instantly and the first page comes up immediately. Screen-painting is instantaneous. When I compared this with any of the others, whether Firefox, Internet Explorer or Opera, there is just no comparison. Internet Explorer 8, for example, takes 3 or 4 seconds to start and another second or two to download my home page which is on my local network. &nbsp;Firefox is even slower. Chrome is literally instant. The load time is imperceptible.</p>
<p>There are some things, though, that don&#39;t work with Chrome. Hosting a web meeting using AT&amp;T&#39;s web meeting software does not work, but Webex does. Most plugins work as expected, but occasionally I run into pages that don&#39;t and I am forced to switch to Internet Explorer to work around those.</p>
<p>Another big thing with Chrome is that even though I use it on all my workstations, I have never had it crash or hang. I cannot say the same for either Internet Explorer or Firefox.</p>
<p>More than 90% of my browsing is now done using Chrome and it just works. What&#39;s interesting is that Chrome is new software and it is more stable than Internet Explorer or Firefox. If this is any indication of what is still to come, I think Google is onto something.</p>
<h4>Conclusion</h4>
<p>I am very satisfied with the improvements in Windows 7. I would be very happy if I could replace XP on my workstation at work with Windows 7. There are some nice features that I have gotten used to. I prefer the Windows 7 task bar. I also like being able to drag windows to the side of the screen and have Windows figure out that I want the windows tiled next to each other. Mostly, though, I am happier about the stability and I have nothing that I have tried to run that does not work on Windows 7, so I am pretty satisfied with it. I feel like it is generally faster than Vista was, but I could not substantiate that with empirical data, so it is really a feeling more than something I can substantiate.</p>
<p>I am extremely satisfied with Chrome and I am now running it on my Linux boxes as well. It&#39;s fast, and it works. It has become my browser of choice.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thesoftwaregorilla.com%2F2010%2F01%2Fwindows-7-and-google-chrome-browser-update%2F&amp;linkname=Windows%207%20and%20Google%20Chrome%20Browser%20update"><img src="http://www.thesoftwaregorilla.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thesoftwaregorilla.com/2010/01/windows-7-and-google-chrome-browser-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome OS vs Microsoft Windows</title>
		<link>http://www.thesoftwaregorilla.com/2009/11/google-chrome-os-vs-microsoft-windows/</link>
		<comments>http://www.thesoftwaregorilla.com/2009/11/google-chrome-os-vs-microsoft-windows/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 23:29:54 +0000</pubDate>
		<dc:creator>Bruce Gruenbaum</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Chrome Browser]]></category>
		<category><![CDATA[Google Chrome OS]]></category>
		<category><![CDATA[Internet Explorer 9]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Software as a Service]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://www.thesoftwaregorilla.com/?p=261</guid>
		<description><![CDATA[I was looking through all my favorite web sites for news on Friday evening when I ran into two news reports that I thought were very interesting. Microsoft showed up at their Professional Developers Conference in LA with a half-baked presentation about Internet Explorer 9 that just happened to make press the day before Google announced the release of Google Chrome OS as open source code. Is this a coincidence or an emergency reaction to the realization that Chrome OS could be a very serious threat?]]></description>
			<content:encoded><![CDATA[<p>I was looking through all my favorite web sites for news on Friday evening when I ran into two news reports that I thought were very interesting.&nbsp;Microsoft showed up at their Professional Developers Conference in LA with a half-baked presentation about Internet Explorer 9 that just happened to make press the day before Google announced the release of Google Chrome OS as open source code. Is this a coincidence or an emergency reaction to the realization that Chrome OS could be a very serious threat?</p>
<p><span class="Apple-style-span" style="font-weight: bold; ">Internet Explorer 9</span></p>
<p>On Wednesday, <a href="http://news.cnet.com/8301-30685_3-10400638-264.html?tag=pop" target="_blank">Microsoft announced a significant re-investment in Internet Explorer</a>. After just three weeks of development, they are talking about Internet Explorer 9 and its new features. When I read the announcement, I didn&#39;t think it said much so I was wondering why it was that Microsoft was in such a hurry to get what I thought was a very half-baked announcement out there.</p>
<p>The crux of the news is that Internet Explorer 9 is going to contain some significant enhancements to the way that it uses hardware and this should make it perform much better. It is also going to be far more standards-compliant, and we&#39;re not just talking Microsoft standards, if Steven Sinofsky is to be believed.</p>
<p>My take was that if I could just get it to stop crashing, that would be a good start.&nbsp;All the problems I have had with Internet Explorer have resulted in me installing virtually every browser out there, including Safari, FireFox, Opera, and, more recently, Google Chrome.&nbsp;Actually, IE8 is much better now on Windows 7, but I have been fishing for something else for a while.</p>
<h4>Google Chrome Browser&nbsp;</h4>
<p>Yes, for those of you that are not aware of it, Google has its own browser, too, called Google Chrome, and it is available for all Windows platforms. There have been 30 million downloads of the software and I have been using it now for quite a while. It works well on Windows 7, too.</p>
<p>Actually, Chrome is my favorite browser, largely because it works with everything and it is much faster than any of the others. The pages on my DSL line at home are there instantly. I have not found anything that Chrome does not do&#8230; very well.</p>
<h4>Google Chrome OS</h4>
<p>The reason Chrome is so interesting is because of <a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html" target="_blank">Google&#39;s announcement in July that it was entering the Operating System market</a>. Google firmly believes that the future of computing is in the cloud. Their operating system, to be named Chrome OS, is intended to run on netbooks and the Chrome Browser is intended to be the interface that is used to do everything. Applications will be hosted in the Chrome Browser as web apps, and the operating system will be free and open source.</p>
<p>On Thursday, <a href="http://googleblog.blogspot.com/2009/11/releasing-chromium-os-open-source.html" target="_blank">Google released the code for Chrome OS as open source and announced more information about it</a>. It&#39;s being based on Linux and will be released to consumers a year from now. &nbsp;From the post, Google is trying to address 3 issues with Chrome OS:</p>
<ol>
<li>Simplifying user experience by making everything a web app and avoiding the need for users to have to install and manage programs;</li>
<li>Improve security by running everything inside the Chrome browser; and</li>
<li>Significantly improve performance by improving startup speed to a matter of seconds.</li>
</ol>
<h4>Is Chrome OS Already Tarnished?</h4>
<p>Tom Krazit of CNET attended the announcement meeting and posted a <a href="http://news.cnet.com/8301-30684_3-10401524-265.html?tag=pop" target="_blank">detailed account of the meeting</a>. One aspect of his post raised some concerns. According to Krazit, Google is going to specify components for Chrome OS netbooks and existing netbooks will not work. Furthermore, Chrome OS will not run on hard drives; it needs solid state drives. That means that you can forget running Chrome OS on your existing notebook.&nbsp;</p>
<p>Bottom line: You have to buy a brand new netbook to run Chrome OS.&nbsp;</p>
<p>In this economy, Google expects us to go out an buy new hardware to run their OS when many of us have gone through upgrade processes recently to support Vista/Windows 7? That makes no sense. My kids, my wife and I would all probably switch to Chrome OS on netbooks if it was supported on existing hardware. We are all at least 3 years from buying new hardware so Chrome OS will have to wait.</p>
<p>Of course&#8230; I will get a new netbook with Chrome OS because I am a technology junky, but my point is that I don&#39;t believe the market can bear this right now.&nbsp;</p>
<h4>The Timing of Microsoft&#39;s Announcement</h4>
<p>I started out this post talking about Internet Explorer 9 and how I thought Microsoft&#39;s announcement is half-baked. They showed up at their Professional Developers Conference in LA and Steven Sinofsky was demonstrating IE9 without the normal fanfare that is associated with a new product launch.</p>
<p>It was only when I read Tom Krazit&#39;s post that it suddenly dawned on me why this was so important. Microsoft is still on its heels with the internet. Microsoft never took the internet seriously when it first started because they never saw it as a viable mechanism for making money. They woke up to that late in the 90s and built Internet Explorer to fight Netscape because they saw Netscape as a potential threat to their dominance on the desktop.</p>
<p>Remember: Microsoft makes money out of two products: 1) Windows and 2) Office. Everything else is chump-change, comparatively speaking. Threaten Windows or Office revenue, and Microsoft has serious worries.</p>
<p>Google is not just threatening Windows with Chrome OS; They are also threatening Office. If their operating system will store everything remotely and all apps are web apps, Microsoft has a serious problem if Chrome takes off.</p>
<p>Google made it clear in July that this announcement would be coming. They also indicated they were communicating with partners about hardware. &nbsp;Microsoft has to be worried because no one there thought that Google would still be a serious internet company in 2010, but Google is very much there, and growing, albeit much more slowly than earlier.&nbsp;</p>
<p>The fact that Chrome OS is going to require new hardware is exactly the reason that Microsoft made what is going to prove to be a very, very important move. If IE9 is able to do all that Steven Sinofsky says it will, especially in terms of the standards compliance, Google could be in trouble. At least with IE9 I will be able to use my existing machine. With Chrome OS, I have to buy new hardware. Microsoft may just have been given the Get-Out-Of-Jail-Free card it needs. You can bet they will use this time to get ahead and Google will be left playing catch-up.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thesoftwaregorilla.com%2F2009%2F11%2Fgoogle-chrome-os-vs-microsoft-windows%2F&amp;linkname=Google%20Chrome%20OS%20vs%20Microsoft%20Windows"><img src="http://www.thesoftwaregorilla.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thesoftwaregorilla.com/2009/11/google-chrome-os-vs-microsoft-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 7 upgrade experience</title>
		<link>http://www.thesoftwaregorilla.com/2009/11/windows-7-upgrade-experience/</link>
		<comments>http://www.thesoftwaregorilla.com/2009/11/windows-7-upgrade-experience/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 19:58:59 +0000</pubDate>
		<dc:creator>Bruce Gruenbaum</dc:creator>
				<category><![CDATA[Product Experiences]]></category>
		<category><![CDATA[Upgrades]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows 7 32-bit]]></category>
		<category><![CDATA[Windows 7 64-bit]]></category>
		<category><![CDATA[Windows 7 Upgrade]]></category>

		<guid isPermaLink="false">http://www.thesoftwaregorilla.com/?p=259</guid>
		<description><![CDATA[We have 4 Windows boxes at home. Three are HP 32-bit notebooks and the other one is an HP 64-bit machine - mine. We bought all 4 machines during the course of this year and all came with Windows Vista. We have had no end of trouble with Vista. The machines work fine, but a lot of applications generate exceptions and hang under Vista that work fine on my XP box. So I decided to believe Microsoft's advertizing (probably a big mistake) that indicates that Windows 7 has been thoroughly tested.
For the most part, this upgrade went smoothly even if it took an inordinate amount of time. The machines are more stable than they were before and they seem to be faster. Internet Explorer performs much better and even Firefox is behaving pretty decently.
So far so good.
]]></description>
			<content:encoded><![CDATA[<p>After many years, I am back at college on-line.&nbsp;The question of &quot;why&quot; is&nbsp;a topic for another post sometime.&nbsp;Classes are divided into 9 week blocks and I have decided that I will take a couple of weeks off between each block to let me catch up on stuff that I need to do. Among the things that I had on my TODO list for this break was to complete the article on Dynamic OpenClient and to do some cleanup of the computers at home.</p>
<h3>Machines</h3>
<p>We have 4 Windows boxes at home. Three are HP 32-bit notebooks and the other one is an HP 64-bit machine &#8211; mine. We bought all 4 machines during the course of this year and all came with Windows Vista. We have had no end of trouble with Vista. The machines work fine, but a lot of applications generate exceptions and hang under Vista that work fine on my XP box. So I decided to believe Microsoft&#39;s advertizing (probably a big mistake) that indicates that Windows 7 has been thoroughly tested.&nbsp;</p>
<h3>Preparation</h3>
<p>My experience with Microsoft&#39;s upgrades have been patchy, at best.&nbsp;So I left this task as the very last task that I would perform before I start class on Monday. I figured on doing a complete reinstall if I needed to. Past exeperience, especially moving from NT to XP,&nbsp;taught me&nbsp;that a reinstall was a very likely possibility. That meant I needed to have everything else taken care of before I started.</p>
<p>I have a lot of stuff on my machine.&nbsp;My local drive has 195GB of programs and data on it. I am fastidious, though, about keeping myself up-to-date with the latest versions of software. This means that I did not need to do much in terms of getting the latest versions of software. Norton 360 does my backups for me so&nbsp;I did not need to do a new backup before I did the upgrade. So once I got the DVD, I could go ahead and install.</p>
<h3>Upgrade</h3>
<p>I started the upgrade on my 64-bit HP Pavilion Entertainment PC at around 4pm on Friday afternoon. I had to deauthorize my iTunes account as one of the preconditions to the install, but that was the only thing that the upgrade process identified as a potential problem. Once that was done, the process started and ran&#8230; and ran&#8230; and ran&#8230; and ran&#8230;</p>
<p>Around 10:00pm (<em>6 hours later!</em>) the install utility asked me for the product key, rebooted, and the upgrade was complete. I immediately did the on-line activation and ran Windows Update to get any updates that were necessary.</p>
<p>Windows Update installed several updates (I believe it was 38) and I restarted the machine again.</p>
<p>All told, the upgrade took about 7 hours, which is an insane amount of time.</p>
<h3>Outcome</h3>
<p>I spent most of Saturday morning testing everything and I had no problems at all. Now that things have settled down, I am very happy with the upgrade. Internet Explorer is working whereas before it was giving a lot of trouble. My machine is performing much better and all the applications I have installed work properly.</p>
<p>As&nbsp;I write this, I have DIRECTV&#39;s SuperCast software running with today&#39;s football games streaming and it works fine.</p>
<p>I spent Saturday afternoon and evening upgrading the other three machines. None of them has as much stuff on as mine, so they averaged about 4 hours total for the upgrade &#8211; still a lot of time. As with mine, they are all performing better and they have also stopped some of the exceptions that were happening.</p>
<h3>Things I like</h3>
<p>All four machines are performing better and seem more stable. We&#39;re not seeing the exceptions we saw before.</p>
<p>Another thing I was worried about is that I was told that a lot of applications would not work with Windows 7. None of my existing applications are affected by that. Everything works fine.</p>
<p>I like the new task bar. It is more organized and it has some useful options.</p>
<p>Networking with the other notebooks on the network is much easier and I have had no problem doing all the Unix stuff I do from my PC.</p>
<h3>Things&nbsp;I don&#39;t like</h3>
<p>This upgrade took a long time. 19 hours of upgrade time across 4 machines is ridiculous.</p>
<p>I was very frustrated that the Quick Launch toolbar now no longer exists and although you can pin things to the taskbar, none of the Quick Launch stuff was pinned to the taskbar for me. That was a pain.</p>
<h3>Summary</h3>
<p>For the most part, this upgrade went smoothly even if it took an inordinate amount of time. The machines are more stable than they were before and they seem to be faster. Internet Explorer performs much better and even Firefox is behaving pretty decently.</p>
<p>So far so good. I&#39;ll follow this up in a week or two with more on how this goes.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thesoftwaregorilla.com%2F2009%2F11%2Fwindows-7-upgrade-experience%2F&amp;linkname=Windows%207%20upgrade%20experience"><img src="http://www.thesoftwaregorilla.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thesoftwaregorilla.com/2009/11/windows-7-upgrade-experience/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OpenEdge Dynamic OpenClient Java Example</title>
		<link>http://www.thesoftwaregorilla.com/2009/11/openedge-dynamic-openclient-java-example/</link>
		<comments>http://www.thesoftwaregorilla.com/2009/11/openedge-dynamic-openclient-java-example/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 02:27:48 +0000</pubDate>
		<dc:creator>Bruce Gruenbaum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OpenClient]]></category>
		<category><![CDATA[OpenEdge]]></category>
		<category><![CDATA[4GL]]></category>
		<category><![CDATA[ABL]]></category>
		<category><![CDATA[Application Server]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[AVM]]></category>
		<category><![CDATA[Dynamic OpenClient]]></category>
		<category><![CDATA[Java OpenClient]]></category>
		<category><![CDATA[OpenEdge OpenClient]]></category>
		<category><![CDATA[Progress]]></category>
		<category><![CDATA[Progress AppServer]]></category>
		<category><![CDATA[Progress OpenClient]]></category>
		<category><![CDATA[PVM]]></category>

		<guid isPermaLink="false">http://www.thesoftwaregorilla.com/?p=90</guid>
		<description><![CDATA[In a previous post, I said I would post an example that demonstrates the use of the OpenEdge Dynamic OpenClient. Well here is the Java version of it. This post is an extensive discussion of the example and how it is structured. Enjoy.]]></description>
			<content:encoded><![CDATA[<p>In a previous post, I said I would post an example that demonstrates the use of the OpenEdge Dynamic OpenClient. Well <a href="http://www.thesoftwaregorilla.com/wp-content/uploads/2009/11/DynamicOpenClient.zip">here is the Java version of it</a>.</p>
<p>It took me a while to get this done, not so much because of the code, but because the documentation that accompanies it is pretty extensive and I have been in the middle of some significant career changes.</p>
<p>This post is long primarily because I walk through the highlights of the what the code does and how this bolsters what I was saying in my earlier post.</p>
<p>Inside the zip file are 2 zip files and&nbsp;3 PDF files:</p>
<ul>
<li><strong>DynamicOpenClientJar.zip</strong> is the compiled version of the code. It contains a jar file, the input.xml, a batch file, and the Progress source code.</li>
<li><strong>DynamicOpenClientJar.pdf</strong> contains setup instructions to set it up and run it.</li>
<li><strong>DynamicOpenClientSrc.zip</strong> is the source code.</li>
<li><strong>DynamicOpenClientSrc.pdf</strong>&nbsp;contains the instructions that&nbsp;that tells you how to set&nbsp;the source code up to work with Eclipse.</li>
<li><strong>DynamicOpenClient.pdf </strong>is a detailed tour of the code and describes how it works.</li>
</ul>
<h4>This is Sample Code</h4>
<p>Before you dig into the code and say &quot;Wow!! This code sucks!!&quot; it is important to understand that this is sample code. There are a lot of things about it that are ugly. Some of the object model needs serious refining. There are cleaner ways of doing the XML&nbsp;parsing and it is nowhere near as defensive as it should be. There are those who believe that bad code samples lead to bad code in production, but there is another line of thought that goes that if you don&#39;t recognize those bad examples, you should not be coding to start with. The point with this code is that it demonstrates concepts and that&#39;s what it was intended to do.</p>
<h4>Code Limitations</h4>
<p>For the sake of brevity, I&nbsp;have deliberately not covered stuff like supporting supporting ProDataSets and all of the different Progress data types.&nbsp;I have covered the most common ones and temp-tables. ProDataSets are really an extension of temp-tables and you can feel free to go and look at the code in a generated proxy to see how they work. I&nbsp;also stopped short of supporting the building of temp-tables from an input XML&nbsp;file. The extra code to do this did not seem like it would really add that much to the example. This code example also does not support persistent procedures because they are a lot more complicated than this code will allow.</p>
<h4>Set it up and try it</h4>
<p>Having said all of that, I wanted to spend some time in this post elaborating on the comments that I made in the earlier post about why Dynamic OpenClient is such a powerful technology, using the example code that I am presenting here. So I am going to assume for the rest of this article that you have at least set up and run the example and that you have the source code accessible to follow along.</p>
<h4>How it Works</h4>
<p><a href="http://www.thesoftwaregorilla.com/wp-content/uploads/2009/08/Sequence-Diagram.jpg" target="_blank"><img align="right" alt="Dynamic Open Client Utility Sequence Diagram - Click for full size" border="0" height="192" hspace="2" src="http://www.thesoftwaregorilla.com/wp-content/uploads/2009/08/Sequence-Diagram.jpg" vspace="2" width="300" /></a>The Dynamic Open&nbsp;Client code takes an XML&nbsp;file and parses it for AppServer connection parameters, R-Code signatures and calls that need to be made to the Progress/OpenEdge R-Code files. The sequence diagram at right (click on it for a full-size image)&nbsp;shows the process.</p>
<p>Once the XML file has been parsed, the utility executes each of the calls and serializes the results of the call&#39;s execution to an internal XML document. Once all the calls have been executed and serialized, the results are written out to another XML file that is specified in the input.xml file. More information on the XML file&#39;s format is in the DynamicOpenClient.pdf file.</p>
<h4>The Main Components</h4>
<p>To understand how this utility works, you need to understand the core of the class model. So let me start by dividing the class model into its major areas.</p>
<p>You can pretty much ignore the <em>com.tsg.common</em> project.&nbsp;It contains&nbsp;an interface -&nbsp;<em>INamedItem</em> &#8211; used&nbsp;by a few classes that&nbsp;simply has a getName() method declaration.&nbsp;<em>INamedItem</em> is&nbsp;implemented by some of the classes in the <em>com.tsg.dynamicopenclient</em> project. This interface is specifically used for objects that may be stored in a <em>com.tsg.common.collections.OrdinalList</em> &#8211; a specialized list that is ordinal like an ArrayList, but expects uniquely named items in the list.&nbsp;<em>OrdinalList</em> is used&nbsp;for things like field lists and parameter lists where the fields need to be in a specific order, but the names have to be unique.</p>
<p>The <em>com.tsg.dynamicopenclient</em> project contains three packages:<a href="http://www.thesoftwaregorilla.com/wp-content/uploads/2009/08/Class-Model.jpg" target="_blank"><img align="right" alt="Dynamic Open Client Sample Utility Class Model" height="200" hspace="2" src="http://www.thesoftwaregorilla.com/wp-content/uploads/2009/08/Class-Model.jpg" vspace="2" width="300" /></a></p>
<ul>
<li><em>com.tsg.dynamicopenclient </em>- This package contains&nbsp;the code that does most of the work;</li>
<li><em>com.tsg.dynamicopenclient.data </em>- This package&nbsp;contains the&nbsp;class hierarchy for parameter and other&nbsp;data element&nbsp;definitions;</li>
<li><em>com.tsg.dynamicopenclient.valueholders </em>- This package contains&nbsp;the class hierarchy for all the value holders that&nbsp;are used to contain&nbsp;the values of input and&nbsp;output parameters.</li>
</ul>
<h5>Data Types</h5>
<p>One of the most&nbsp;important aspects of the&nbsp;communication between the&nbsp;OpenClient and the AppServer, is the mapping of data types from Java to Progress. To&nbsp;make sure that this is done consistently, there is a&nbsp;<em>DataType</em> <em><strong><a href="http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html" target="_blank">enumeration</a></strong></em> in&nbsp;<em>com.tsg.dynamicopenclient</em>.&nbsp;If you have not worked with Java 5, enumerations may be a new concept to you and this one is particularly more so than others. An enumeration is a great way to deal with hard-coded constants and it is particularly useful where a map of constants is necessary. In this&nbsp;particular case we have to map an OpenClient numeric constant to a string representation of the data type, a Java class that can be used to map to that type and a valueholder class that can be used to contain the Java type. The following definition of the INTEGER data type demonstrates the mechanism:</p>
<pre>INTEGER
  (Parameter.PRO_INTEGER, // Progress numeric constant
   Parameter.PRO_INTEGER_NAME, // Progress character constant
   &quot;java.lang.Integer&quot;, // Java class to be used to map
   &quot;com.tsg.dynamicopenclient.valueholders.IntegerValueHolder&quot;),&nbsp;// Dynamic OpenClient valueholder
</pre>
<p>The DataType enumeration has several methods associated with it to retrieve a constant based on the string name of the data type or to obtain the Java class, value holder class&nbsp;or Progress data type constant. It also contains code that will instantiate an object of either the Java class to contain the data type or the value holder. This enumeration truly is at the core of the code.</p>
<h5>Data Elements</h5>
<p>The <em>com.tsg.dynamicopenclient.data</em> package contains a set of classes that define the behavior of data elements. A data element is any item that has a name and a datatype associated with it. Thus, fields and parameters are all data elements. Data elements only store the definition of the element. They do not store the value. The value is stored in a <a href="#ValueHolder">value holder</a>. The abstract base <em>DataElement</em> class contains all the behavior for parsing parameter and field definition information from an XML node.</p>
<p>The <em>Parameter</em> class extends it by providing support for parameter modes (INPUT, INPUT-OUTPUT and OUTPUT)&nbsp;which are mapped in&nbsp;an enumeration called <em>ParameterMode</em> in <em>com.tsg.dynamicopenclient</em>.</p>
<p>The <em>TempTableParameter</em> class extends the <em>Parameter</em> class further by providing support for parsing temp-table definitions from the source code and supporting the construction of ProDataGraphMetaData objects that are used to build the ProDataGraph to transport temp-tables between AppServer and client.</p>
<h5><a name="ValueHolder"></a>Value Holders</h5>
<p>The <em>com.tsg.dynamicopenclient.valueholders</em> package contains a set of classes and an interface that are used to standardize the way that data types are dealt with. Looking at the class model, the value holder hierarchy is to the right of the diagram. This hierarchy leverages the concept of <strong><em><a href="http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf" target="_blank">generics</a></em></strong> that was introduced in Java 5.</p>
<p>The <em>IValueHolder</em> interface is the base of the hierarchy and the <em>ValueHolder</em> abstract class contains the generic behavior for value holders. These classes provide support for the Progress UNKNOWN value as well as reasonable default values that match the Progress defaults for its data types.</p>
<p>Value holders are used to set the value of input parameters and to contain the&nbsp;values of output parameters.</p>
<h5>DynamicOpenClient Class</h5>
<p>The DynamicOpenClient class in <em>com.tsg.dynamicopenclient</em> contains the <em>main()</em> method&nbsp;- the entry point to the utility. It starts out by parsing the parameters to determine where the XML file is that contains the signatures and input parameters for the calls. The input.xml file&#39;s structure is detailed in the DynamicOpenClient.pdf file that accompanies the source code. In essence, though, there are 4 types of nodes that are important:</p>
<ul>
<li><strong>dynamicoc</strong> &#8211; This is the root node for the document and it contains an OutputFile attribute that has the name of the file that should be used for the results of the calls.</li>
<li><strong>appserver</strong> &#8211; This node contains the signature and call nodes and a set of attributes that define the connection parameters for the AppServer.</li>
<li><strong>signature</strong> &#8211; This node contains the signature of a call that will be executed against the AppServer. The signature node may contain a set of parameter nodes which will be all of the parameters for a procedure. These parameters must be specified in the order that they are specified in the ABL source code. If the parameter&#39;s&nbsp;DataType attribute&nbsp;is TABLE, the node will contain child nodes that are the field and indexes for the table.</li>
<li><strong>call</strong> &#8211; This node contains a list of calls that need to be executed against the AppServer. Each of them should refer (by means of the Procedure attribute) to a previously specified signature. call Nodes may contain subordinate parametervalue nodes that reference a parameter in the signature by name and specify the value to be used as the input value for that parameter.</li>
</ul>
<p>The following code extract&nbsp;comes from&nbsp;the <em>main()</em> method.</p>
<pre>//Extracted from <strong>main()</strong> method.
//

//Instantiate the CallManager
CallManager manager = CallManager.getInstance();

//Parse the XML file.
try {
	parse(fileName);
}
catch (Exception e) {
	System.out.println(e.getMessage());
	return;
}
.
.
.
Iterator&lt;Call&gt; iter = manager.iterator();
while (iter.hasNext()) {
	Call call = iter.next();&nbsp; //Get the call
	call.executeCall();&nbsp;&nbsp; //Execute the call
	outRoot.appendChild(call.serializeResults(outputDocument));
	iter.remove();
}
.
.
.
try {
	writeResults();&nbsp; // Write the XML results file out to disk.
}
catch (Exception e) {
	System.out.println(e.getMessage());
	return;
}</pre>
<p>Before doing anything else, the code instantiates the Singleton CallManager to hold onto all the data that will be parsed from the XML file.</p>
<p>The <em>main() </em>method calls the static <em>parse() </em>method with the name of the XML file to be parsed. This method parses the XML document and iterates through the four element nodes mentioned above. It also sets up a DOM document that will be used as the output document for the results of the calls.</p>
<p>For each element, it instantiates an object of the appropriate class and passes it the XML node that needs to be instantiated. This&nbsp;object is then added to the CallManager where it will be retrieved later.</p>
<pre>//Extracted from <strong>parse()</strong> method.
//
Node elementNode = null;
while((elementNode = iterator.nextNode()) != null) { // Loop through elements

	// Handle root node.
	if (elementNode.getNodeName().equalsIgnoreCase(XMLStrings.INPUT_ROOT_NODE.toString())) { 	

		// Setup the output file.
		String attrValue = XMLStrings.getAttribute(elementNode, XMLStrings.OUTPUT_FILE_ATTR.toString());
		if (attrValue != null) {
			outputFileName = attrValue;
		}
	}

	// Handle appserver node
	if (elementNode.getNodeName().equalsIgnoreCase(XMLStrings.APPSERVER_NODE.toString()) ) {
		manager.setAppServerConnection(new AppServerConnection(elementNode));
	}

	// Handle signature node
	if (elementNode.getNodeName().equalsIgnoreCase(XMLStrings.SIGNATURE_NODE.toString()) ) {
		manager.setSignature(new Signature(elementNode));
	}

&nbsp;	// Handle call node
	if (elementNode.getNodeName().equalsIgnoreCase(XMLStrings.CALL_NODE.toString()) ) {
		manager.addCall(new Call(elementNode));&nbsp;
 	}
}</pre>
<p>The <em>CallManager</em> implements the <em>Iterable</em> interface for the <em>Call</em> class.&nbsp;Back in the <em>main()</em> method, the next thing we do is iterate through all&nbsp;of the <em>Call</em> objects in the <em>CallManager</em> and we execute the call. This is where the real work happens and a description of it is below. When execution is complete, the parameter values will have been stored in the <em>Call</em> object and a call to <em>serializeResults()</em> will return an XML node that can be appended to the output document. The <em>Call</em> object is then deleted from the list of calls to free up the memory that any temp-tables will occupy.</p>
<p>Once all the calls have been executed, a call is made to writeResults() which writes the output XML document to disk.</p>
<h4>Executing the Call</h4>
<p>A&nbsp;call&nbsp;is actually executed by&nbsp;a call to&nbsp;<em>executeCall()</em>&nbsp;on the <em>Call</em> object. The <em>executeCall()</em> method simply builds a parameter array, calls the <em>runProcedure() </em>method on the AppServerConnection object, builds the output parameter value set and handles any exceptions. The thing that makes this client dynamic is the code in <em>buildParamArray()</em> and <em>buildOutputValues()</em>.</p>
<h5>buildParamArray()</h5>
<p>In order to make a call to the AppServer, the OpenClient needs a procedure name to call and a parameter array (<em>com.progress.openABL.javaproxy.ParamArray</em>) for the call. The parameter array needs to contain a full description of each parameter as well as the value to be set for the parameter. The <em>Call</em> object has a procedure name and it has the values of the input parameters. The name of the procedure maps to a <em>Signature</em> object which can be obtained from the <em>CallManager</em> and it contains the definitions of all of the parameters that are needed for the call. Thus, <em>buildParamArray()</em> obtains the <em>Signature</em> object and builds a <em>ParamArray</em> object with each of the parameter definitions in the <em>Signature</em> object. As it attempts to add each parameter to the <em>ParamArray</em>, it obtains a IValueHolder object to contain the parameter&#39;s input or output parameter value.&nbsp;It then&nbsp;checks for a corresponding input value in the <em>Call</em> object. If it finds a corresponding value it sets the input value in the <em>ParamArray</em> from this value. This is how the <em>Call</em> information in the XML file can specify the parameter values by name in any order and only specify the ones that have values associated with them.</p>
<pre>//Extracted from <strong>buildParamArray()</strong> method.
//

CallManager manager = CallManager.getInstance();
Signature sig = manager.getSignature(getProcedureName()); //Get the signature for this call
if (sig == null) {
	throw new DynamicOpenClientException(...);
}
ParamArray params = new ParamArray(sig.getParameterCount()); //Instantiate a ParamArray object

int idx = 0;

// Iterate through all the parameters in the signature.
for (Parameter param : sig) { 

	// Instantiate an IValueHolder for this data type.
	IValueHolder&lt;?&gt; valueHolder = DataType.getValueHolder(param.getDataType());
	paramValues.add(valueHolder); // Put the value holder into the paramValues list.

	// If we can find a parameter value that was set for this call,
	// set the value of the IValueHolder to the input value.
	if (inputValues.containsKey(param.getName())) {&nbsp;
		valueHolder.setObject(inputValues.get(param.getName()));
	}</pre>
<p>Now that the data we&nbsp;need is available (ie, the parameter type information and input values have been set), we can go about setting the values, but we need to treat the&nbsp;TABLE and TABLE-HANDLE types differently from the the other data types. The reason is that they need a ProDataGraph and its metadata. The code for setting the values is therefore as follows:</p>
<pre>Object value = null;
switch(param.getDataType()) {
	case TABLE:
	case TABLE_HANDLE:
		TempTableParameter ttParam = (TempTableParameter) param;
		ProDataGraphValueHolder graphHolder = (ProDataGraphValueHolder) valueHolder;
		ProDataGraphMetaData metaData = null;
		switch(param.getMode()) {
			case OUTPUT:
				// For a table we need the table structure. TABLE_HANDLE needs null.
				if (param.getDataType() == DataType.TABLE) {
					metaData = ttParam.getProDataGraphMetaData();
				}
				break;
			default:
				value = graphHolder.getProDataGraph();
				metaData = graphHolder.getProDataGraph().getMetaData();
				break;
		}

		// Add a parameter to the ParamArray with the appropriate value.
		params.addParameter(idx, value, ttParam.getMode().getModeCode(),
			ttParam.getDataType().getTypeCode(),
			ttParam.getExtent(),
			metaData);
		break;
	default:
		// Now get the object from the IValueHolder that has the value in it.
		value = valueHolder.get(); 

		// Add a parameter to the ParamArray with the appropriate value.
		params.addParameter(idx, value, param.getMode().getModeCode(),
			param.getDataType().getTypeCode(),
			param.getExtent(),
			(ProDataGraphMetaData) null);
		break;
}
</pre>
<p>The outer switch in this code handles the difference between TABLE, TABLE-HANDLE and other parameters. So skip the first cases and look at the default case (the last 11 lines of this code block from the word &quot;default:&quot; on.&nbsp;All this code does is grab the object that&nbsp;is in&nbsp;<em>ValueHolder</em> and&nbsp;assign it to the value variable. It then adds a parameter specifying the&nbsp;ordinal position (idx), the value, the&nbsp;parameter&nbsp;mode (INPUT, OUTPUT or&nbsp;INPUT-OUTPUT), the Progress DataType Code from the <em>DataType</em>, the extent and a null for the <em>ProDataGraphMetaData</em>.</p>
<p>The TABLE and TABLE-HANDLE&nbsp;cases are slightly more complicated. For a TABLE&nbsp;or TABLE-HANDLE if the parameter is either an INPUT or INPUT-OUTPUT parameter, the value has to be set to the <em>ProDataGraph</em> that will&nbsp;be&nbsp;used to contain the return value. The <em>ProDataGraphMetaData</em> needs to be specified to supply the table structure. In the case of an OUTPUT parameter, a TABLE parameter requires <em>ProDataGraphMetaData</em> but null in the value parameter and in the case of a TABLE-HANDLE, both the metadata and the value need to be null. In both cases, the <em>Parameter</em> object will have been specialized as a <em>TempTableParameter</em> object so that it could build the temp-table structure.</p>
<p>Once the parameters have all been added to the <em>ParamArray</em>, it is returned to the caller (executeCall) and is now ready to invoke the call.</p>
<h5>runProcedure()</h5>
<p>The <em>runProcedure()</em> method call is run on the <em>AppServerConnection</em> object that is contained in the <em>CallManager</em>. The AppServerConnection class performs 2 functions:</p>
<ol>
<li>It stores the AppServer connection parameter values; and</li>
<li>It executes calls against the AppServer.</li>
</ol>
<p>The first thing <em>runProcedure()</em> does is call <em>obtainAppObject()</em>. The <em>OpenAppObject </em>class provides access to AppServer connections from the connection pool and supports all communication with the AppServer. The <em>obtainAppObject()</em> call instantiates a <em>Connection</em> object and then an <em>OpenAppObject</em> if they have not already been instantiated. This establishes the connection to the AppServer.</p>
<p>Once the connection is established, the <em>runProc()</em> method on the <em>OpenAppObject</em> is run with the&nbsp;<em>ParamArray</em> that was passed in and any exceptions are thrown back to the caller.&nbsp;If this code completes successfully, the AppServer call has succeeded.</p>
<h5>buildOutputValues()</h5>
<p>After the call has completed, <em>executeCall()</em> calls <em>buildOutputValues() </em>with the <em>ParamArray</em> that was used&nbsp;in&nbsp;<em>runProcedure()</em>.&nbsp;</p>
<pre>//Extracted from <strong>buildOutputValues()</strong>
//
returnValue = params.getProcReturnString();
if (returnValue == null) {
	returnValue = &quot;null/Unknown (?)&quot;;
}
int idx = 0;
for (Parameter param : sig) { // Loop through each parameter in the signature.
	switch (param.getMode()) { // Check the parameter mode.
		case INPUT_OUTPUT:
		case OUTPUT:

			// Get the value of the parameter from the paramArray.
			Object outputValue = params.getOutputParameter(idx); 

			// Set the value of the parameter in our internal array to be the result
			paramValues.get(idx).setObject(outputValue);
	}
	idx++;
}</pre>
<p>The buildOutputValues() method&nbsp;does 2 things:</p>
<ol>
<li>It obtains the value of the RETURN-VALUE string from Progress; and</li>
<li>It loops through all OUTPUT or INPUT-OUTPUT parameters and sets the value in the <em>IValueHolder</em> from the value in the&nbsp;<em>ParamArray.</em></li>
</ol>
<p>The output parameter values are thus available to the <em>Call</em> object for serialization.&nbsp;</p>
<h4>Why this is so powerful&nbsp;</h4>
<p>That is the crux of the code in the Dynamic OpenClient Sample Utility. It&#39;s not really that complicated and although this is a crude example, it does show the relative ease with which one can build a&nbsp;client that invokes calls for which all signature information is obtained at runtime.</p>
<p>If you work through the associated document that contains a description of running the utility, you will notice how easy it is to edit the ABL code and change temp-table structures or any other signature related information, modify the corresponding signature in the XML file and re-run the utility without changing the Java code.</p>
<p>If you go ahead and automate the generation of the XML signatures into a post-compile operation and post it on a web-server or some other centralized resource, there is never a need to change the Java code unless you discover a bug in it or Progress adds a data type.</p>
<p>There&#39;s another interesting side effect to this. It would not take much effort beyond this to build an automated mechanism for dynamic WSDL generation so that you dynamically expose any ABL procedure as a WebService. Taking it further, exposing it as an EJB or J2EE container or a JMS endpoint would be fairly simple too and would mean very little would ever need to be changed in the plumbing between the client and the server. You see, as far as I am concerned, everything related to ProxyGen is plumbing that should never require a recompile unless the underpinnings change. ProxyGen forces that each time a temp-table definition is changed.</p>
<p>Hopefully this example is useful. I am planning a .NET equivalent later on.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thesoftwaregorilla.com%2F2009%2F11%2Fopenedge-dynamic-openclient-java-example%2F&amp;linkname=OpenEdge%20Dynamic%20OpenClient%20Java%20Example"><img src="http://www.thesoftwaregorilla.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thesoftwaregorilla.com/2009/11/openedge-dynamic-openclient-java-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
