<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2768688211378111189</id><updated>2012-03-08T02:18:55.181-08:00</updated><title type='text'>Michael D'Amour on Pentaho Platform Architecture</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2768688211378111189.post-5586987702037225451</id><published>2012-02-29T09:34:00.000-08:00</published><updated>2012-03-01T08:31:21.345-08:00</updated><title type='text'>Pentaho Admin/Enterprise Console in SUGAR</title><content type='html'>If you've grabbed a recent build of &lt;a href="http://ci.pentaho.com/job/BISERVER-CE/"&gt;SUGAR&lt;/a&gt; you'll notice some obvious changes to the UI as well as a top-level directory structure which is totally missing.  The "administration-console" (or "enterprise-console") folder has been removed.  We are actively working to integrate PAC/PEC functionality in the Pentaho User Console as an Administration &lt;a href="http://michaeldamour.blogspot.com/2011/10/puc-perspectives.html"&gt;perspective&lt;/a&gt;.&lt;BR&gt;&lt;BR&gt;The layout of the Administration perspective is defined in mantle.xul (pentaho/mantle/xul/mantle.xul).  This will allow the possibility of changing the UI and/or removing UI elements.  Presently, we have action-based security (ABS) and authentication (Pentaho/LDAP) implemented in this UI.  In the upcoming weeks we'll be adding other missing parts from the admin console such as email/auditing.&lt;BR/&gt;&lt;BR/&gt;Here's a recent screenshot of the Administration perspective:&lt;a href="http://1.bp.blogspot.com/-uZK1-7KMxkM/T0a6j2bVvkI/AAAAAAAABH4/huSZWBFQReo/s1600/admin.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-uZK1-7KMxkM/T0a6j2bVvkI/AAAAAAAABH4/huSZWBFQReo/s1600/admin.png" /&gt;&lt;/a&gt;&lt;BR/&gt;&lt;BR/&gt;&lt;H1&gt;How to Add New Admin Functionality&lt;/H1&gt;New functionality can be plugged into the admin perspective with a platform plugin.  The plugin.xml of a platform plugin will have a XUL overlay section to add an item to the admin category tree.  For example, if you want to add a new item to the "security" category you would do this to the plugin.xml:&lt;BR&gt;&lt;BR&gt;&amp;lt;overlays&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;overlay id="admin.perspective.overlay.ee"  resourcebundle="content/my-admin/resources/messages/messages"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;treechildren id="security"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;treeitem command="mantleXulHandler.loadAdminContent('my-admin-panel', 'api/repos/myadmin/resources/my-admin.html')"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;treerow&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;treecell label="${myadmin.label}" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/treerow&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/treeitem&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/treechildren&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/overlay&amp;gt;&lt;BR&gt;&amp;lt;/overlays&amp;gt;&lt;BR&gt;&lt;BR&gt;We are adding a new panel to the admin perspective with an ID of 'my-admin-panel' and we are specifying the location of the UI (by URL).  At this point you have adding your content to the admin category tree.  Just like any plugin, you can have back-end code in a JAR, eg my-admin/lib/my-admin-plugin.jar.&lt;BR&gt;Even more interesting is the new capability of a platform plugin to easily register its REST services in the plugin.spring.xml.  We're using Jersey (v1.12) for exposing these web services.  For reference take a look at the &lt;a href="svn://source.pentaho.org/svnroot/platform-plugins/echo-plugin/trunk"&gt;echo-plugin&lt;/a&gt;.&lt;BR&gt;&lt;BR&gt;&lt;H1&gt;Finishing the Job: JavaScript Integration&lt;/H1&gt;Whatever your choice of JavaScript library, you will be coexisting with PUC/admin perspective.  While not required, you can improve the user experience by registering your UI for state changes, etc.  To do this create an object with an id and activate/passivate methods.  For example:&lt;BR&gt;&lt;BR&gt;var myAdminPanel = {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id : "my-admin-panel",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;activate : function() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refreshConfig();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passivate : function(passivateCompleteCallback) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isConfigDirty()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passivateCallback = passivateCompleteCallback;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dijit.byId("saveChangesDialog").show();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passivateCompleteCallback(true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;};&lt;BR&gt;&lt;BR&gt;Now register this object with the admin perspective:&lt;BR&gt;window.top.mantle_registerSysAdminPanel(myAdminPanel);&lt;BR&gt;&lt;BR&gt;That's all there is too it, you will be notified when the user selects on/off of your panel so you can check for "dirty" and prompt for saving.&lt;BR&gt;&lt;BR&gt;&lt;H1&gt;REST services&lt;/H1&gt;In order to support the new admin functionality added to PUC, we added several new REST services which might be generally useful to OEMs, integrators, and developers.&lt;BR&gt;&lt;BR&gt;/pentaho/api/userrole/users&lt;BR&gt;Using GET, will return a list of all users in the system.&lt;BR&gt;&lt;BR&gt;/pentaho/api/userrole/roles&lt;BR&gt;Using GET, will return a list of all runtime roles in the system.&lt;BR&gt;&lt;BR&gt;/pentaho/api/userrole/roleAssignments&lt;BR&gt;Using PUT, will set role bindings between roles and permissions (logical roles)&lt;BR&gt;&lt;BR&gt;/pentaho/api/userrole/logicalRoleMap&lt;BR&gt;Using GET, will return the list of roles and the permissions (logical roles) which are assigned to them&lt;BR&gt;&lt;BR&gt;&lt;H2&gt;The following LDAP REST API calls are in the EE product&lt;/H2&gt;/pentaho/api/ldap/config/getAttributeValues&lt;BR&gt;Using GET, returns all name/value pairs from applicationContext-security-ldap.properties, plus the current securityProvider&lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/setAttributeValues&lt;BR&gt;Using PUT, sets (merges) name/value pairs and saves them to applicationContext-security-ldap.properties as well as set the authentication type in pentaho-spring-beans.xml.&lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/ldapTreeNodeChildren&lt;BR&gt;Using GET, returns the list of &lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/userTest&lt;BR&gt;Using GET, simple test if a user can be found.&lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/rolesTest&lt;BR&gt;Using GET, tests if search for a user returns roleAttribute successfully.&lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/userRolesTest&lt;BR&gt;Using GET, will perform a populator test (check if granted authorities for the given user works)&lt;BR&gt;&lt;BR&gt;/pentaho/api/ldap/config/providerTest&lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2768688211378111189-5586987702037225451?l=michaeldamour.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/5586987702037225451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://michaeldamour.blogspot.com/2012/02/pentaho-adminenterprise-console-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/5586987702037225451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/5586987702037225451'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/2012/02/pentaho-adminenterprise-console-in.html' title='Pentaho Admin/Enterprise Console in SUGAR'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-uZK1-7KMxkM/T0a6j2bVvkI/AAAAAAAABH4/huSZWBFQReo/s72-c/admin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2768688211378111189.post-1606791965340522279</id><published>2011-11-16T06:43:00.001-08:00</published><updated>2011-11-17T07:29:31.424-08:00</updated><title type='text'>Scheduling and Workspace in SUGAR</title><content type='html'>With the recent addition of &lt;a href="http://michaeldamour.blogspot.com/2011/10/puc-perspectives.html" target="_blank"&gt;perspectives &lt;/a&gt;to the Pentaho User Console (PUC) we opened up a whole new way to integrate with the BI platform. &amp;nbsp;This will go a long way for customers and OEMs who want to add (or remove) functionality from PUC. &amp;nbsp;Having said this, we are currently developing new perspectives for the SUGAR release. &amp;nbsp;Sean Flatley has been developing a PDI admin perspective (based on CDF). &amp;nbsp;There are also plans to create an admin perspective (or add to the PDI admin) to replace the admin console (PAC and PEC). &lt;br /&gt;&lt;br /&gt;Recently, I have been developing a total replacement for the PUC workspace, which was in dire need of TLC. When PDI added scheduling capabilities against our DI server, this was against a brand new scheduling system. &amp;nbsp;As of yet, we hadn't taken advantage of this in the BI server. &amp;nbsp;All of this changes in SUGAR, the old scheduler is completely removed, the new scheduler has taken over! &amp;nbsp;Rather than get our existing (pre-SUGAR) workspace to work against the new scheduler, we spent some time re-writing it. &amp;nbsp;The new workspace makes all scheduler interactions using REST. &amp;nbsp;This means that it will be easy for other developers to interact with the scheduler in their own interfaces.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Scheduling with REST&lt;/span&gt;&lt;br /&gt;I mainly wanted to highlight the new workspace in this post, but I figured there might be a fair amount of outside interest in learning about scheduling + REST. &amp;nbsp;We have held up our end of REST purity in that GET, POST and DELETE HTTP methods are used where appropriate. &amp;nbsp;Simple results are returned as text/plain, while complex state (such as a list of jobs) can be returned as either XML or JSON. &amp;nbsp;Whatever your client-side technology of choice is, you can set the "accept" HTTP header to instruct the server to return the desired type back. &amp;nbsp;For example,&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;myrequest.setHeader("accept", "application/json")&lt;/span&gt;&lt;/span&gt; will cause the scheduler REST service to return results back (if supported) as JSON.&lt;br /&gt;&lt;br /&gt;The URLs listed in the examples below assume that your BI server is running on "localhost" port 8080.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Scheduler State&lt;/span&gt;&lt;br /&gt;To get the state of the scheduler make a GET request to:&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/state&lt;br /&gt;&lt;br /&gt;The return type for this is text/plain and the result will be one of:&lt;br /&gt;RUNNING, PAUSED or STOPPED&lt;br /&gt;&lt;br /&gt;To control the state of the scheduler you must make a POST request. &amp;nbsp;In order to start or resume the scheduler as a whole:&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/start&lt;br /&gt;&lt;br /&gt;To pause the scheduler:&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/pause&lt;br /&gt;&lt;br /&gt;To shutdown the scheduler (must be rebooted after a shutdown):&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/shutdown&lt;br /&gt;&lt;br /&gt;Remember, these are POST requests, you cannot just paste the URL in a browser and expect them to work (would be a GET request this way).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Listing Jobs&lt;/span&gt;&lt;br /&gt;Since listing jobs does not change any state on the server, the request for getting the list of jobs is a GET.&lt;br /&gt;&lt;br /&gt;The following URL can be used as GET request and will return XML or JSON.&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/jobs&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Job State&lt;/span&gt;&lt;br /&gt;Like the scheduler itself,&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; we can&lt;/span&gt; interact with the running state of an individual job. &amp;nbsp;Getting the state of a specific job requires that you submit the jobId (which is given in the list jobs REST call). &amp;nbsp;You can only get the state of a job that you created (own), unless you have administration&amp;nbsp;privileges.&lt;br /&gt;&lt;br /&gt;To get the state of a job, the REST url is:&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/jobState&lt;br /&gt;&lt;br /&gt;You must submit JSON or XML wrapping the jobId. &amp;nbsp;For example, the JSON request payload:&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{"jobId":"joe:1685214344:1321154720424"}&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The request header for the "Content-Type" is also set:&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;myrequest.setHeader("Content-Type", "application/json"); &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The return type for this is text/plain and the result will be one of:&lt;br /&gt;NORMAL, PAUSED, COMPLETE, ERROR, BLOCKED or UNKNOWN&lt;br /&gt;&lt;br /&gt;Altering the state of a job is not much different than getting the state except that a POST request must be made. &amp;nbsp;The REST urls are:&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/resumeJob&lt;br /&gt;http://localhost:8080/pentaho/api/scheduler/pauseJob&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Triggering a Job Immediately&lt;/span&gt;&lt;br /&gt;To trigger the immediate execution of a job, you can invoke the triggerNow REST endpoint (POST) with the jobId wrapped with JSON or XML. &amp;nbsp;You must be authorized to execute the job in order to trigger it.&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Deleting a Job&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To remove a job from the scheduler, you can invoke the removeJob REST endpoint (DELETE) with the jobId wrapped with JSON or XML. &amp;nbsp;You must be authorized (job owner or admin) to delete the job from the scheduler.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Creating a New Job&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the most complex part of interacting with the scheduler. &amp;nbsp;In order to represent a new schedule, there are 3 "trigger" types, simple, complex and cron. &lt;br /&gt;&lt;br /&gt;I'm just going to give some examples rather than document every possible combination. &amp;nbsp;First, let's use a simple schedule, run the Inventory.prpt every 4 hours until December 31, 2012. &amp;nbsp;The JSON payload would be:&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;{"inputFile":"/public/pentaho-solutions/steel-wheels/reports/Inventory.prpt", "outputFile":null, "simpleJobTrigger":{"repeatInterval":14400, "repeatCount":-1, "startTime":"2011-11-16T00:00:00.000-05:00", "endTime":"2012-12-31T23:59:59.000-05:00"}}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The inputFile is the full path to the Inventory.prpt resource. &amp;nbsp;We're using a simple trigger, meaning that we don't worry about special recurrence patterns, we just want to run every 4 hours until the "endTime" has been reached. &amp;nbsp;The repeatInterval is 14400 seconds which equals 4 hours. &amp;nbsp;If you want to repeat a specific number of times until the trigger is no longer fired (in lieu of endTime) you can give a repeatCount. &amp;nbsp;A repeatCount of -1 means forever.&lt;br /&gt;&lt;br /&gt;Next, let's imagine we want to schedule the Produce Line Sales.prpt every Sunday at 2am with no end date.&lt;br /&gt;&lt;br /&gt;The REST endpoint is&amp;nbsp;http://localhost:8080/pentaho/api/scheduler/createJob. &amp;nbsp;The JSON payload would be something like this:&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;{"inputFile":"/public/pentaho-solutions/steel-wheels/reports/Product Line Sales.prpt", "outputFile":null, "complexJobTrigger":{"daysOfWeek":["0"], "startTime":"2011-11-16T02:00:00.000-05:00", "endTime":null}}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;/span&gt;Dissecting this, we can see the inputFile is set to the full path to the scheduled resource. &amp;nbsp;We are creating a "complex" job trigger with a recurrence pattern of "daysOfWeek" including just "0" meaning Sunday, the days range from 0-6. &amp;nbsp;If the trigger was going to be for multiple days of the week, this would be given as "daysOfWeek":["0","1"]" (for Sunday/Monday). &amp;nbsp;All times are in&amp;nbsp;ISO_8601 date format (this is true for dates coming out of the scheduler REST services as well). &amp;nbsp;The startTime specifies the "from" date and endTime refers to the date at which the schedule will no longer be run. &amp;nbsp;A null value for the endTime means it has no end.&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Another example, "The last Friday of every month at 4am" would have a JSON payload of:&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;{"inputFile":"/public/pentaho-solutions/steel-wheels/reports/Income Statement.prpt", "outputFile":null, "complexJobTrigger":{"weeksOfMonth":["4"], "daysOfWeek":["5"], "startTime":"2011-11-16T04:00:00.000-05:00", "endTime":null}}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Finally, a yearly schedule, "Every January 1st at midnight":&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;{"inputFile":"/public/pentaho-solutions/steel-wheels/reports/Invoice Statements.prpt", "outputFile":null, "complexJobTrigger":{"monthsOfYear":["0"], "daysOfMonth":["1"], "startTime":"2011-11-16T00:00:00.000-05:00", "endTime":null}}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; background-color: white; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;The Workspace&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;With all the REST details behind me now, I can finally cover some new UI work that I've been working on the past few weeks.  As I said before, the new workspace interacts with the server exclusively through REST web services, meaning that it is possible for someone with better UI skills to replace it (by removing the default one from the default-plugin/plugin.xml).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;The old workspace listed all content for each schedule, this was unbelievably unmanageable, it was also rather clunky when it came to starting/stopping/removing schedules and their output content.  It also lacked the ability to manage the scheduler as a whole (start/stop).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;The new workspace lists schedules (aka jobs), not content (output) from those jobs.  You can start/stop the entire scheduler or pause/resume individual jobs.  A human readable description of each schedule is provided.  Each column in the table view can be sorted.  If there are many schedules, the table will enter a "paging" mode.  If there are still too many schedules to find what you are looking for you can easily add a filter.  You can multi-select (with the help of CTRL or SHIFT keys) and manage many schedules at once.  Selected jobs can be triggered to run immediately, paused, resumed or removed permanently.  When you click on a cell in the file (resource) column you can view and manage (TBD) content from previous executions of that schedule.  &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-67gV6WKmggk/TsQWcJUaZrI/AAAAAAAABG8/gSdBFoFVrBc/s1600/workspacePause.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-67gV6WKmggk/TsQWcJUaZrI/AAAAAAAABG8/gSdBFoFVrBc/s1600/workspacePause.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;Workspace View showing multi-select "pause" (notice state of selected items)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KTUfoWH5KNs/TsQW7gjvEhI/AAAAAAAABHE/PQsmAPX84kg/s1600/filterdialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-KTUfoWH5KNs/TsQW7gjvEhI/AAAAAAAABHE/PQsmAPX84kg/s1600/filterdialog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;You can filter the list of jobs by file, state, user, schedule type and execution times&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZiXtz8_0Ocw/TsQXSjJp-mI/AAAAAAAABHU/05_3ll0UKgg/s1600/history.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ZiXtz8_0Ocw/TsQXSjJp-mI/AAAAAAAABHU/05_3ll0UKgg/s1600/history.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;Selecting a file link will show past execution history and allow content to be viewed.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-size-adjust: none; white-space: pre-wrap;"&gt;We're not done with the scheduling yet, but we've been making incredible progress.  We still need to finish (WIP) parameter support and define (TBD) what content management can be done from the history (generated content dialog).&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2768688211378111189-1606791965340522279?l=michaeldamour.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/1606791965340522279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://michaeldamour.blogspot.com/2011/11/scheduling-and-workspace-in-sugar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/1606791965340522279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/1606791965340522279'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/2011/11/scheduling-and-workspace-in-sugar.html' title='Scheduling and Workspace in SUGAR'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-67gV6WKmggk/TsQWcJUaZrI/AAAAAAAABG8/gSdBFoFVrBc/s72-c/workspacePause.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2768688211378111189.post-5022882020680293132</id><published>2011-11-01T07:16:00.000-07:00</published><updated>2011-11-01T07:24:05.101-07:00</updated><title type='text'>Plugin Overlays, PUC Layout</title><content type='html'>I was thinking about my previous post on &lt;a href="http://michaeldamour.blogspot.com/2011/10/puc-perspectives.html" target="_blank"&gt;PUC Perspectives&lt;/a&gt; and some of the things that were necessary to make that happen when it dawned on me that I hadn't really highlighted some really cool changes. &amp;nbsp;There are two primary changes that are worth talking about: &amp;nbsp;menubar and PUC layout.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Menubar&lt;/span&gt;&lt;br /&gt;The PUC menubar was a GWT menubar, standing not much different than it did in the proof-of-concept that I did back in March 2008. &amp;nbsp;James Dixon later extended upon this by adding the ability to define "menu customizations" through our plugin system. &amp;nbsp;What we really needed though was a total rewrite of the menu system but the prospect of making such a drastic change was never a priority. &amp;nbsp;Fortunately, we were able to justify the rewrite with the fact that without it, the capability of doing perspective overlays for the menubar were going to be pretty darn near impossible. &amp;nbsp;That is, without adding hacks upon existing hacks. &amp;nbsp;And so, the menubar was rewritten and XULified. &lt;br /&gt;&lt;br /&gt;We now have a main_menubar.xul which defines the content and layout of the main menubar. &amp;nbsp;This will make it MUCH easier for 3rd party/OEMs to add/remove/update any/all of the behavior of the menubar simply by tweaking the XUL file.&lt;br /&gt;&lt;br /&gt;This means that plugin.xml which used to contain "menu-items" will now use an overlay. &amp;nbsp;Most plugins which defined menu-items already had an overlay section to define toolbar tweaks. &amp;nbsp;The same overlay section is used for both menu and toolbar changes, for example,&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&amp;lt;overlay id="startup.analyzer" &amp;nbsp;resourcebundle="content/analyzer/resources/messages"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;    &amp;lt;toolbar id="mainToolbar"&amp;gt;&lt;br /&gt;      &amp;lt;toolbarbutton id="newAnalysisButton" image="../api/repos/xanalyzer/images/analyzer_toolbar_icon.png" onclick="mainToolbarHandler.openUrl('${tabName}','${tabName}','api/repos/xanalyzer/service/selectSchema')" tooltiptext="${openNewAnalyzerReport}" insertafter="dummyPluginContentButton"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/toolbar&amp;gt;&lt;br /&gt;    &amp;lt;menubar id="newmenu"&amp;gt;&lt;br /&gt;      &amp;lt;menuitem id="new-analyzer" label="${openNewAnalyzerReport}" command="mainMenubarHandler.openUrl('${tabName}','${tabName}','api/repos/xanalyzer/service/selectSchema')" /&amp;gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;br /&gt;      &amp;lt;/menubar&amp;gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;br /&gt;&amp;lt;/overlay&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are a few subtle differences here with pre-SUGAR overlay definitions. &amp;nbsp;I have fixed the annoying bug in the plugin system which required the nesting of an overlay inside of an overlay (simply due to XML parsing bug), for example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;overlay id="startup.analyzer" &amp;nbsp;resourcebundle="content/analyzer/resources/messages"&amp;gt;&lt;br /&gt;    &amp;lt;overlay id="startup.analyzer" &amp;nbsp;resourcebundle="content/analyzer/resources/messages"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another benefit is that overlays can have resource bundles associated with them, while the old menu-item section did not. &amp;nbsp;This allows us to localize the display strings in the menu system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;PUC Layout&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I was recently asked by James Dixon if it would be possible to update the entire layout of PUC with XUL. &amp;nbsp;I said we needed to get the story on our sprint backlog, which I ended up doing (&lt;a href="http://jira.pentaho.com/browse/BISERVER-6693"&gt;BISERVER-6693&lt;/a&gt;). &amp;nbsp;Instead of using XUL, which might be a barrier to entry for some customers/OEMs, a much easier solution to the PUC layout actually exists: &amp;nbsp;just use HTML. &amp;nbsp;What if the PUC layout existed in HTML and we just inject into various id's? &amp;nbsp;So, in SUGAR, I have done just this, the layout of PUC is based on DIV tags in the HTML (Mantle.jsp). &amp;nbsp;When PUC loads, it no longer "takes over" the page, it now looks for certain elements by id, such as "pucMenuBar" or "pucPerspectives" and then injects the widget at that location. &amp;nbsp;This will allow easier customization, for example, in SUGAR we have actually removed the "logo panel" from PUC itself. &amp;nbsp;With the DIV-based layout, we can easily add a logo panel back into the product by editing the HTML. &amp;nbsp;This is still a work in progress, the "pucContent" is very high-level and refers to the entire bottom section of PUC (explorer + content). &amp;nbsp;The next phase will be to define the layout even further, but we've taken steps towards this direction and what has been done is beyond concept, it's committed.&lt;br /&gt;&lt;br /&gt;The layout of PUC can be defined as something as simple as this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div id="puc" style="height: 100%"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;div id="pucTopBar" style="background-color: black; height: 28px"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div id="pucMenuBar" style="float: left"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;div id="pucPerspectives" style="float: right;"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;div id="pucToolBar" style="clear; both; float: left; width: 100%"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;div id="pucContent" style="clear: both; height: 100%; width: 100%"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2768688211378111189-5022882020680293132?l=michaeldamour.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/5022882020680293132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://michaeldamour.blogspot.com/2011/11/plugin-overlays-puc-layout.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/5022882020680293132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/5022882020680293132'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/2011/11/plugin-overlays-puc-layout.html' title='Plugin Overlays, PUC Layout'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2768688211378111189.post-2359690385272727633</id><published>2011-10-21T08:47:00.000-07:00</published><updated>2011-11-01T14:27:13.700-07:00</updated><title type='text'>PUC Perspectives</title><content type='html'>&lt;h1&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Pentaho User Console Perspective Documentation for Developers&lt;/span&gt;&lt;/h1&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;What is a perspective?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perspectives are a specialized mode added to the Pentaho User Console (PUC) for the next release of the suite (SUGAR). Active development is still very much underway, but I wanted to highlight this really cool new feature. &amp;nbsp;CI builds of Sugar are available at&amp;nbsp;&lt;a href="http://ci.pentaho.com/view/Sugar/"&gt;http://ci.pentaho.com/view/Sugar/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A perspective changes the&amp;nbsp;behavior and appearance of PUC by taking over certain areas of the interface.  The PUC main toolbar and main menubar&amp;nbsp;are now easily setup with XUL overlays.  The content area of PUC can also be completely owned by a perspective. &amp;nbsp;In this way, PUC can be dramatically customized. &amp;nbsp;Switching perspectives is done by clicking on them in the upper right hand corner.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EhYcUYb_7yA/TqGSJOZe8iI/AAAAAAAABFc/2f4nIfukCl0/s1600/perspectives.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-EhYcUYb_7yA/TqGSJOZe8iI/AAAAAAAABFc/2f4nIfukCl0/s1600/perspectives.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;How to register a perspective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From an API standpoint, registering a perspective with the system simply means adding the right objects to the&amp;nbsp;perspective manager.  There are two interfaces of concern here, IPluginPerspective and IPluginPerspectiveManager. &amp;nbsp;IPluginPerspectiveManager is added to pentahoObjects.spring.xml making it available through PentahoSystem.  The&amp;nbsp;easiest&amp;nbsp;way to add a perspective to the system is to simply add its definition to the plugin.xml of a plugin. &amp;nbsp;However, you are not constrained to this, you can register a new perspective through the API.  For example,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;IPluginPerspective perspective = new DefaultPluginPerspective();&lt;br /&gt;perspective.setId(..);&lt;br /&gt;perspective.setOverlays(..);&lt;br /&gt;etc.&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;IPluginPerspectiveManager manager = PentahoSystem.get(IPluginPerspectiveManager.class, getPentahoSession()); &lt;br /&gt;manager.addPluginPerspective(perspective);&lt;/pre&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;Implementing the interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Should you decide to implement your own perspective interfaces and replace ours, there are only a few interfaces&amp;nbsp;to concern yourself with.  The first thing you must do is replace the IPluginPerspectiveManager in&amp;nbsp;pentahoObjects.spring.xml, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;bean id="IPluginPerspectiveManager" class="com.yourcompany.BetterPerspectiveManager" scope="singleton" /&amp;gt;&lt;/pre&gt;&lt;br /&gt;Once you've done this, and your class is available to the system your plugin perspective manager will be used&amp;nbsp;to register perspectives.  PUC will use PentahoSystem to use your manager to list the available perspectives.&amp;nbsp;A perspective itself must extend IPluginPerspective, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class MyPluginPerspective extends IPluginPerspective {&lt;br /&gt; ..&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;This class is just a bean and provides:&lt;br /&gt;&lt;pre&gt;&lt;b&gt;id&lt;/b&gt; (unique perspective id)&lt;br /&gt;&lt;b&gt;title&lt;/b&gt; (name of the perspective shown in PUC)&lt;br /&gt;&lt;b&gt;content-url&lt;/b&gt; (the url of the page used to hijack PUC content area)&lt;br /&gt;&lt;b&gt;resourcebundle&lt;/b&gt; (the uri to a message bundle for localizing the title of the perspective)&lt;br /&gt;&lt;b&gt;overlays&lt;/b&gt; (xul overlays to apply to menu/toolbar of PUC)&lt;br /&gt;&lt;b&gt;layout-priority&lt;/b&gt; (used to control the order which perspectives show up in PUC, BI Browser is -1)&lt;br /&gt;&lt;b&gt;required-security-actions&lt;/b&gt; (action based security can be used to check if the user "isAllowed")&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;The easy way:  How to define perspectives in plugin.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The plugin system in Pentaho has been expanded to read perspective definitions from the plugin.xml of a plugin&amp;nbsp;in pentaho-solutions.  Any number of perspectives can be added to a single plugin.xml.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;plugin title="My Plugin" name="my-plugin"&amp;gt;&lt;br /&gt;  &amp;lt;perspective id="myperspective1" title="Perspective 1" layout-priority="1"&amp;gt;&lt;br /&gt;  &amp;lt;/perspective&amp;gt;&lt;br /&gt;  &amp;lt;perspective id="myperspective2" title="Perspective 2" layout-priority="2"&amp;gt;&lt;br /&gt;  &amp;lt;/perspective&amp;gt;&lt;br /&gt;...and so on&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;/pre&gt;&lt;br /&gt;If you want to localize the title of the perspective as it appears in PUC you'll need a resource bundle&amp;nbsp;accessible to PUC at runtime. The URI is specified on the perspective definition:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;perspective id="myperspective1" title="${title}" layout-priority="1" resourcebundle="content/default-plugin-perspective/resources/messages/messages"&amp;gt;&lt;br /&gt;&amp;lt;/perspective&amp;gt;&lt;/pre&gt;&lt;br /&gt;The plugin "default-plugin-perspective" is a folder in pentaho-solutions/system and contains a messages.properties file&amp;nbsp;located in 'default-plugin-perspective/resources/messages'. This can be made available by publishing a static-path&amp;nbsp;in the plugin config:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;static-paths&amp;gt;&lt;br /&gt; &amp;lt;static-path url="/default-plugin-perspective/resources" localFolder="resources"/&amp;gt;&lt;br /&gt;&amp;lt;/static-paths&amp;gt;&lt;/pre&gt;&lt;br /&gt;The string ${title} is replaced with whatever title means in the messages.properties file (or other localized&lt;br /&gt;bundles).&lt;br /&gt;&lt;br /&gt;As mentioned before, a perspective will takeover the content area of PUC when it is active.  The URL for this&amp;nbsp;is specified with the content-url attribute of the perspective.  For example:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&amp;lt;perspective .... content-url="content/default-plugin-perspective/resources/html/index.html"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When this perspective is made active, index.html is loaded in an iframe in the content area of PUC.&lt;br /&gt;&lt;br /&gt;Action based security may be used to lock perspectives down, for example, only show an "Admin" perspective to those&amp;nbsp;who are allowed to see it.  This is done using the existing action based security provided by the Pentaho platform. &amp;nbsp;The security action for administration is "org.pentaho.security.administerSecurity".  To specify this in the&amp;nbsp;perspective definition:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&amp;lt;perspective .... required-security-action="org.pentaho.security.administerSecurity"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In PUC, the order that the perspectives show up in the UI is controlled by a layout-priority attribute in the&amp;nbsp;perspective node.  The default perspective (BI Browser) has a value of -1.  If you want your perspective to appear&amp;nbsp;before this go with a lower number (such as -2).&lt;br /&gt;&lt;br /&gt;One of the most fundamental changes to PUC for the addition of perspectives was to completely replace the menu&amp;nbsp;system with a XUL approach.  We already had a XUL definition for the main toolbar, now there is a XUL definition&amp;nbsp;for the main menubar.  This file is webapps/pentaho/mantle/xul/main_menubar.xul.  You can further customize PUC&amp;nbsp;by changing this XUL file.  What we are interested for the purpose of perspectives is the ability to modify the&amp;nbsp;toolbar and menubar with XUL overlays.  A perspective can provide any number of XUL overlays which are used to&amp;nbsp;add/remove/update items to the toolbar or menubar.  Here is a simple example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;perspective&amp;gt;&lt;br /&gt; &amp;lt;overlay id="myoverlay"  resourcebundle="content/default-plugin-perspective/resources/messages/messages"&amp;gt;&lt;br /&gt;        &amp;lt;toolbar id="mainToolbar"&amp;gt;&lt;br /&gt;            &amp;lt;toolbarbutton id="mybuttonid" image="../content/default-plugin-perspective/resources/images/enabled32.png" onclick="mainToolbarHandler.executeMantleFunc('defaultTestPerspectiveFunction();')" tooltiptext="${mybutton}"  insertafter="dummyPluginContentButton"/&amp;gt;&lt;br /&gt;        &amp;lt;/toolbar&amp;gt;   &lt;br /&gt; &amp;lt;/overlay&amp;gt;&lt;br /&gt;&amp;lt;/perspective&amp;gt;&lt;/pre&gt;&lt;br /&gt;This XUL overlay will add a button to the main toolbar with a given image, title, tooltip, insertion point, etc. &amp;nbsp;Menu items can be added anywhere in the menu system in a similar way:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;perspective&amp;gt;&lt;br /&gt; &amp;lt;overlay id="myoverlay"  resourcebundle="content/default-plugin-perspective/resources/messages/messages"&amp;gt;&lt;br /&gt;  &amp;lt;menubar id="mainMenubar"&amp;gt;&lt;br /&gt;   &amp;lt;menubar id="newmenu"&amp;gt;&lt;br /&gt;    &amp;lt;menuitem id="mymenuitemid" label="${mymenuitemlabel}" command="mainMenubarHandler.executeMantleFunc('defaultTestPerspectiveFunction();')" /&amp;gt;  &lt;br /&gt;   &amp;lt;/menubar&amp;gt; &lt;br /&gt;  &amp;lt;/menubar&amp;gt; &lt;br /&gt; &amp;lt;/overlay&amp;gt;&lt;br /&gt;&amp;lt;/perspective&amp;gt;&lt;/pre&gt;&lt;br /&gt;This will add a menuitem under the File -&amp;gt; New menu.  You can actually add an entirely new menu if needed. &amp;nbsp;This&amp;nbsp;can be done by giving a more complete definition in the XUL:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;menubar id="mainMenubar"&amp;gt;&lt;br /&gt; &amp;lt;menubar id="mymenu" label="${mymenu}" layout="vertical" insertafter="toolsmenu"&amp;gt;&lt;br /&gt;  &amp;lt;menuitem id="mymenuitem" label="mymenuitem" js-command="alert('Item Clicked')" /&amp;gt;  &lt;br /&gt; &amp;lt;/menubar&amp;gt;&lt;br /&gt;&amp;lt;/menubar&amp;gt;&lt;/pre&gt;&lt;br /&gt;When a perspective is active, its overlays will be in play, likewise, when it becomes inactive, its overlays are&amp;nbsp;removed.  It is possible for a perspective's overlays to make permanent changes to the UI, instead of just when&amp;nbsp;it is active.  This is done simply by convention, an overlay whose "id" starts with "sticky" or "startup" will&amp;nbsp;be active even when the perspective is not.  Typically, you would create two overlays for a perspective, one&amp;nbsp;for changes to apply when the perspective is active and another to apply because the plugin exists.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&amp;lt;overlay id="sticky.myoverlay"  resourcebundle="content/default-plugin-perspective/resources/messages/messages"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;...&lt;/pre&gt;&lt;br /&gt;This overlay will be applied regardless of the active state of the perspective.&lt;br /&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;Interactivity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is now possible to more easily interact with the main menubar and toolbar with JavaScript.  If your content-url&amp;nbsp;points to an HTML page you can use JavaScript to enable/disable any menu item or toolbar button&lt;br /&gt;&lt;br /&gt;To read the state (enabled/disabled) of a toolbar button:&lt;br /&gt;&lt;pre&gt;var enabled = window.top.mantle_isToolbarButtonEnabled("button.id");&lt;/pre&gt;&lt;br /&gt;To set the state of a toolbar button:&lt;br /&gt;&lt;pre&gt;var enabled = true; // or false&lt;br /&gt;window.top.mantle_setToolbarButtonEnabled("button.id", enabled);&lt;/pre&gt;&lt;br /&gt;To read the state of a menu item:&lt;br /&gt;&lt;pre&gt;var enabled = window.top.mantle_isMenuItemEnabled('menuitem.id'))&lt;/pre&gt;&lt;br /&gt;To set the state of a menu item:&lt;br /&gt;&lt;pre&gt;window.top.mantle_setMenuItemEnabled('menuitem.id', enabled)&lt;/pre&gt;&lt;br /&gt;We have also made it easier to bridge between the XUL/GWT world for defining what happens when you press a button&amp;nbsp;or select a menu item.  Of course, there are the existing techniques, referencing the handler and a bound function&amp;nbsp;to invoke a well known PUC command, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;toolbarbutton .. onclick="mainToolbarHandler.executeMantleCommand('SaveCommand')" /&amp;gt;&lt;br /&gt;&amp;lt;menuitem .. command="mainMenubarHandler.executeMantleCommand('OpenFileCommand')" /&amp;gt;  &lt;/pre&gt;&lt;br /&gt;If you want to invoke arbitrary JavaScript with a toolbarbutton or menuitem, you can alternatively define a&lt;br /&gt;js-command attribute in the XUL definition.  For example: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;menuitem .. js-command="alert('Hello Perspective')" /&amp;gt;  &lt;/pre&gt;&lt;br /&gt;When the menu item is pressed the JavaScript alert function will pop a message saying "Hello Perspective". In this&amp;nbsp;way, we can invoke JavaScript functions defined by the page living at the content-url.  Since we are crossing&amp;nbsp;the boundaries of iframes and we don't necessarily know where to call the function, we always eval the JavaScript&amp;nbsp;as it is provided to us.  What this means is that you should define any functions you want visible to the toolbar&amp;nbsp;buttons or menu items at the "top" window.  An example of this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; window.top.myPerspectiveFunction = function() {&lt;br /&gt;  alert('Success!');&lt;br /&gt; }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;To invoke this function from a toolbar button or menu item:&lt;br /&gt;&lt;pre&gt;&amp;lt;menuitem .. js-command="myPerspectiveFunction()" /&amp;gt;&lt;/pre&gt;&lt;pre&gt;  &lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;Update: 11/1/2011&lt;br /&gt;We have added activation/deactivation hooks, if the document (content-url) contains javascript functions "perspectiveActivated" and "perspectiveDeactivated" then we the perspective system will invoke them at the appropriate time.  This can be used for any purpose you see fit, practically however, this was created to allow the persistence of perspective state that might otherwise be lost.  For example, when a perspective is activated (or reactivated) we can restore the toolbar state (buttons enbabled/disabled).  Without the behavior, the XUL overlays are reapplied from the beginning without knowledge of any application state. An example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; &lt;br /&gt;  var testButtonEnabled = true; &lt;br /&gt;  &lt;br /&gt;  perspectiveActivated = function() {&lt;br /&gt;    window.top.mantle_setToolbarButtonEnabled('some.button.id', testButtonEnabled);&lt;br /&gt;  }  &lt;br /&gt;  &lt;br /&gt;  perspectiveDeactivated = function() {&lt;br /&gt;    testButtonEnabled = window.top.mantle_isToolbarButtonEnabled('some.button.id');&lt;br /&gt;  }  &lt;br /&gt;  &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;This example has been checked in along with the existing sample plugin perspective.&lt;br /&gt;&lt;br /&gt;Additional JavaScript interaction has been added as well. &amp;nbsp;You can get a list of perspectives (array of perspective ids) and activate a perspective by id. &amp;nbsp;Example use:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;window.top.mantle_getPerspectives()&lt;/pre&gt;and&lt;br /&gt;&lt;pre&gt;window.top.mantle_setPerspective(id)&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;Sample Perspective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many of the features and functionality discussed here are available as a self-documenting sample plugin perspective&amp;nbsp;located in pentaho-solutions/system/default-plugin-perspective/plugin.xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2768688211378111189-2359690385272727633?l=michaeldamour.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/2359690385272727633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://michaeldamour.blogspot.com/2011/10/puc-perspectives.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/2359690385272727633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/2359690385272727633'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/2011/10/puc-perspectives.html' title='PUC Perspectives'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-EhYcUYb_7yA/TqGSJOZe8iI/AAAAAAAABFc/2f4nIfukCl0/s72-c/perspectives.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2768688211378111189.post-7031110605485213235</id><published>2011-10-13T08:46:00.000-07:00</published><updated>2011-11-15T11:21:15.122-08:00</updated><title type='text'>Platform Update - Consolidation &amp; Cleanup</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;I wanted to take a few minutes to detail the progress in the platform projects.  As most of you know, we have gone through a round of project consolidation in the platform.  The new projects are as follows:&lt;br /&gt;&lt;br /&gt;===================================================&lt;br /&gt;api - unchanged&lt;br /&gt;&lt;br /&gt;core &lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;- bi-platform-engine-core&lt;br /&gt;   - bi-platform-engine-security&lt;br /&gt;   - bi-platform-engine-services&lt;br /&gt;   - bi-platform-test-foundation&lt;br /&gt;   - bi-platform-ui-foundation&lt;br /&gt;   - bi-platform-util&lt;br /&gt;   - bi-platform-security-userroledao&lt;br /&gt;&lt;br /&gt;The engine-* projects had previously enjoyed a GPL license, this remains unchanged, however, the license the projects brought into the core is now GPL if not already.&lt;br /&gt;&lt;br /&gt;repository - relatively unchanged (this is the JCR)&lt;br /&gt;&lt;br /&gt;scheduler - we have dropped the old scheduler, scheduler2 takes over&lt;br /&gt;&lt;br /&gt;extensions&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;- bi-platform-web&lt;br /&gt;         - bi-platform-web-servlet&lt;br /&gt;         - bi-platform-plugin-actions&lt;br /&gt;         - bi-platform-plugin-services&lt;br /&gt;              &lt;br /&gt;user-console - though future plans for mantle include making it a plugin, it is out of the old bi-platform-v2/trunk and renamed&lt;br /&gt;&lt;br /&gt;assembly &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;- bi-platform-appserver&lt;br /&gt;       - bi-platform-assembly&lt;br /&gt;       - bi-platform-build&lt;br /&gt;       - bi-platform-sample-data&lt;br /&gt;       - bi-platform-sample-solution&lt;br /&gt;            &lt;br /&gt;We have also removed several projects, such as portlet, legacy, and test-solution.&lt;br /&gt;&lt;br /&gt;The dependency order is also, as I have listed the projects:&lt;br /&gt;api, core, repository, scheduler, extensions, user-console&lt;br /&gt;===================================================&lt;br /&gt;&lt;br /&gt;All of the new projects produce new ivy artifacts, as to not overwrite anything already in artifactory.  We have incorporated changes to subfloor allowing the publishing of test jars.  For example, the core project's test-src contains classes essential for testing in many downstream projects.&lt;br /&gt;&lt;br /&gt;api  - pentaho-platform-api.jar&lt;br /&gt;core:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;- pentaho-platform-core.jar&lt;br /&gt;   - pentaho-platform-core-test.jar (BaseTest and friends)&lt;br /&gt;repository: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;- pentaho-platform-repository.jar&lt;br /&gt;         - pentaho-platform-repository-test.jar&lt;br /&gt;scheduler - pentaho-platform-scheduler.jar&lt;br /&gt;extensions - pentaho-platform-extensions.jar&lt;br /&gt;user-console - pentaho-user-console.jar (typically resolved is the package/zip)&lt;br /&gt;&lt;br /&gt;With the introduction of the JCR the notion of "solution" "path" "name" goes away and we simply have a single path to the resource "/path/to/the/resource". I have modified the API of SolutionEngine so that it only accepts this single path element and fixed all (known) downstream implications.&lt;br /&gt;&lt;br /&gt;Unit tests are in outstanding shape right now and cobertura coverage is being published.  I spent 2 days doing nothing but getting unit tests working again.  Many of the unit tests which are now working have not been working since 2009 (some even earlier than that).  Plenty of unit tests were commented out, where possible, I have uncommented these and they are now working.  The unit test summary:&lt;br /&gt;&lt;br /&gt;core - 100% unit test pass&lt;br /&gt;repository - 100% unit test pass&lt;br /&gt;scheduler - 100% unit test pass&lt;br /&gt;extensions - out of 406 unit tests, 5 are failing, these failures are the real deal, they warrant investigation (they might have caught something)&lt;br /&gt;&lt;br /&gt;So for the entire BI platform, there are only 5 unit tests which are failing!  We're going to watch these projects carefully and keep the unit tests passing (and squash any failures). Over time we'll be adding new tests, and increasing the code coverage.&lt;br /&gt;&lt;br /&gt;The assembly has been dramatically cleaned up and simplified.  The assembly project does not require the checkout of any other projects, it has all the resources required to lay down the solutions, data, appserver, etc as well as ivy dependencies on package archives of other projects.  You can simply checkout the assembly project, run an ant build and a BI-SERVER build will be created.&lt;br /&gt;&lt;br /&gt;CI is running jobs for each of the new projects with the new build order in place.  These can be seen in the SUGAR grouping:&lt;br /&gt;&lt;a href="http://ci.pentaho.com/view/Sugar/" target="_blank"&gt;http://ci.pentaho.com/view/Sugar/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lastly, I have officially "closed" bi-platform-v2/trunk the new location in SVN for these projects is:&lt;br /&gt;svn://source.pentaho.org/svnroot/pentaho-platform/trunk&lt;br /&gt;The bi-platform-v2/trunk has been renamed as trunk-closed to further discourage any checkins to the wrong location.&lt;br /&gt;&lt;br /&gt;Any SUGAR development and 4.1/4.5 fixes should be incorporated in the new project structure (though the project names have remained the same, using the summary I listed above you can easily find where to checkin).&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2768688211378111189-7031110605485213235?l=michaeldamour.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michaeldamour.blogspot.com/feeds/7031110605485213235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://michaeldamour.blogspot.com/2011/10/platform-update-consolidation-cleanup.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/7031110605485213235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2768688211378111189/posts/default/7031110605485213235'/><link rel='alternate' type='text/html' href='http://michaeldamour.blogspot.com/2011/10/platform-update-consolidation-cleanup.html' title='Platform Update - Consolidation &amp; Cleanup'/><author><name>Michael D'Amour</name><uri>http://www.blogger.com/profile/04545094117910843294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
