<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:thr="http://purl.org/syndication/thread/1.0">
  <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html" />
  <link rel="self" type="application/atom+xml" href="http://www.insideria.com/atom.xml" />
  <id>tag:www.insideria.com,2009://34/tag:www.insideria.com,2008://34.23912-</id>
  <updated>2009-11-16T15:42:26Z</updated>
  <title>Comments for Anatomy of an Enterprise Flex RIA Part 20: Administration Section: Layout and Navigation (http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html)</title>
  <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>
  <entry>
    <id>tag:www.insideria.com,2008://34.23912</id>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blogs.oreilly.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=34/entry_id=23912" title="Anatomy of an Enterprise Flex RIA Part 20: Administration Section: Layout and Navigation" />
    <published>2008-06-06T19:19:53Z</published>
    <updated>2008-09-30T19:58:24Z</updated>
    <title>Anatomy of an Enterprise Flex RIA Part 20: Administration Section: Layout and Navigation</title>
    <summary>This installment concludes our series on Flex, LiveCycle Data Services, and EJB 3.0 by exploring the administrative section of the application, showing more managed data features, and looking at server push from JMS to Flex.</summary>
    <author>
      <name>Tony Hillerson</name>
      
    </author>
    
    <category term="Features" />
    
    <content type="html" xml:lang="en" xml:base="http://www.insideria.com/">
      <![CDATA[<p>Last installment we looked at searching for data with our application. Now we'll conclude our look at Flex, LiveCycle Data Services, and EJB 3.0 by exploring the administrative section of the application.</p>
<p><strong>Administration Section: Layout and Navigation</strong></p>
<p>The administration section is only a little more complex (see Figure 25).</p>

<div class="ap_c"><a href="http://www.insideria.com/upload/2008/06/series20_figure25.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/06/series20_figure25.jpg" alt="series20_figure25.jpg" title="Click to enlarge" width="400"/></a><div class="apcaption">Figure 25. The administration section</div></div>

<p>There is an ApplicationControlBar along the top which is the main navigation for the admin section. The control bar has a ToggleButtonBar which is bound to the ViewStack, which makes the button bar have as many buttons as the stack has views, using the labels of the views as the labels of the buttons.</p>
<p>The ApplicationControlBar also has a label on the right side which is bound to the AdminModel&#8217;s outstandingReservations property, with a little extra text. The outstandingReservations property tells how many new reservations have come in and not yet been checked out, meaning that someone has reserved some books but has not picked them up yet. The administrator should get those books ready for checkout. We&#8217;ll see how this property is set later.</p>

<div class="ap_r" style="width:180px;"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank"><img border="0" src="http://www.oreilly.com/catalog/covers/9780596514402_cat.gif" width="180" height="233" /></a>
<div class="apcaption"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank">Get your copy of Tony Hillerson's Enterprise Application Development with Flex.</a></div></div>


<p>The three views of the view stack are the book management section, the outstanding reservations section, and the checked out reservation section. The management section is where People (Authors and Users), Subjects, and Books are created, updated, and deleted. The outstanding reservations section shows a list of reservations that haven&#8217;t yet been checked out, and the checked out reservations section shows a list of books that are checked out, allowing the administrator to check them in.</p>
<p><strong>Administration Section: Data Management in Action</strong></p>
<p>Let&#8217;s look at how the CRUD views work. EditBooksPanel includes three edit panels: BookEdit, SubjectEdit, and AuthorEdit. There is some interaction between the three and the EditBooksPanel when a Subject or Author is selected. An event is emitted from the SubjectEdit and AuthorEdit components when one of these is selected, caught by the EditBooksPanel, and set as the current Author or Subject for editing or creating a new Book. </p>
<p>What&#8217;s more interesting, though, is editing one of these three. First, instead of a separate form to edit, I&#8217;ve used a DataGrid in editable mode. For this simple use case, that works nicely. For a more complex use case, we would probably need a form. Here&#8217;s a look at SubjectEdit:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;mx:Panel ... creationComplete="<span class="quote">init()</span>"&gt;
...
    &lt;mx:Script&gt;
    [Bindable]
    <span class="category1">private</span> <span class="category1">var</span> model:AdminModel = AdminModel.getInstance();

    <span class="category1">public</span> <span class="category1">function</span> <span class="category2">get</span> selectedSubject():Subject {
          <span class="category1">return</span> subjectGrid.selectedItem as Subject;
     }

    <span class="category1">private</span> <span class="category1">function</span> <span class="category2">init</span>():<span class="category1">void</span> {
          <span class="category1">new</span> GetAllSubjectsEvent().dispatch();
     }

    <span class="category1">private</span> <span class="category1">function</span> subjectSelected():<span class="category1">void</span> {
          dispatchEvent(<span class="category1">new</span> Event("<span class="quote">subjectSelected</span>"));
     }

    <span class="category1">private</span> <span class="category1">function</span> removeSubject():<span class="category1">void</span> {
          <span class="category1">new</span> DeleteSubjectEvent(subjectGrid.selectedItem as Subject).dispatch();
     }

    <span class="category1">private</span> <span class="category1">function</span> createNewSubject():<span class="category1">void</span> {
          <span class="category1">var</span> subject:Subject = <span class="category1">new</span> Subject();
          subject.<span class="category2">name</span> = "<span class="quote">New Subject</span>";
          model.subjects.<span class="category2">addItem</span>(subject);
     }
    &lt;/mx:Script&gt;</pre>
</code>

</div></div>

<p>The DataGrid is populated with the right data on creationComplete, which is when the view is ready for display, by firing the GetAllSubjects event, this time in the admin package.</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;mx:DataGrid
    id="<span class="quote">subjectGrid</span>"
    dataProvider="<span class="quote">{model.subjects}</span>"
    click="<span class="quote">subjectSelected()</span>"
    editable="<span class="quote">true</span>"
    <span class="category2">width</span>="<span class="quote">100%</span>"
    <span class="category2">height</span>="<span class="quote">100%</span>"
&gt;
    &lt;mx:columns&gt;
        &lt;mx:DataGridColumn
              dataField="<span class="quote">id</span>"
              headerText="<span class="quote">Id</span>"
              editable="<span class="quote">false</span>"
          /&gt;
          &lt;mx:DataGridColumn
              dataField="<span class="quote">name</span>"
              headerText="<span class="quote">Subject Name</span>"
          /&gt;
          &lt;mx:DataGridColumn
              dataField="<span class="quote">createdOn</span>"
              headerText="<span class="quote">Created</span>"
              editable="<span class="quote">false</span>"
         /&gt;
         &lt;mx:DataGridColumn
              dataField="<span class="quote">updatedOn</span>"
              headerText="<span class="quote">Updated</span>"
              editable="<span class="quote">false</span>"
         /&gt;
    &lt;/mx:columns&gt;
&lt;/mx:DataGrid&gt;
&lt;mx:HBox&gt;
    &lt;mx:<span class="category2">Button</span> <span class="category1">label</span>="<span class="quote">New</span>" click="<span class="quote">createNewSubject()</span>" /&gt;
    &lt;mx:<span class="category2">Button</span> <span class="category1">label</span>="<span class="quote">Remove</span>" click="<span class="quote">removeSubject()</span>"
              <span class="category2">enabled</span>="<span class="quote">{subjectGrid.selectedItem != null}</span>" /&gt;
&lt;/mx:HBox&gt;</pre>
</code>

</div></div>

<p>But look at the code to edit subjects&#8212;if you can find it, that is. You&#8217;d think you&#8217;d need to capture when a row was edited or added, get the information, and send it to the service for persistence, right? We&#8217;ll, you&#8217;d be right in that it needs to be done, but what&#8217;s actually doing all of that work are the data management features of LCDS. All we need to do is make the changes to the data already in the managed collection, or add or delete a row from that collection.</p>
<p>When the init method loaded the data, it got a collection from the data service and put that on the model, and the grid is bound to that model&#8217;s collection. Because the DTOs in the collection are all marked as managed:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 30px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
...
    [Managed]
    [RemoteClass(alias="<span class="quote">lcds.examples.bookie.entity.Subject</span>")]
    <span class="category1">public</span> <span class="category1">class</span> Subject <span class="category1">extends</span> BaseEntity {
 ... </pre>
</code>

</div></div>

<p>and the DataService is auto-syncing (the default state), the LCDS code on the client knows to automatically save any changes to those DTOs.</p>
<p>This should strike you as an incredible aid to the development effort. That glue code to hook up the edits to any particular object all the way through to the service layer is written for you already&#8212;you don&#8217;t even have to think about it.</p> 
<p>Explore the sample code more if you want, but the important &#8220;take home&#8221; is how the data management features work hard so that you don&#8217;t have to.</p>
<p><strong>Administration Section: The Reservation Alert Notification</strong></p>
<p>One last item of note in Bookie is the notification when a new reservation is received. We&#8217;ve seen how the topic is set up in JBoss, and we&#8217;ve seen how the ReservationsDAOBean publishes a message to that topic. Now let&#8217;s look at how Flex signs up to get those messages.</p>
<p>First, in the Cairngorm services definition, lcds.examples.bookie.business.Services, there&#8217;s a definition for a Consumer called reservationConsumer:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 25px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;mx:Consumer
    id="<span class="quote">reservationConsumer</span>"
    destination="<span class="quote">outstandingReservationTopic</span>" /&gt;</pre>
</code>

</div></div>

<p>A Consumer is LCDS&#8217;s class for subscribing to and receiving messages. Our reservationConsumer is set to a destination called outstandingReservationTopic, defined in messaging-config.xml:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;destination id="<span class="quote">outstandingReservationTopic</span>"&gt;
    &lt;properties&gt;
         &lt;network&gt;
              &lt;session-timeout&gt;0&lt;/session-timeout&gt;
         &lt;/network&gt;
         &lt;jms&gt;
              &lt;destination-<span class="category2">type</span>&gt;Topic&lt;/destination-<span class="category2">type</span>&gt;
              &lt;<span class="category2">message</span>-<span class="category2">type</span>&gt;javax.jms.ObjectMessage&lt;/<span class="category2">message</span>-<span class="category2">type</span>&gt;
              &lt;connection-factory&gt;
                   TopicConnectionFactory
              &lt;/connection-factory&gt;
              &lt;destination-jndi-<span class="category2">name</span>&gt;
                   topic/outstandingReservationTopic
              &lt;/destination-jndi-<span class="category2">name</span>&gt;
              &lt;destination-<span class="category2">name</span>&gt;
                   outstandingReservationTopic
              &lt;/destination-<span class="category2">name</span>&gt;
              &lt;delivery-mode&gt;NON_PERSISTENT&lt;/delivery-mode&gt;
              &lt;<span class="category2">message</span>-priority&gt;DEFAULT_PRIORITY&lt;/<span class="category2">message</span>-priority&gt;
              &lt;acknowledge-mode&gt;AUTO_ACKNOWLEDGE&lt;/acknowledge-mode&gt;
              &lt;transacted-sessions&gt;<span class="category1">false</span>&lt;/transacted-sessions&gt;
         &lt;/jms&gt;
    &lt;/properties&gt;
&lt;/destination&gt;</pre>
</code>

</div></div>

<p>This destination points to the topic and connection factory and sets the properties of the topic that LCDS needs to know. All we need to do to start listening for messages is to tell the consumer to subscribe. What I&#8217;ve done is create something similar to a wrapper to the Consumer in lcds.examples.bookie.business.NotificationManager. It takes a Consumer in the reservationConsumer setter, subscribes that Consumer (if it wasn&#8217;t already), and starts listening for messages.</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie.business {
 ... 
     <span class="category1">public</span> <span class="category1">class</span> NotificationManager {
  ... 
           <span class="category1">private</span> <span class="category1">var</span> _reservationNotificationView:NewReservationNotification;
           <span class="category1">public</span> <span class="category1">function</span> <span class="category1">set</span> reservationNotificationView(view:NewReservationNotification):<span class="category1">void</span> {
                 _reservationNotificationView = view;
            }
  
           <span class="category1">private</span> <span class="category1">var</span> _consumer:Consumer;
           <span class="category1">public</span> <span class="category1">function</span> <span class="category1">set</span> reservationConsumer(consumer:Consumer):<span class="category1">void</span> {
                 <span class="category1">if</span> (!consumer.subscribed) consumer.subscribe();
                 consumer.addEventListener(MessageEvent.MESSAGE, onNewReservation);
                 _consumer = consumer;
            }
  
  ...  
           <span class="category1">public</span> <span class="category1">function</span> onNewReservation(me:MessageEvent):<span class="category1">void</span> {
                 <span class="category1">var</span> reservation:Reservation = Reservation(me.<span class="category2">message</span>.body);
                 <span class="category1">new</span> ReservationRecievedEvent(reservation).dispatch();
                 notifyOfReservation(reservation);
            }
  
           <span class="category1">public</span> <span class="category1">function</span> notifyOfReservation(reservation:Reservation):<span class="category1">void</span> {
                 _reservationNotificationView.<span class="category2">show</span>(reservation);
            }
 }</pre>
</code>

</div></div>

<p>NotificationManager is a singleton because we should have only one. To bootstrap this NotificationManager, admin.mxml fires a command when it&#8217;s initialized, called lcds.examples.bookie.command.admin.ReservationNotificationSubscribeCommand, which simply sets the consumer on the NotificationManager. It also gets an instance of the NewReservationNotification component, which displays a notification when a new reservation is received.</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie.command.admin {
     <span class="category1">public</span> <span class="category1">class</span> ReservationNotificationSubscribeCommand
                                   <span class="category1">implements</span> ICommand {
  
           <span class="category1">public</span> <span class="category1">function</span> execute(event:CairngormEvent):<span class="category1">void</span> {
                 <span class="category1">var</span> evt:ReservationNotificationSubscribeEvent = 
                      event as ReservationNotificationSubscribeEvent;
                 <span class="category1">var</span> consumer:Consumer = 
                 EnterpriseServiceLocator.
                      getInstance().
                      getConsumer("<span class="quote">reservationConsumer</span>");
   
                 <span class="category1">var</span> manager:NotificationManager =
                      NotificationManager.getInstance();
                 manager.reservationConsumer = consumer;
                 manager.reservationNotificationView =
                      evt.reservationNotificiation;
           }
      }
}</pre>
</code>

</div></div>

<p>Once a message is received, NotificationManager.onNewReservation is called, and that fires an event which corresponds to the lcds.examples.bookie.command.admin.ReservationReceivedCommand. The NotificationManager then tells the NewReservationNotification to show itself. That view is a simple HBox that shows a collection of books in a reservation, and then animates itself away similar to how the Thunderbird email client shows that you have new email (see Figure 26).</p>


<div class="ap_c"><a href="http://www.insideria.com/upload/2008/06/series20_figure26.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/06/series20_figure26.jpg" alt="series20_figure26.jpg" title="Click to enlarge" width="400"/></a><div class="apcaption">Figure 26. An automatic reservation update</div></div>

<p>Here&#8217;s the code for that little widget:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 90px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
...
         <span class="category1">private</span> <span class="category1">var</span> hideTimer:Timer;

         <span class="category1">public</span> <span class="category1">function</span> <span class="category2">show</span>(reservation:Reservation):<span class="category1">void</span> {
               reservationTitles.<span class="category2">text</span> =
                    reservationTitles.<span class="category2">text</span> +
                    reservation.book.title + "<span class="quote">\n</span>";
               reservationTitles.maxWidth = <span class="category1">this</span>.<span class="category2">width</span>;
               <span class="category1">if</span> (hideTimer == <span class="category1">null</span> || !hideTimer.running) {
                     hideTimer = <span class="category1">new</span> Timer(3000, 1);
                     hideTimer.addEventListener(
                          TimerEvent.TIMER_COMPLETE, <span class="category2">hide</span>);
                } <span class="category1">else</span> {
                     hideTimer.reset();
                }
               <span class="category2">visible</span> = <span class="category1">true</span>;
          }

         <span class="category1">public</span> <span class="category1">function</span> showEffectComplete():<span class="category1">void</span> {
               <span class="category1">if</span> (hideTimer != <span class="category1">null</span>) hideTimer.<span class="category2">start</span>();
          }

         <span class="category1">public</span> <span class="category1">function</span> <span class="category2">hide</span>(event:TimerEvent):<span class="category1">void</span> {
               <span class="category2">visible</span> = <span class="category1">false</span>;
          }

         <span class="category1">public</span> <span class="category1">function</span> hideEffectComplete():<span class="category1">void</span> {
               reservationTitles.<span class="category2">text</span> = "<span class="quote"></span>";
               hideTimer = <span class="category1">null</span>;
          }
    &lt;/mx:Script&gt;
    &lt;mx:hideEffect&gt;{hideDissolve}&lt;/mx:hideEffect&gt;
    &lt;mx:showEffect&gt;{showWipeDown}&lt;/mx:showEffect&gt;
    &lt;mx:WipeDown id="<span class="quote">showWipeDown</span>" effectEnd="<span class="quote">showEffectComplete()</span>"
<span class="category2">target</span>="<span class="quote">{this}</span>" /&gt;
    &lt;mx:Dissolve id="<span class="quote">hideDissolve</span>" effectEnd="<span class="quote">hideEffectComplete()</span>" <span class="category2">target</span>="<span class="quote">{this}</span>" /&gt;
    &lt;mx:Label id="<span class="quote">titleLabel</span>" <span class="category2">text</span>="<span class="quote">New Book Reservations</span>" fontWeight="<span class="quote">bold</span>" /&gt;
    &lt;mx:Text id="<span class="quote">reservationTitles</span>" /&gt;
...</pre>
</code>

</div></div>

<p>To test this, deploy the application and open both the user application and the admin application side by side (see Figure 27).</p>

<div class="ap_c"><a href="http://www.insideria.com/upload/2008/06/series20_figure27.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/06/series20_figure27.jpg" alt="series20_figure27.jpg" title="Click to enlarge" width="400"/></a><div class="apcaption">Figure 27. The user and admin applications</div></div>

<p>Browse for a few books and reserve them from the user side, and watch the notification come up on the admin side. Slick. And easy!</p>

<p>You can always find the entire series <a href="http://www.insideria.com/series-anatomy-flex.html">here</a>.</p>

]]>
      
    </content>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2017787</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2017787" />
    <title>Comment from Flexi on 2008-06-12</title>
    <author>
        <name>Flexi</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>Hi Tony,<br />
Just wanted to say that these articles, as good as they are, should all be upgraded to Flex 3.0. just have a look on all the comments people left on the 2nd entry... I think most of them stopped there. If the example code doesn't work... well, you know...<br />
</p>]]>
    </content>
    <published>2008-06-12T16:06:12Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2017788</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2017788" />
    <title>Comment from Tony Hillerson on 2008-06-12</title>
    <author>
        <name>Tony Hillerson</name>
        <uri>http://thillerson.blogspot.com</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://thillerson.blogspot.com">
        <![CDATA[<p>@Flexi - I totally agree, it's just an issue of timing. This "article", which is actually a serialization of an O'Reilly Shortcut, was written almost a year ago and serialized on this site. I haven't actually been writing these fresh each week.</p>

<p> I'd love to upgrade it, but it's an issue of time. I'll bring up your concerns, and thanks for reading until the end :)</p>]]>
    </content>
    <published>2008-06-12T16:18:20Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2017813</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2017813" />
    <title>Comment from Flexi on 2008-06-13</title>
    <author>
        <name>Flexi</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>No no... thank you, mate!<br />
I figured that that was the issue - time :)... well, no pain no gain, hmm?<br />
</p>]]>
    </content>
    <published>2008-06-13T10:39:01Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2018301</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2018301" />
    <title>Comment from Flexer on 2008-06-25</title>
    <author>
        <name>Flexer</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>Tony,</p>

<p>These articles are good but have basically nothing to do with enterprise flex, the title is very misleading.</p>

<p>Enterprise is not the same as somewhat large app and most of these patterns wouldn't apply to real enterprise systems. I am not sure where these ideas were confused along the way (in many developers heads) but the word enterprise means something and its casual use is making it harder for those of us trying to find real information on enterprise flex to actually find anything at all.</p>

<p>Pete</p>]]>
    </content>
    <published>2008-06-26T02:45:48Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2018302</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2018302" />
    <title>Comment from Tony Hillerson on 2008-06-25</title>
    <author>
        <name>Tony Hillerson</name>
        <uri>http://thillerson.blogspot.com</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://thillerson.blogspot.com">
        <![CDATA[<p>@Pete</p>

<p>What I meant by Enterprise was connecting to and loading data from a Java Enterprise Application Server, such as JBoss, and the development tasks that work with that environment.</p>

<p>As a dissenter, can you give us an idea of what you would have liked to have seen in this shortcut instead of or in addition to what's there?</p>

<p>Tony</p>]]>
    </content>
    <published>2008-06-26T02:53:16Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2019036</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2019036" />
    <title>Comment from TJ on 2008-07-18</title>
    <author>
        <name>TJ</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>@Pete</p>

<p>Please do share with is what you mean by your "Enterprise" complaint.  These articles show you the in and outs of building a real application that connects with and uses real backend services.  Moreover, it provides tons of great insight on how/which frameworks to be using in each of the various application layers.  What more could you possibly want.</p>

<p>Great articles!</p>]]>
    </content>
    <published>2008-07-18T17:22:17Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2054876</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2054876" />
    <title>Comment from Jasper on 2009-03-10</title>
    <author>
        <name>Jasper</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>Tony,<br />
Why didn't you ever make any attempt to clear up the mass confusion at the 2nd in the series. There was so many mistakes and things left out. Yet here you have time to discuss. It's a big time-waster.<br />
you know what they say: if it's worth doing...<br />
sorry</p>]]>
    </content>
    <published>2009-03-10T23:54:59Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2058792</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2058792" />
    <title>Comment from Vineet on 2009-05-03</title>
    <author>
        <name>Vineet</name>
        <uri>http://web.me.com/vineetb</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://web.me.com/vineetb">
        <![CDATA[<p>Tony,</p>

<p>Great series of articles! Extremely helpful for me as I am starting work on a new enterprise application using LCDS. The java service layer you described is very slim. In enterprise apps (specifically for data capture) there is a lot more which happen before anything gets to the DAO layer. For example server side validations, calculations and other business logic. These java service class would then delegate to assemblers and DAO. How would the data management be configured in case where we want things to go to java Service class first?</p>]]>
    </content>
    <published>2009-05-03T15:33:27Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2058808</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2058808" />
    <title>Comment from Tony Hillerson on 2009-05-03</title>
    <author>
        <name>Tony Hillerson</name>
        <uri>http://thillerson.blogspot.com</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://thillerson.blogspot.com">
        <![CDATA[<p>@Vineet - that's a good question. It always makes sense to put business validation on the server side in an SOA because you're not planning for any particular client and for any number of clients.</p>

<p>With a Flex application you have more facility for a good user experience with regards to validations and things like that, so in some cases it's pragmatic to catch some validations on the front end as well. It's up to you how you plan to cut down on any duplication in that regard. If it's simple email validation or something like that, duplication probably isn't a big deal. Complex business logic will require a robust error handling and message system to pass user friendly messages back to the front end. </p>

<p>Hope that answers your question. Of course this is a pretty simplistic application to show simply how to wire things up, but it's a start.</p>]]>
    </content>
    <published>2009-05-03T21:06:49Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23912-comment:2066350</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23912" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/06/anatomy-of-an-enterprise-flex-13.html#comment-2066350" />
    <title>Comment from sara on 2009-06-17</title>
    <author>
        <name>sara</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>alter anchor text each time please </p>

<p>administration work<br />
admin job<br />
admin jobs<br />
uk admin jobs<br />
administration career <br />
Sara<br />
<a href="http://administrationjobsuk.com/administration-work">administration job</a></p>]]>
    </content>
    <published>2009-06-17T12:28:34Z</published>
  </entry>

</feed
