[jboss-svn-commits] JBL Code SVN: r10468 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms and 21 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 23 06:49:24 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-03-23 06:49:23 -0400 (Fri, 23 Mar 2007)
New Revision: 10468

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/ServiceImplementation.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/BRMSRepositoryConfiguration.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/RulesRepositoryManager.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/TestEnvironmentSessionHelper.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTRemoteServiceServlet.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapter.java
   labs/jbossrules/trunk/drools-jbrms/src/main/resources/seam.properties
   labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/components.xml
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/BRMSRepositoryConfigurationTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/RulesRepositoryDecoratorTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/util/GWTNoSeamTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/AnotherService.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapterTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/MyServiceThingie.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/SubServiceThingie.java
Removed:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/SessionHelper.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/TestHarnessJBRMSServiceServlet.java
Modified:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/JBRMS.gwt.xml
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/categorynav/CategoryExplorerWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/FactTemplateWizard.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/JBRMS.css
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/RepositoryManager.java
   labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/web.xml
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/FileUploadServletTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/PopulateDataTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
Log:
JBRULES-649

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/JBRMS.gwt.xml
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/JBRMS.gwt.xml	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/JBRMS.gwt.xml	2007-03-23 10:49:23 UTC (rev 10468)
@@ -7,7 +7,7 @@
 	<!-- <entry-point class='org.drools.brms.client.JBRMS'/> -->
 	<entry-point class='org.drools.brms.client.JBRMSEntryPoint'/>
   
-	<servlet path="/jbrmsService" class="org.drools.brms.server.JBRMSServiceServlet" />  
+	<servlet path="/jbrmsService" class="org.jboss.seam.remoting.gwt.GWTRemoteServiceServlet" />  
     <servlet path="/fileManager" class="org.drools.brms.server.FileUploadServlet"/>
     
 </module>

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/categorynav/CategoryExplorerWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/categorynav/CategoryExplorerWidget.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/categorynav/CategoryExplorerWidget.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -52,6 +52,7 @@
      */
     public void refresh() {
         navTreeWidget.removeItems();
+        selectedPath = null;
         loadInitialTree();
     }
 
@@ -163,5 +164,9 @@
             super( "Please wait..." );
         }
     }
+    
+    public String getSelectedPath() {
+        return this.selectedPath;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/FactTemplateWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/FactTemplateWizard.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/FactTemplateWizard.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -79,7 +79,7 @@
      * This will return a text version of the template to add in.
      */
     public String getTemplateText() {
-        String result = "template \"" + name.getText() + "\"\n"; 
+        String result = "template " + name.getText() + "\n"; 
         for (int i = 0; i < attributes.getRowCount(); i++) {
             ListBox type = (ListBox) attributes.getWidget( i, 1 );
             String typeName = type.getItemText( type.getSelectedIndex() );

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/JBRMS.css
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/JBRMS.css	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/JBRMS.css	2007-03-23 10:49:23 UTC (rev 10468)
@@ -1,3 +1,6 @@
+/* Edited with EditCSS */
+/**** LINK-tag style sheet JBRMS.css ****/
+
 body {
   background-color: white;
   color: black;
@@ -11,11 +14,11 @@
 }
 
 a {
-  color: darkblue;
+  color: black;
 }
 
 a:visited {
-  color: darkblue;
+  color: black;
 }
 
 .gwt-BorderedPanel {
@@ -527,3 +530,4 @@
   border: 1px solid #B8B8B8;
 } 
 
+

Deleted: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -1,611 +0,0 @@
-package org.drools.brms.server;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.jcr.RepositoryException;
-import javax.servlet.http.HttpSession;
-
-import org.apache.log4j.Logger;
-import org.drools.brms.client.common.AssetFormats;
-import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
-import org.drools.brms.client.rpc.MetaData;
-import org.drools.brms.client.rpc.PackageConfigData;
-import org.drools.brms.client.rpc.RepositoryService;
-import org.drools.brms.client.rpc.RuleAsset;
-import org.drools.brms.client.rpc.SnapshotInfo;
-import org.drools.brms.client.rpc.TableConfig;
-import org.drools.brms.client.rpc.TableDataResult;
-import org.drools.brms.client.rpc.TableDataRow;
-import org.drools.brms.client.rpc.ValidatedResponse;
-import org.drools.brms.server.contenthandler.ContentHandler;
-import org.drools.brms.server.rules.SuggestionCompletionLoader;
-import org.drools.brms.server.util.MetaDataMapper;
-import org.drools.brms.server.util.RepositoryManager;
-import org.drools.brms.server.util.TableDisplayHandler;
-import org.drools.repository.AssetHistoryIterator;
-import org.drools.repository.AssetItem;
-import org.drools.repository.AssetItemIterator;
-import org.drools.repository.CategoryItem;
-import org.drools.repository.PackageItem;
-import org.drools.repository.RulesRepository;
-import org.drools.repository.RulesRepositoryException;
-import org.drools.repository.StateItem;
-import org.drools.repository.VersionableItem;
-
-import com.google.gwt.user.client.rpc.SerializableException;
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.server.rpc.RemoteServiceServlet;
-
-/** 
- * This is the implementation of the repository service to drive the GWT based front end.
- * TODO: refactor this to use "Action" pattern or SSB pattern for 
- * transaction demarcation.
- * 
- * @author Michael Neale
- */
-public class JBRMSServiceServlet extends RemoteServiceServlet
-    implements
-    RepositoryService {
-
-
-    private static final long serialVersionUID = 3150768417428383474L;
-    private static final DateFormat dateFormatter = DateFormat.getInstance();
-    private static final Logger log = Logger.getLogger( JBRMSServiceServlet.class );
-
-    private MetaDataMapper metaDataMapper;
-
-    
-    public String[] loadChildCategories(String categoryPath) {
-
-        CategoryItem item = getRulesRepository().loadCategory( categoryPath );
-        List children = item.getChildTags();
-        String[] list = new String[children.size()];
-        for ( int i = 0; i < list.length; i++ ) {
-            list[i] = ((CategoryItem) children.get( i )).getName();
-        }
-        return list;
-
-    }
-
-    public Boolean createCategory(String path,
-                                  String name,
-                                  String description) {
-        log.info( "CREATING cateogory: [" + name + "] in path [" + path + "]" );
-        if (path == null || "".equals(path)) {
-            path = "/";        
-        }
-        RulesRepository repo = getRulesRepository();
-        CategoryItem item = repo.loadCategory( path );
-        item.addCategory( name, description );
-        repo.save();
-        return Boolean.TRUE;
-    }
-    
-    
-    /**
-     * This will create a new asset. It will be saved, but not checked in.
-     * The initial state will be the draft state.
-     */
-    public String createNewRule(String ruleName,
-                                 String description,
-                                 String initialCategory,
-                                 String initialPackage,
-                                 String format) throws SerializableException {    
-        log.info( "CREATING new asset name [" + ruleName + "] in package [" + initialPackage + "]" );
-        try {
-            RulesRepository repo = getRulesRepository();
-            PackageItem pkg = repo.loadPackage( initialPackage );
-            AssetItem asset = pkg.addAsset( ruleName, description, initialCategory, format );
-            
-            applyPreBuiltTemplates( ruleName,
-                                    format,
-                                    asset );
-            repo.save();
-            
-            
-            return asset.getUUID();
-        } catch (RulesRepositoryException e) {
-            throw new SerializableException(e.getMessage());
-        }
-
-    }
-
-    /**
-     * For some format types, we add some sugar by adding a new template.
-     */
-    private void applyPreBuiltTemplates(String ruleName,
-                                        String format,
-                                        AssetItem asset) {
-        if (format.equals( AssetFormats.DSL_TEMPLATE_RULE )) {
-            asset.updateContent( "when\n\nthen\n" );
-        } else if (format.equals( AssetFormats.FUNCTION )) {
-            asset.updateContent( "function " + ruleName + "(<args here>)\n\n\nend" );
-        } else if (format.equals( AssetFormats.DSL )) {
-            asset.updateContent( "[when]Condition sentence template {var}=" +
-                    "rule language mapping {var}\n" +
-                    "[then]Action sentence template=rule language mapping");
-        }
-    }
-
-    public PackageConfigData[] listPackages() {
-        Iterator pkgs = getRulesRepository().listPackages();
-        List result = new ArrayList();
-        while(pkgs.hasNext()) {
-            PackageItem pkg = (PackageItem) pkgs.next();
-
-            PackageConfigData data = new PackageConfigData();
-            data.uuid = pkg.getUUID();
-            data.name = pkg.getName();
-            
-            result.add( data );
-        }
-        Collections.sort( result, new Comparator() {
-
-            public int compare(Object o1,
-                               Object o2) {
-                PackageConfigData d1 = (PackageConfigData) o1;
-                PackageConfigData d2 = (PackageConfigData) o2;
-                return d1.name.compareTo( d2.name );
-            }
-            
-        });
-        PackageConfigData[] resultArr = (PackageConfigData[]) result.toArray( new PackageConfigData[result.size()] );
-
-        return resultArr;
-    }
-
-    
-
-
-
-
-    public TableDataResult loadRuleListForCategories(String categoryPath) throws SerializableException {
-        long start = System.currentTimeMillis();
-        RulesRepository repo = getRulesRepository();
-
-        List list = repo.findAssetsByCategory( categoryPath );
-        TableDisplayHandler handler = new TableDisplayHandler();
-        System.out.println("time for load: " + (System.currentTimeMillis() - start) );
-        return handler.loadRuleListTable( list.iterator(), -1 );
-        
-    }
-
-    public TableConfig loadTableConfig(String listName) {
-        TableDisplayHandler handler = new TableDisplayHandler();
-        return handler.loadTableConfig(listName);
-        
-    }
-
-
-    
-    /** Get the rule repository for the "current" user */
-    RulesRepository getRulesRepository() {
-        RepositoryManager helper = new RepositoryManager();
-        return helper.getRepositoryFrom( getSession() );
-    }
-
-    private HttpSession getSession() {
-        return this.getThreadLocalRequest().getSession();
-    }
-
-
-
-
-
-
-
-    /**
-     * This actually does the hard work of loading up an asset based
-     * on its format.
-     */
-    public RuleAsset loadRuleAsset(String uuid) throws SerializableException {
-        RulesRepository repo = getRulesRepository();
-        AssetItem item = repo.loadAssetByUUID( uuid );
-        RuleAsset asset = new RuleAsset();
-        asset.uuid = uuid;
-
-        
-        //load standard meta data
-        asset.metaData = populateMetaData( item );
-        
-        // get package header
-        PackageItem pkgItem = repo.loadPackage( asset.metaData.packageName );
-        String header = pkgItem.getHeader();
-
-        //load the content
-        ContentHandler handler = ContentHandler.getHandler( asset.metaData.format );
-        handler.retrieveAssetContent(asset, pkgItem, item);
-        
-        return asset;
-    }
-    
-
-    /** 
-     * read in the meta data, populating all dublin core and versioning stuff.
-     */
-    MetaData populateMetaData(VersionableItem item) {
-        MetaData meta = new MetaData();
-        
-        meta.status = (item.getState() != null) ? item.getState().getName() : "";
-
-        getMetaDataMapper().copyToMetaData( meta, item );
-        
-        meta.createdDate = calendarToDate(item.getCreatedDate());
-        meta.lastModifiedDate = calendarToDate( item.getLastModified() );
-        
-        return meta;
-    }
-    
-    /**
-     * Populate meta data with asset specific info.
-     */
-    MetaData populateMetaData(AssetItem item) {
-        MetaData meta = populateMetaData( (VersionableItem ) item);
-        meta.packageName = item.getPackageName();
-        
-        List cats = item.getCategories();
-        meta.categories = new String[cats.size()];
-        for ( int i = 0; i < meta.categories.length; i++ ) {
-            CategoryItem cat = (CategoryItem) cats.get(i);
-            meta.categories[i] = cat.getFullPath();          
-        }
-        meta.dateEffective = calendarToDate( item.getDateEffective() );
-        meta.dateExpired = calendarToDate( item.getDateExpired() );
-        return meta;
-        
-    }
-
-    private Date calendarToDate(Calendar createdDate) {
-        if (createdDate == null) return null;
-        return createdDate.getTime();
-    }
-    
-    private Calendar dateToCalendar(Date date) {
-        if (date == null) return null;
-        Calendar cal = Calendar.getInstance();
-        cal.setTime( date );
-        return cal;
-    }    
-
-    private MetaDataMapper getMetaDataMapper() {
-        if (this.metaDataMapper == null)  this.metaDataMapper = new MetaDataMapper();
-        return this.metaDataMapper;
-    }
-
-    public String checkinVersion(RuleAsset asset) throws SerializableException {  
-        log.info( "CHECKING IN asset: [" + asset.metaData.name + "] UUID: [" + asset.uuid + "]");
-        RulesRepository repo = getRulesRepository();
-        
-        AssetItem repoAsset = repo.loadAssetByUUID( asset.uuid );
-        
-        MetaData meta = asset.metaData;
-        
-        getMetaDataMapper().copyFromMetaData( meta, repoAsset );
-        
-        repoAsset.updateDateEffective( dateToCalendar( meta.dateEffective ) );
-        repoAsset.updateDateExpired( dateToCalendar( meta.dateExpired ) );        
-        
-        
-        repoAsset.updateCategoryList( meta.categories );
-        ContentHandler handler = ContentHandler.getHandler( repoAsset.getFormat() );//new AssetContentFormatHandler();
-        handler.storeAssetContent( asset, repoAsset );
-        
-        repoAsset.checkin( meta.checkinComment );
-
-        
-        return repoAsset.getUUID();
-    }
-
-    public TableDataResult loadAssetHistory(String uuid) throws SerializableException {
-        
-        List result = new ArrayList();
-        RulesRepository repo = getRulesRepository();
-        AssetItem item = repo.loadAssetByUUID( uuid );
-        AssetHistoryIterator it = item.getHistory();
-
-        while ( it.hasNext() ) {
-            AssetItem historical = (AssetItem) it.next();//new AssetItem(repo, element);
-            long versionNumber = historical.getVersionNumber();
-            if (! (versionNumber == 0) 
-                            && ! (versionNumber == item.getVersionNumber() ))
-                {
-                TableDataRow row = new TableDataRow();
-                    row.id = historical.getVersionSnapshotUUID();
-                    row.values = new String[4];
-                    row.values[0] = Long.toString( historical.getVersionNumber());
-                    row.values[1] = historical.getCheckinComment();                
-                    row.values[2] = dateFormatter.format( historical.getLastModified().getTime() );
-                    row.values[3] = historical.getStateDescription();
-                    result.add( row );                    
-            }
-        }
-
-        
-        
-        if (result.size() == 0) return null;
-        TableDataResult table = new TableDataResult();
-        table.data = (TableDataRow[]) result.toArray(new TableDataRow[result.size()]);
-        
-        return table;
-    }
-
-    public void restoreVersion(String versionUUID,
-                                 String assetUUID,
-                                 String comment) {
-        
-        
-        RulesRepository repo = getRulesRepository();    
-        AssetItem old = repo.loadAssetByUUID( versionUUID );
-        AssetItem head = repo.loadAssetByUUID( assetUUID );
-        log.info( "RESTORE of asset: [" + head.getName() + "] UUID: [" + head.getUUID() + "] with historical version number: [" + old.getVersionNumber() );
-        repo.restoreHistoricalAsset( old, 
-                                     head, 
-                                     comment );
-        
-    }
-
-    public String createPackage(String name,
-                                String description) throws SerializableException {
-        log.info( "CREATING package [" + name + "]" );
-        PackageItem item = getRulesRepository().createPackage( name, description );
-        
-        return item.getUUID();
-    }
-
-    public PackageConfigData loadPackageConfig(String uuid) {
-        PackageItem item = getRulesRepository().loadPackageByUUID( uuid );
-        
-        PackageConfigData data = new PackageConfigData();
-        data.uuid = item.getUUID();
-        data.header = item.getHeader();
-        data.externalURI = item.getExternalURI();
-        data.description = item.getDescription();
-        data.name = item.getName();
-        data.lastModified = item.getLastModified().getTime();
-        data.lasContributor = item.getLastContributor();
-        data.state = item.getStateDescription();
-        
-        
-        return data;
-    }
-
-    public ValidatedResponse savePackage(PackageConfigData data) throws SerializableException {
-        log.info( "SAVING package [" + data.name + "]" );
-        PackageItem item = getRulesRepository().loadPackage( data.name );
-        
-        item.updateHeader( data.header );
-        item.updateExternalURI( data.externalURI );
-        item.updateDescription( data.description );
-        
-        item.checkin( data.description );
-        
-        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
-        loader.getSuggestionEngine( item );
-        
-        ValidatedResponse res = new ValidatedResponse();
-        if (loader.hasErrors()) {
-            res.hasErrors = true;
-            String err = "";
-            for ( Iterator iter = loader.getErrors().iterator(); iter.hasNext(); ) {
-                err += (String) iter.next();
-                if (iter.hasNext()) err += "\n";
-            }
-            res.errorHeader  = "Package validation errors";
-            res.errorMessage = err;
-        }
-        
-        return res;
-    }
-
-    public TableDataResult listAssets(String uuid,
-                                              String formats[],
-                                              int numRows,
-                                              int startRow) throws SerializableException {
-        long start = System.currentTimeMillis();
-        PackageItem pkg = getRulesRepository().loadPackageByUUID( uuid );
-        AssetItemIterator it = pkg.listAssetsByFormat( formats );
-        if (numRows != -1) {
-            it.skip( startRow );
-        }
-        TableDisplayHandler handler = new TableDisplayHandler();
-        System.out.println("time for load: " + (System.currentTimeMillis() - start) );
-        return handler.loadRuleListTable( it, numRows );
-        
-
-    }
-
-    public String createState(String name) throws SerializableException {
-        log.info( "CREATING state: [" + name + "]" );
-        try {
-            return getRulesRepository().createState( name ).getNode().getUUID();
-        } catch ( RepositoryException e ) {            
-            throw new SerializableException( "Unable to create the status." );
-        }        
-    }
-
-    public String[] listStates() throws SerializableException {
-        StateItem[] states = getRulesRepository().listStates();
-        String[] result = new String[states.length];
-        for ( int i = 0; i < states.length; i++ ) {
-            result[i] = states[i].getName();
-        }
-        return result;
-    }
-
-    public void changeState(String uuid,
-                            String newState,
-                            boolean wholePackage) {
-        
-        RulesRepository repo = getRulesRepository();
-        if (!wholePackage) {
-            
-            AssetItem asset = repo.loadAssetByUUID( uuid );
-            log.info( "CHANGING ASSET STATUS. Asset name, uuid: " +
-                    "[" + asset.getName() + ", " +asset.getUUID() + "]" 
-                      +  " to [" + newState + "]");
-            asset.updateState( newState );
-        } else {
-            PackageItem pkg = repo.loadPackageByUUID( uuid );
-            log.info( "CHANGING Package STATUS. Asset name, uuid: " +
-                      "[" + pkg.getName() + ", " + pkg.getUUID() + "]" 
-                        +  " to [" + newState + "]");
-            pkg.changeStatus(newState);            
-        }
-        repo.save();
-    }
-
-    public void changeAssetPackage(String uuid,
-                                   String newPackage,
-                                   String comment) {
-        log.info( "CHANGING PACKAGE OF asset: [" + uuid + "] to [" + newPackage + "]");
-        getRulesRepository().moveRuleItemPackage( newPackage, uuid, comment );
-        
-    }
-
-    public String copyAsset(String assetUUID,
-                          String newPackage,
-                          String newName) {
-        return getRulesRepository().copyAsset( assetUUID, newPackage, newName );        
-    }
-
-    public SnapshotInfo[] listSnapshots(String packageName) {
-        RulesRepository repo = getRulesRepository();
-        
-        String[] snaps = repo.listPackageSnapshots( packageName );
-        SnapshotInfo[] res = new SnapshotInfo[snaps.length];
-        for ( int i = 0; i < snaps.length; i++ ) {
-            PackageItem snap = repo.loadPackageSnapshot( packageName, snaps[i] );
-            SnapshotInfo info = new SnapshotInfo(); 
-            res[i] = info;
-            info.comment = snap.getCheckinComment();
-            info.name = snaps[i];
-            info.uuid = snap.getUUID();
-        }
-        return res;       
-    }
-
-    public void createPackageSnapshot(String packageName,
-                                      String snapshotName,
-                                      boolean replaceExisting,
-                                      String comment) {
-        log.info( "CREATING PACKAGE SNAPSHOT for package: [" + packageName + "] snapshot name: [" + snapshotName );
-        RulesRepository repo = getRulesRepository();
-        
-        if (replaceExisting) {
-            repo.removePackageSnapshot( packageName, snapshotName );                        
-        } 
-        
-        repo.createPackageSnapshot( packageName, snapshotName );
-        PackageItem item = repo.loadPackageSnapshot( packageName, snapshotName );
-        item.updateCheckinComment( comment );
-        repo.save();
-        
-    }
-
-    public void copyOrRemoveSnapshot(String packageName,
-                                     String snapshotName,
-                                     boolean delete,
-                                     String newSnapshotName) throws SerializableException {
-        
-        RulesRepository repo = getRulesRepository();
-        if (delete) {
-            log.info( "REMOVING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "]" );
-            repo.removePackageSnapshot( packageName, snapshotName );
-        } else {
-            if (newSnapshotName.equals( "" )) {
-                throw new SerializableException("Need to have a new snapshot name.");
-            }
-            log.info( "COPYING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "] to [" + newSnapshotName + "]" );
-
-            repo.copyPackageSnapshot( packageName, snapshotName, newSnapshotName );
-        }
-        
-    }
-
-    public TableDataResult quickFindAsset(String searchText, int max) {
-        
-        RulesRepository repo = getRulesRepository();
-        String search = Pattern.compile("*", Pattern.LITERAL).matcher(searchText).replaceAll(Matcher.quoteReplacement("%"));
-        
-        if (!search.endsWith( "%" )) {
-            search += "%";
-        }
-        
-        
-        TableDataResult result = new TableDataResult();
-        
-        List resultList = new ArrayList();        
-        
-        long start = System.currentTimeMillis();        
-        AssetItemIterator it = repo.findAssetsByName( search );
-        System.out.println(System.currentTimeMillis() - start);
-        for(int i = 0; i < max; i++) {
-            if (!it.hasNext()) {
-                break;
-            } 
-            
-            AssetItem item = (AssetItem) it.next();
-            TableDataRow row = new TableDataRow();
-            row.id = item.getUUID();
-            row.values = new String[] { item.getName(), item.getDescription() };
-            resultList.add( row );
-           
-        }
-        
-        if (it.hasNext()) {
-            TableDataRow empty = new TableDataRow();
-            empty.id = "MORE";
-            resultList.add( empty );
-        }
-        
-        result.data = (TableDataRow[]) resultList.toArray( new TableDataRow[resultList.size()] );
-        return result;
-        
-    }
-
-    public void removeCategory(String categoryPath) throws SerializableException {
-        log.info( "REMOVING CATEGORY path: [" + categoryPath + "]" );
-        RulesRepository repo = getRulesRepository();
-        
-        try {
-            repo.loadCategory( categoryPath ).remove();
-            repo.save();
-        } catch (RulesRepositoryException e) {
-            throw new SerializableException( e.getMessage() );
-        }
-        
-    }
-
-    public SuggestionCompletionEngine loadSuggestionCompletionEngine(String packageName) throws SerializableException {
-        try {
-            RulesRepository repo = getRulesRepository();
-            PackageItem pkg = repo.loadPackage( packageName );
-            SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
-            return loader.getSuggestionEngine( pkg );
-        } catch (RulesRepositoryException e) {
-            log.error( e );
-            throw new SerializableException(e.getMessage());
-        }
-        
-    }
-
-
-    
-
-
-
-
-    
-    
-
-
-}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/ServiceImplementation.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/ServiceImplementation.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/ServiceImplementation.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,607 @@
+package org.drools.brms.server;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.log4j.Logger;
+import org.drools.brms.client.common.AssetFormats;
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.rpc.MetaData;
+import org.drools.brms.client.rpc.PackageConfigData;
+import org.drools.brms.client.rpc.RepositoryService;
+import org.drools.brms.client.rpc.RuleAsset;
+import org.drools.brms.client.rpc.SnapshotInfo;
+import org.drools.brms.client.rpc.TableConfig;
+import org.drools.brms.client.rpc.TableDataResult;
+import org.drools.brms.client.rpc.TableDataRow;
+import org.drools.brms.client.rpc.ValidatedResponse;
+import org.drools.brms.server.contenthandler.ContentHandler;
+import org.drools.brms.server.rules.SuggestionCompletionLoader;
+import org.drools.brms.server.util.MetaDataMapper;
+import org.drools.brms.server.util.TableDisplayHandler;
+import org.drools.repository.AssetHistoryIterator;
+import org.drools.repository.AssetItem;
+import org.drools.repository.AssetItemIterator;
+import org.drools.repository.CategoryItem;
+import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepository;
+import org.drools.repository.RulesRepositoryException;
+import org.drools.repository.StateItem;
+import org.drools.repository.VersionableItem;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.WebRemote;
+
+import com.google.gwt.user.client.rpc.SerializableException;
+
+/** 
+ * This is the implementation of the repository service to drive the GWT based front end.
+ * 
+ * @author Michael Neale
+ */
+ at Name("org.drools.brms.client.rpc.RepositoryService")
+ at AutoCreate
+public class ServiceImplementation 
+    implements
+    RepositoryService {
+
+    @In
+    public RulesRepository repository;
+    
+
+    private static final long serialVersionUID = 3150768417428383474L;
+    private static final DateFormat dateFormatter = DateFormat.getInstance();
+    private static final Logger log = Logger.getLogger( ServiceImplementation.class );
+    private MetaDataMapper metaDataMapper = new MetaDataMapper();
+
+    @WebRemote
+    public String[] loadChildCategories(String categoryPath) {
+        
+        CategoryItem item = repository.loadCategory( categoryPath );
+        List children = item.getChildTags();
+        String[] list = new String[children.size()];
+        for ( int i = 0; i < list.length; i++ ) {
+            list[i] = ((CategoryItem) children.get( i )).getName();
+        }
+        return list;
+
+    }
+
+    @WebRemote
+    public Boolean createCategory(String path,
+                                  String name,
+                                  String description) {
+        log.info( "CREATING cateogory: [" + name + "] in path [" + path + "]" );
+        if (path == null || "".equals(path)) {
+            path = "/";        
+        }
+
+        CategoryItem item = repository.loadCategory( path );
+        item.addCategory( name, description );
+        repository.save();
+        return Boolean.TRUE;
+    }
+    
+    
+    /**
+     * This will create a new asset. It will be saved, but not checked in.
+     * The initial state will be the draft state.
+     */
+    @WebRemote
+    public String createNewRule(String ruleName,
+                                 String description,
+                                 String initialCategory,
+                                 String initialPackage,
+                                 String format) throws SerializableException {    
+        log.info( "CREATING new asset name [" + ruleName + "] in package [" + initialPackage + "]" );
+        try {
+
+            PackageItem pkg = repository.loadPackage( initialPackage );
+            AssetItem asset = pkg.addAsset( ruleName, description, initialCategory, format );
+            
+            applyPreBuiltTemplates( ruleName,
+                                    format,
+                                    asset );
+            repository.save();
+            
+            
+            return asset.getUUID();
+        } catch (RulesRepositoryException e) {
+            throw new SerializableException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * For some format types, we add some sugar by adding a new template.
+     */
+    private void applyPreBuiltTemplates(String ruleName,
+                                        String format,
+                                        AssetItem asset) {
+        if (format.equals( AssetFormats.DSL_TEMPLATE_RULE )) {
+            asset.updateContent( "when\n\nthen\n" );
+        } else if (format.equals( AssetFormats.FUNCTION )) {
+            asset.updateContent( "function " + ruleName + "(<args here>)\n\n\nend" );
+        } else if (format.equals( AssetFormats.DSL )) {
+            asset.updateContent( "[when]Condition sentence template {var}=" +
+                    "rule language mapping {var}\n" +
+                    "[then]Action sentence template=rule language mapping");
+        }
+    }
+
+    @WebRemote
+    public PackageConfigData[] listPackages() {
+        Iterator pkgs = repository.listPackages();
+        List result = new ArrayList();
+        while(pkgs.hasNext()) {
+            PackageItem pkg = (PackageItem) pkgs.next();
+
+            PackageConfigData data = new PackageConfigData();
+            data.uuid = pkg.getUUID();
+            data.name = pkg.getName();
+            
+            result.add( data );
+        }
+        Collections.sort( result, new Comparator() {
+
+            public int compare(Object o1,
+                               Object o2) {
+                PackageConfigData d1 = (PackageConfigData) o1;
+                PackageConfigData d2 = (PackageConfigData) o2;
+                return d1.name.compareTo( d2.name );
+            }
+            
+        });
+        PackageConfigData[] resultArr = (PackageConfigData[]) result.toArray( new PackageConfigData[result.size()] );
+
+        return resultArr;
+    }
+
+    
+
+
+
+    @WebRemote
+    public TableDataResult loadRuleListForCategories(String categoryPath) throws SerializableException {
+        long start = System.currentTimeMillis();
+
+        List list = repository.findAssetsByCategory( categoryPath );
+        TableDisplayHandler handler = new TableDisplayHandler();
+        System.out.println("time for load: " + (System.currentTimeMillis() - start) );
+        return handler.loadRuleListTable( list.iterator(), -1 );
+        
+    }
+
+    @WebRemote
+    public TableConfig loadTableConfig(String listName) {
+        TableDisplayHandler handler = new TableDisplayHandler();
+        return handler.loadTableConfig(listName);
+        
+    }
+
+
+    /**
+     * This actually does the hard work of loading up an asset based
+     * on its format.
+     */
+    @WebRemote
+    public RuleAsset loadRuleAsset(String uuid) throws SerializableException {
+
+        AssetItem item = repository.loadAssetByUUID( uuid );
+        RuleAsset asset = new RuleAsset();
+        asset.uuid = uuid;
+
+        
+        //load standard meta data
+        asset.metaData = populateMetaData( item );
+        
+        // get package header
+        PackageItem pkgItem = repository.loadPackage( asset.metaData.packageName );
+        String header = pkgItem.getHeader();
+
+        //load the content
+        ContentHandler handler = ContentHandler.getHandler( asset.metaData.format );
+        handler.retrieveAssetContent(asset, pkgItem, item);
+        
+        return asset;
+    }
+    
+
+    /** 
+     * read in the meta data, populating all dublin core and versioning stuff.
+     */
+    MetaData populateMetaData(VersionableItem item) {
+        MetaData meta = new MetaData();
+        
+        meta.status = (item.getState() != null) ? item.getState().getName() : "";
+
+        metaDataMapper.copyToMetaData( meta, item );
+        
+        meta.createdDate = calendarToDate(item.getCreatedDate());
+        meta.lastModifiedDate = calendarToDate( item.getLastModified() );
+        
+        return meta;
+    }
+    
+    /**
+     * Populate meta data with asset specific info.
+     */
+    MetaData populateMetaData(AssetItem item) {
+        MetaData meta = populateMetaData( (VersionableItem ) item);
+        meta.packageName = item.getPackageName();
+        
+        List cats = item.getCategories();
+        meta.categories = new String[cats.size()];
+        for ( int i = 0; i < meta.categories.length; i++ ) {
+            CategoryItem cat = (CategoryItem) cats.get(i);
+            meta.categories[i] = cat.getFullPath();          
+        }
+        meta.dateEffective = calendarToDate( item.getDateEffective() );
+        meta.dateExpired = calendarToDate( item.getDateExpired() );
+        return meta;
+        
+    }
+
+    private Date calendarToDate(Calendar createdDate) {
+        if (createdDate == null) return null;
+        return createdDate.getTime();
+    }
+    
+    private Calendar dateToCalendar(Date date) {
+        if (date == null) return null;
+        Calendar cal = Calendar.getInstance();
+        cal.setTime( date );
+        return cal;
+    }    
+
+    @WebRemote
+    public String checkinVersion(RuleAsset asset) throws SerializableException {  
+        log.info( "CHECKING IN asset: [" + asset.metaData.name + "] UUID: [" + asset.uuid + "]");
+
+        
+        AssetItem repoAsset = repository.loadAssetByUUID( asset.uuid );
+        
+        MetaData meta = asset.metaData;
+        
+        metaDataMapper.copyFromMetaData( meta, repoAsset );
+        
+        repoAsset.updateDateEffective( dateToCalendar( meta.dateEffective ) );
+        repoAsset.updateDateExpired( dateToCalendar( meta.dateExpired ) );        
+        
+        
+        repoAsset.updateCategoryList( meta.categories );
+        ContentHandler handler = ContentHandler.getHandler( repoAsset.getFormat() );//new AssetContentFormatHandler();
+        handler.storeAssetContent( asset, repoAsset );
+        
+        repoAsset.checkin( meta.checkinComment );
+
+        
+        return repoAsset.getUUID();
+    }
+
+    @WebRemote
+    public TableDataResult loadAssetHistory(String uuid) throws SerializableException {
+        
+        List result = new ArrayList();
+        RulesRepository repo = repository;
+        AssetItem item = repository.loadAssetByUUID( uuid );
+        AssetHistoryIterator it = item.getHistory();
+
+        while ( it.hasNext() ) {
+            AssetItem historical = (AssetItem) it.next();//new AssetItem(repo, element);
+            long versionNumber = historical.getVersionNumber();
+            if (! (versionNumber == 0) 
+                            && ! (versionNumber == item.getVersionNumber() ))
+                {
+                TableDataRow row = new TableDataRow();
+                    row.id = historical.getVersionSnapshotUUID();
+                    row.values = new String[4];
+                    row.values[0] = Long.toString( historical.getVersionNumber());
+                    row.values[1] = historical.getCheckinComment();                
+                    row.values[2] = dateFormatter.format( historical.getLastModified().getTime() );
+                    row.values[3] = historical.getStateDescription();
+                    result.add( row );                    
+            }
+        }
+
+        
+        
+        if (result.size() == 0) return null;
+        TableDataResult table = new TableDataResult();
+        table.data = (TableDataRow[]) result.toArray(new TableDataRow[result.size()]);
+        
+        return table;
+    }
+
+    @WebRemote
+    public void restoreVersion(String versionUUID,
+                                 String assetUUID,
+                                 String comment) {
+        
+        
+        RulesRepository repo = repository;    
+        AssetItem old = repository.loadAssetByUUID( versionUUID );
+        AssetItem head = repository.loadAssetByUUID( assetUUID );
+        log.info( "RESTORE of asset: [" + head.getName() + "] UUID: [" + head.getUUID() + "] with historical version number: [" + old.getVersionNumber() );
+        repository.restoreHistoricalAsset( old, 
+                                     head, 
+                                     comment );
+        
+    }
+
+    @WebRemote
+    public String createPackage(String name,
+                                String description) throws SerializableException {
+        log.info( "CREATING package [" + name + "]" );
+        PackageItem item = repository.createPackage( name, description );
+        
+        return item.getUUID();
+    }
+
+    @WebRemote
+    public PackageConfigData loadPackageConfig(String uuid) {
+        PackageItem item = repository.loadPackageByUUID( uuid );
+        
+        PackageConfigData data = new PackageConfigData();
+        data.uuid = item.getUUID();
+        data.header = item.getHeader();
+        data.externalURI = item.getExternalURI();
+        data.description = item.getDescription();
+        data.name = item.getName();
+        data.lastModified = item.getLastModified().getTime();
+        data.lasContributor = item.getLastContributor();
+        data.state = item.getStateDescription();
+        
+        
+        return data;
+    }
+
+    @WebRemote
+    public ValidatedResponse savePackage(PackageConfigData data) throws SerializableException {
+        log.info( "SAVING package [" + data.name + "]" );
+        PackageItem item = repository.loadPackage( data.name );
+        
+        item.updateHeader( data.header );
+        item.updateExternalURI( data.externalURI );
+        item.updateDescription( data.description );
+        
+        item.checkin( data.description );
+        
+        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+        loader.getSuggestionEngine( item );
+        
+        ValidatedResponse res = new ValidatedResponse();
+        if (loader.hasErrors()) {
+            res.hasErrors = true;
+            String err = "";
+            for ( Iterator iter = loader.getErrors().iterator(); iter.hasNext(); ) {
+                err += (String) iter.next();
+                if (iter.hasNext()) err += "\n";
+            }
+            res.errorHeader  = "Package validation errors";
+            res.errorMessage = err;
+        }
+        
+        return res;
+    }
+
+    @WebRemote
+    public TableDataResult listAssets(String uuid,
+                                              String formats[],
+                                              int numRows,
+                                              int startRow) throws SerializableException {
+        long start = System.currentTimeMillis();
+        PackageItem pkg = repository.loadPackageByUUID( uuid );
+        AssetItemIterator it = pkg.listAssetsByFormat( formats );
+        if (numRows != -1) {
+            it.skip( startRow );
+        }
+        TableDisplayHandler handler = new TableDisplayHandler();
+        System.out.println("time for load: " + (System.currentTimeMillis() - start) );
+        return handler.loadRuleListTable( it, numRows );
+        
+
+    }
+
+    
+    @WebRemote
+    public String createState(String name) throws SerializableException {
+        log.info( "CREATING state: [" + name + "]" );
+        try {
+            String uuid = repository.createState( name ).getNode().getUUID();
+            repository.save();
+            return uuid;
+        } catch ( RepositoryException e ) {            
+            throw new SerializableException( "Unable to create the status." );
+        }        
+    }
+
+    @WebRemote
+    public String[] listStates() throws SerializableException {
+        StateItem[] states = repository.listStates();
+        String[] result = new String[states.length];
+        for ( int i = 0; i < states.length; i++ ) {
+            result[i] = states[i].getName();
+        }
+        return result;
+    }
+
+    @WebRemote
+    public void changeState(String uuid,
+                            String newState,
+                            boolean wholePackage) {
+        
+        RulesRepository repo = repository;
+        if (!wholePackage) {
+            
+            AssetItem asset = repository.loadAssetByUUID( uuid );
+            log.info( "CHANGING ASSET STATUS. Asset name, uuid: " +
+                    "[" + asset.getName() + ", " +asset.getUUID() + "]" 
+                      +  " to [" + newState + "]");
+            asset.updateState( newState );
+        } else {
+            PackageItem pkg = repository.loadPackageByUUID( uuid );
+            log.info( "CHANGING Package STATUS. Asset name, uuid: " +
+                      "[" + pkg.getName() + ", " + pkg.getUUID() + "]" 
+                        +  " to [" + newState + "]");
+            pkg.changeStatus(newState);            
+        }
+        repository.save();
+    }
+
+    @WebRemote
+    public void changeAssetPackage(String uuid,
+                                   String newPackage,
+                                   String comment) {
+        log.info( "CHANGING PACKAGE OF asset: [" + uuid + "] to [" + newPackage + "]");
+        repository.moveRuleItemPackage( newPackage, uuid, comment );
+        
+    }
+
+    @WebRemote
+    public String copyAsset(String assetUUID,
+                          String newPackage,
+                          String newName) {
+        return repository.copyAsset( assetUUID, newPackage, newName );        
+    }
+
+    @WebRemote
+    public SnapshotInfo[] listSnapshots(String packageName) {
+        
+        String[] snaps = repository.listPackageSnapshots( packageName );
+        SnapshotInfo[] res = new SnapshotInfo[snaps.length];
+        for ( int i = 0; i < snaps.length; i++ ) {
+            PackageItem snap = repository.loadPackageSnapshot( packageName, snaps[i] );
+            SnapshotInfo info = new SnapshotInfo(); 
+            res[i] = info;
+            info.comment = snap.getCheckinComment();
+            info.name = snaps[i];
+            info.uuid = snap.getUUID();
+        }
+        return res;       
+    }
+
+    @WebRemote
+    public void createPackageSnapshot(String packageName,
+                                      String snapshotName,
+                                      boolean replaceExisting,
+                                      String comment) {
+        log.info( "CREATING PACKAGE SNAPSHOT for package: [" + packageName + "] snapshot name: [" + snapshotName );
+        
+        if (replaceExisting) {
+            repository.removePackageSnapshot( packageName, snapshotName );                        
+        } 
+        
+        repository.createPackageSnapshot( packageName, snapshotName );
+        PackageItem item = repository.loadPackageSnapshot( packageName, snapshotName );
+        item.updateCheckinComment( comment );
+        repository.save();
+        
+    }
+
+    @WebRemote
+    public void copyOrRemoveSnapshot(String packageName,
+                                     String snapshotName,
+                                     boolean delete,
+                                     String newSnapshotName) throws SerializableException {
+        
+        if (delete) {
+            log.info( "REMOVING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "]" );
+            repository.removePackageSnapshot( packageName, snapshotName );
+        } else {
+            if (newSnapshotName.equals( "" )) {
+                throw new SerializableException("Need to have a new snapshot name.");
+            }
+            log.info( "COPYING SNAPSHOT for package: [" + packageName + "] snapshot: [" + snapshotName + "] to [" + newSnapshotName + "]" );
+
+            repository.copyPackageSnapshot( packageName, snapshotName, newSnapshotName );
+        }
+        
+    }
+
+    @WebRemote
+    public TableDataResult quickFindAsset(String searchText, int max) {
+        
+        RulesRepository repo = repository;
+        String search = Pattern.compile("*", Pattern.LITERAL).matcher(searchText).replaceAll(Matcher.quoteReplacement("%"));
+        
+        if (!search.endsWith( "%" )) {
+            search += "%";
+        }
+        
+        
+        TableDataResult result = new TableDataResult();
+        
+        List resultList = new ArrayList();        
+        
+        long start = System.currentTimeMillis();        
+        AssetItemIterator it = repository.findAssetsByName( search );
+        System.out.println(System.currentTimeMillis() - start);
+        for(int i = 0; i < max; i++) {
+            if (!it.hasNext()) {
+                break;
+            } 
+            
+            AssetItem item = (AssetItem) it.next();
+            TableDataRow row = new TableDataRow();
+            row.id = item.getUUID();
+            row.values = new String[] { item.getName(), item.getDescription() };
+            resultList.add( row );
+           
+        }
+        
+        if (it.hasNext()) {
+            TableDataRow empty = new TableDataRow();
+            empty.id = "MORE";
+            resultList.add( empty );
+        }
+        
+        result.data = (TableDataRow[]) resultList.toArray( new TableDataRow[resultList.size()] );
+        return result;
+        
+    }
+
+    
+    @WebRemote    
+    public void removeCategory(String categoryPath) throws SerializableException {
+        log.info( "REMOVING CATEGORY path: [" + categoryPath + "]" );
+        
+        try {
+            repository.loadCategory( categoryPath ).remove();
+            repository.save();
+        } catch (RulesRepositoryException e) {
+            throw new SerializableException( e.getMessage() );
+        }
+        
+    }
+
+    @WebRemote    
+    public SuggestionCompletionEngine loadSuggestionCompletionEngine(String packageName) throws SerializableException {
+        try {
+            
+            PackageItem pkg = repository.loadPackage( packageName );
+            SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+            return loader.getSuggestionEngine( pkg );
+        } catch (RulesRepositoryException e) {
+            log.error( e );
+            throw new SerializableException(e.getMessage());
+        }
+        
+    }
+
+
+
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/ServiceImplementation.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/BRMSRepositoryConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/BRMSRepositoryConfiguration.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/BRMSRepositoryConfiguration.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,70 @@
+package org.drools.brms.server.repository;
+
+import javax.jcr.LoginException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.drools.repository.JCRRepositoryConfigurator;
+import org.drools.repository.JackrabbitRepositoryConfigurator;
+import org.drools.repository.RulesRepositoryAdministrator;
+import org.drools.repository.RulesRepositoryException;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Startup;
+
+/**
+ * This startup class manages the JCR repository, sets it up if necessary.
+ * @author Michael Neale
+ */
+ at Scope(ScopeType.APPLICATION)
+ at Startup
+ at Name("repositoryConfiguration")
+public class BRMSRepositoryConfiguration {
+
+    JCRRepositoryConfigurator configurator = new JackrabbitRepositoryConfigurator();
+    String repositoryHomeDirectory = null;
+    
+    private Repository repository;
+    
+    @Create
+    public void create() {
+        repository = configurator.getJCRRepository( repositoryHomeDirectory );
+        Session sessionForSetup = newSession("admin");
+        RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(sessionForSetup);
+        if (!admin.isRepositoryInitialized()) {
+            configurator.setupRulesRepository( sessionForSetup );
+        }
+    }
+
+
+    public void setHomeDirectory(String home) {
+        this.repositoryHomeDirectory = home;
+    }
+    
+    public void setRepositoryConfigurator(String clazz) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+            Class cls = Class.forName( clazz );
+            this.configurator = (JCRRepositoryConfigurator) cls.newInstance();
+    }
+    
+     
+    /**
+     * This will create a new Session, based on the current user.
+     * @return
+     */
+    public Session newSession(String userName) {
+        
+        try {
+            return repository.login( new SimpleCredentials(userName, "password".toCharArray()) );
+        } catch ( LoginException e ) {
+            throw new RulesRepositoryException( "Unable to login to JCR backend." );
+        } catch ( RepositoryException e ) {
+            throw new RulesRepositoryException( e );
+        }
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/BRMSRepositoryConfiguration.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/RulesRepositoryManager.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/RulesRepositoryManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/RulesRepositoryManager.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,47 @@
+package org.drools.brms.server.repository;
+
+import org.drools.repository.RulesRepository;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Unwrap;
+
+/**
+ * This enhances the BRMS repository for lifecycle management.
+ * @author Michael Neale
+ */
+ at Scope(ScopeType.EVENT)
+ at AutoCreate
+ at Name("repository")
+public class RulesRepositoryManager {
+
+    @In 
+    BRMSRepositoryConfiguration repositoryConfiguration;
+    
+    private RulesRepository repository;
+    
+    //TODO: inject this ?? 
+    String userName = "alan_q";
+    
+    @Create
+    public void create() {
+        repository = new RulesRepository(repositoryConfiguration.newSession(userName) );
+    }
+    
+    @Unwrap
+    public RulesRepository getRepository() {
+        return repository;
+    }
+    
+    @Destroy
+    void close() {
+        repository.logout();
+    }
+    
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/repository/RulesRepositoryManager.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/RepositoryManager.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/RepositoryManager.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/RepositoryManager.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -4,9 +4,11 @@
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
 import javax.servlet.http.HttpSession;
 
-import org.drools.repository.RepositoryConfigurator;
+import org.drools.repository.JackrabbitRepositoryConfigurator;
+import org.drools.repository.JCRRepositoryConfigurator;
 import org.drools.repository.RulesRepository;
 
 /**
@@ -27,17 +29,20 @@
     public static Repository repository;
     
     /** This will create a new repository instance (should only happen once after startup) */
-    private Session initialiseRepo(RepositoryConfigurator config) throws LoginException,
+    private Session initialiseRepo(JCRRepositoryConfigurator config) throws LoginException,
                                                                  RepositoryException {
-        Session session = config.login( getJCRRepository( config ) );
+        Session session = getJCRRepository(config).login(
+                                           new SimpleCredentials("alan_parsons", "password".toCharArray()));
+
+
         
         config.setupRulesRepository( session );
         return session;
     }
     
-    public synchronized static Repository getJCRRepository(RepositoryConfigurator config) {
+    public synchronized static Repository getJCRRepository(JCRRepositoryConfigurator config) {
         if (repository == null) {
-            repository = config.createRepository();
+            repository = config.getJCRRepository(null);
         }
         return repository;
     }
@@ -45,7 +50,7 @@
     /** Initialse the repository, set it up if it is brand new */
     public RulesRepository createRuleRepositoryInstance() {
         
-        RepositoryConfigurator config = new RepositoryConfigurator();
+        JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
 
         try {
             
@@ -58,7 +63,9 @@
             }  else {
                 //ok this is probably fast enough to do with each request I think
                 long start = System.currentTimeMillis();
-                session = config.login( repository );
+                session = repository.login(
+                                                   new SimpleCredentials("alan_parsons", "password".toCharArray()));
+
                 System.out.println("login repo time: " + (System.currentTimeMillis() - start));
                 
             }

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/TestEnvironmentSessionHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/TestEnvironmentSessionHelper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/TestEnvironmentSessionHelper.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,44 @@
+package org.drools.brms.server.util;
+
+import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.drools.repository.JCRRepositoryConfigurator;
+import org.drools.repository.JackrabbitRepositoryConfigurator;
+import org.drools.repository.RulesRepositoryAdministrator;
+
+/**
+ * This is only to be used for testing, eg in hosted mode, or unit tests.
+ * 
+ * @author Michael Neale
+ */
+public class TestEnvironmentSessionHelper {
+
+
+    public static Session testSession;
+    
+    public static Session getSession() throws Exception {
+        return getSession(true);
+    }
+    
+    public static Session getSession(boolean erase) throws Exception {
+        if (testSession == null) {
+            JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
+            Repository repo = RepositoryManager.getJCRRepository( config );
+            testSession = repo.login(
+                                                                     new SimpleCredentials("alan_parsons", "password".toCharArray()));
+
+            RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(testSession);
+            if (erase && admin.isRepositoryInitialized()) {
+                
+                admin.clearRulesRepository( );
+            } 
+            config.setupRulesRepository( testSession );
+        }
+        return testSession;
+        
+    }
+        
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/TestEnvironmentSessionHelper.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTRemoteServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTRemoteServiceServlet.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTRemoteServiceServlet.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,682 @@
+package org.jboss.seam.remoting.gwt;
+
+/*
+ * Copyright 2006 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.SerializableException;
+import com.google.gwt.user.client.rpc.SerializationException;
+import com.google.gwt.user.server.rpc.impl.ServerSerializableTypeOracle;
+import com.google.gwt.user.server.rpc.impl.ServerSerializableTypeOracleImpl;
+import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader;
+import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jboss.seam.remoting.gwt.GWTToSeamAdapter.ReturnedObject;
+
+/**
+ * 
+ * @author @hacker Michael Neale
+ * This is a less then ideal approach, but GWT (up to and including 1.3) 
+ * has no means to get into the internals of the RPC mechanism, and free it 
+ * from the shackles of the servlet API.
+ * So I, the liberator, have hacked this out of RemoteServiceServlet to do this, heretofore.
+ * 
+ * When GWT 1.4 comes along to save us all, this can be retired, and the RPC utility class
+ * - as contributed by Rob Jellinghaus can be used instead.
+ * 
+ */
+public class GWTRemoteServiceServlet extends HttpServlet {
+
+  /*
+   * These members are used to get and set the different HttpServletResponse and
+   * HttpServletRequest headers.
+   */
+  private static final String ACCEPT_ENCODING = "Accept-Encoding";
+  private static final String CHARSET_UTF8 = "UTF-8";
+  private static final String CONTENT_ENCODING = "Content-Encoding";
+  private static final String CONTENT_ENCODING_GZIP = "gzip";
+  private static final String CONTENT_TYPE_TEXT_PLAIN_UTF8 = "text/plain; charset=utf-8";
+  private static final String GENERIC_FAILURE_MSG = "The call failed on the server; see server log for details";
+  private static final HashMap TYPE_NAMES;
+
+  /**
+   * Controls the compression threshold at and below which no compression will
+   * take place.
+   */
+  private static final int UNCOMPRESSED_BYTE_SIZE_LIMIT = 256;
+
+  static {
+    TYPE_NAMES = new HashMap();
+    TYPE_NAMES.put("Z", boolean.class);
+    TYPE_NAMES.put("B", byte.class);
+    TYPE_NAMES.put("C", char.class);
+    TYPE_NAMES.put("D", double.class);
+    TYPE_NAMES.put("F", float.class);
+    TYPE_NAMES.put("I", int.class);
+    TYPE_NAMES.put("J", long.class);
+    TYPE_NAMES.put("S", short.class);
+  }
+
+  /**
+   * Return true if the response object accepts Gzip encoding. This is done by
+   * checking that the accept-encoding header specifies gzip as a supported
+   * encoding.
+   */
+  private static boolean acceptsGzipEncoding(HttpServletRequest request) {
+    assert (request != null);
+
+    String acceptEncoding = request.getHeader(ACCEPT_ENCODING);
+    if (null == acceptEncoding) {
+      return false;
+    }
+
+    return (acceptEncoding.indexOf(CONTENT_ENCODING_GZIP) != -1);
+  }
+
+  /**
+   * This method attempts to estimate the number of bytes that a string will
+   * consume when it is sent out as part of an HttpServletResponse. This really
+   * a hack since we are assuming that every character will consume two bytes
+   * upon transmission. This is definitely not true since some characters
+   * actually consume more than two bytes and some consume less. This is even
+   * less accurate if the string is converted to UTF8. However, it does save us
+   * from converting every string that we plan on sending back to UTF8 just to
+   * determine that we should not compress it.
+   */
+  private static int estimateByteSize(final String buffer) {
+    return (buffer.length() * 2);
+  }
+
+  /**
+   * Find the invoked method on either the specified interface or any super.
+   */
+  private static Method findInterfaceMethod(Class intf, String methodName,
+      Class[] paramTypes, boolean includeInherited) {
+    try {
+      return intf.getDeclaredMethod(methodName, paramTypes);
+    } catch (NoSuchMethodException e) {
+      if (includeInherited) {
+        Class[] superintfs = intf.getInterfaces();
+        for (int i = 0; i < superintfs.length; i++) {
+          Method method = findInterfaceMethod(superintfs[i], methodName,
+              paramTypes, true);
+          if (method != null) {
+            return method;
+          }
+        }
+      }
+
+      return null;
+    }
+  }
+
+  private final Set knownImplementedInterfaces = new HashSet();
+
+  private final ThreadLocal perThreadRequest = new ThreadLocal();
+
+  private final ThreadLocal perThreadResponse = new ThreadLocal();
+
+  private final ServerSerializableTypeOracle serializableTypeOracle;
+
+  /**
+   * The default constructor.
+   */
+  public GWTRemoteServiceServlet() {
+    serializableTypeOracle = new ServerSerializableTypeOracleImpl(
+        getPackagePaths());
+  }
+
+  /**
+   * This is called internally.
+   */
+  public final void doPost(HttpServletRequest request,
+      HttpServletResponse response) {
+    Throwable caught;
+    try {
+      // Store the request & response objects in thread-local storage.
+      //
+      perThreadRequest.set(request);
+      perThreadResponse.set(response);
+
+      // Read the request fully.
+      //
+      String requestPayload = readPayloadAsUtf8(request);
+
+      // Invoke the core dispatching logic, which returns the serialized
+      // result.
+      //
+      String responsePayload = processCall(requestPayload);
+
+      // Write the response.
+      //
+      writeResponse(request, response, responsePayload);
+      return;
+    } catch (IOException e) {
+      caught = e;
+    } catch (ServletException e) {
+      caught = e;
+    } catch (SerializationException e) {
+      caught = e;
+    } catch (Throwable e) {
+      caught = e;
+    }
+
+    respondWithFailure(response, caught);
+  }
+
+  /**
+   * This is public so that it can be unit tested easily without HTTP.
+   */
+  public String processCall(String payload) throws SerializationException {
+
+    // Let subclasses see the serialized request.
+    //
+    onBeforeRequestDeserialized(payload);
+
+    // Create a stream to deserialize the request.
+    //
+    ServerSerializationStreamReader streamReader = new ServerSerializationStreamReader(
+        serializableTypeOracle);
+    streamReader.prepareToRead(payload);
+
+    // Read the service interface
+    //
+    String serviceIntfName = streamReader.readString();
+
+//    // TODO(mmendez): need a way to check the type signature of the service intf
+//    // Verify that this very servlet implements the specified interface name.
+//    //
+//    if (!isImplementedRemoteServiceInterface(serviceIntfName)) {
+//      // Bad payload, possible hack attempt.
+//      //
+//      throw new SecurityException(
+//          "Blocked attempt to access interface '"
+//              + serviceIntfName
+//              + "', which is either not implemented by this servlet or which doesn't extend RemoteService; this is either misconfiguration or a hack attempt");
+//    }
+
+    // Actually get the service interface, so that we can query its methods.
+    //
+//    Class serviceIntf;
+//    try {
+//      serviceIntf = getClassFromName(serviceIntfName);
+//    } catch (ClassNotFoundException e) {
+//      throw new SerializationException("Unknown service interface class '"
+//          + serviceIntfName + "'", e);
+//    }
+
+    // Read the method name.
+    //
+    String methodName = streamReader.readString();
+
+     
+    // Read the number and names of the parameter classes from the stream.
+    // We have to do this so that we can find the correct overload of the
+    // method.
+    //
+    int paramCount = streamReader.readInt();
+    Class[] paramTypes = new Class[paramCount];
+    for (int i = 0; i < paramTypes.length; i++) {
+      String paramClassName = streamReader.readString();
+      try {
+        paramTypes[i] = getClassOrPrimitiveFromName(paramClassName);
+      } catch (ClassNotFoundException e) {
+        throw new SerializationException("Unknown parameter " + i + " type '"
+            + paramClassName + "'", e);
+      }
+    }
+
+//    // For security, make sure the method is found in the service interface
+//    // and not just one that happens to be defined on this class.
+//    //
+//    Method serviceIntfMethod = findInterfaceMethod(serviceIntf, methodName,
+//        paramTypes, true);
+
+//    // If it wasn't found, don't continue.
+//    //
+//    if (serviceIntfMethod == null) {
+//      // Bad payload, possible hack attempt.
+//      //
+//      throw new SecurityException(
+//          "Method '"
+//              + methodName
+//              + "' (or a particular overload) on interface '"
+//              + serviceIntfName
+//              + "' was not found, this is either misconfiguration or a hack attempt");
+//    }
+
+    // Deserialize the parameters.
+    //
+    Object[] args = new Object[paramCount];
+    for (int i = 0; i < args.length; i++) {
+      args[i] = streamReader.deserializeValue(paramTypes[i]);
+    }
+
+    GWTToSeamAdapter adapter = new GWTToSeamAdapter();
+    
+    
+    // Make the call via reflection.
+    //
+    String responsePayload = GENERIC_FAILURE_MSG;
+    ServerSerializationStreamWriter streamWriter = new ServerSerializationStreamWriter(
+        serializableTypeOracle);
+    Throwable caught = null;
+    try {
+        ReturnedObject returnedObject = adapter.callWebRemoteMethod(serviceIntfName, methodName, paramTypes, args);
+        Class returnType = returnedObject.returnType;
+        Object returnVal = returnedObject.returnedObject;
+//      Class returnType = serviceIntfMethod.getReturnType();
+//      Object returnVal = serviceIntfMethod.invoke(this, args);
+      responsePayload = createResponse(streamWriter, returnType, returnVal,
+          false);
+    } catch (IllegalArgumentException e) {
+      caught = e;
+    } catch (IllegalAccessException e) {
+      caught = e;
+    } catch (InvocationTargetException e) {
+      // Try to serialize the caught exception if the client is expecting it,
+      // otherwise log the exception server-side.
+      caught = e;
+      Throwable cause = e.getCause();
+      if (cause != null) {
+        // Update the caught exception to the underlying cause
+        caught = cause;
+        // Serialize the exception back to the client if it's a declared
+        // exception
+        if (cause instanceof SerializableException) {
+          Class thrownClass = cause.getClass();
+          responsePayload = createResponse(streamWriter, thrownClass, cause,
+              true);
+          // Don't log the exception on the server
+          caught = null;
+        }
+      }
+    }
+
+    if (caught != null) {
+      responsePayload = GENERIC_FAILURE_MSG;
+      ServletContext servletContext = getServletContext();
+      // servletContext may be null (for example, when unit testing)
+      if (servletContext != null) {
+        // Log the exception server side
+        servletContext.log("Exception while dispatching incoming RPC call",
+            caught);
+      }
+    }
+
+    // Let subclasses see the serialized response.
+    //
+    onAfterResponseSerialized(responsePayload);
+
+    return responsePayload;
+  }
+
+  /**
+   * Gets the <code>HttpServletRequest</code> object for the current call. It
+   * is stored thread-locally so that simultaneous invocations can have
+   * different request objects.
+   */
+  protected final HttpServletRequest getThreadLocalRequest() {
+    return (HttpServletRequest) perThreadRequest.get();
+  }
+
+  /**
+   * Gets the <code>HttpServletResponse</code> object for the current call. It
+   * is stored thread-locally so that simultaneous invocations can have
+   * different response objects.
+   */
+  protected final HttpServletResponse getThreadLocalResponse() {
+    return (HttpServletResponse) perThreadResponse.get();
+  }
+
+  /**
+   * Override this method to examine the serialized response that will be
+   * returned to the client. The default implementation does nothing and need
+   * not be called by subclasses.
+   */
+  protected void onAfterResponseSerialized(String serializedResponse) {
+  }
+
+  /**
+   * Override this method to examine the serialized version of the request
+   * payload before it is deserialized into objects. The default implementation
+   * does nothing and need not be called by subclasses.
+   */
+  protected void onBeforeRequestDeserialized(String serializedRequest) {
+  }
+
+  /**
+   * Determines whether the response to a given servlet request should or should
+   * not be GZIP compressed. This method is only called in cases where the
+   * requestor accepts GZIP encoding.
+   * <p>
+   * This implementation currently returns <code>true</code> if the response
+   * string's estimated byte length is longer than 256 bytes. Subclasses can
+   * override this logic.
+   * </p>
+   * 
+   * @param request the request being served
+   * @param response the response that will be written into
+   * @param responsePayload the payload that is about to be sent to the client
+   * @return <code>true</code> if responsePayload should be GZIP compressed,
+   *         otherwise <code>false</code>.
+   */
+  protected boolean shouldCompressResponse(HttpServletRequest request,
+      HttpServletResponse response, String responsePayload) {
+    return estimateByteSize(responsePayload) > UNCOMPRESSED_BYTE_SIZE_LIMIT;
+  }
+
+  /**
+   * @param stream
+   * @param responseType
+   * @param responseObj
+   * @param isException
+   * @return response
+   */
+  private String createResponse(ServerSerializationStreamWriter stream,
+      Class responseType, Object responseObj, boolean isException) {
+    stream.prepareToWrite();
+    if (responseType != void.class) {
+      try {
+        stream.serializeValue(responseObj, responseType);
+      } catch (SerializationException e) {
+        responseObj = e;
+        isException = true;
+      }
+    }
+
+    String bufferStr = (isException ? "{EX}" : "{OK}") + stream.toString();
+    return bufferStr;
+  }
+
+  /**
+   * Returns the {@link Class} instance for the named class.
+   * 
+   * @param name the name of a class or primitive type
+   * @return Class instance for the given type name
+   * @throws ClassNotFoundException if the named type was not found
+   */
+  private Class getClassFromName(String name) throws ClassNotFoundException {
+    return Class.forName(name, false, this.getClass().getClassLoader());
+  }
+
+  /**
+   * Returns the {@link Class} instance for the named class or primitive type.
+   * 
+   * @param name the name of a class or primitive type
+   * @return Class instance for the given type name
+   * @throws ClassNotFoundException if the named type was not found
+   */
+  private Class getClassOrPrimitiveFromName(String name)
+      throws ClassNotFoundException {
+    Object value = TYPE_NAMES.get(name);
+    if (value != null) {
+      return (Class) value;
+    }
+
+    return getClassFromName(name);
+  }
+
+  /**
+   * Obtain the special package-prefixes we use to check for custom serializers
+   * that would like to live in a package that they cannot. For example,
+   * "java.util.ArrayList" is in a sealed package, so instead we use this prefix
+   * to check for a custom serializer in
+   * "com.google.gwt.user.client.rpc.core.java.util.ArrayList". Right now, it's
+   * hard-coded because we don't have a pressing need for this mechanism to be
+   * extensible, but it is imaginable, which is why it's implemented this way.
+   */
+  private String[] getPackagePaths() {
+    return new String[] {"com.google.gwt.user.client.rpc.core"};
+  }
+
+  /**
+   * Returns true if the {@link java.lang.reflect.Method Method} definition on
+   * the service is specified to throw the exception contained in the
+   * InvocationTargetException or false otherwise. NOTE we do not check that the
+   * type is serializable here. We assume that it must be otherwise the
+   * application would never have been allowed to run.
+   * 
+   * @param serviceIntfMethod
+   * @param e
+   * @return is expected exception
+   */
+  private boolean isExpectedException(Method serviceIntfMethod, Throwable cause) {
+    assert (serviceIntfMethod != null);
+    assert (cause != null);
+
+    Class[] exceptionsThrown = serviceIntfMethod.getExceptionTypes();
+    if (exceptionsThrown.length <= 0) {
+      // The method is not specified to throw any exceptions
+      //
+      return false;
+    }
+
+    Class causeType = cause.getClass();
+
+    for (int index = 0; index < exceptionsThrown.length; ++index) {
+      Class exceptionThrown = exceptionsThrown[index];
+      assert (exceptionThrown != null);
+
+      if (exceptionThrown.isAssignableFrom(causeType)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  /**
+   * Used to determine whether the specified interface name is implemented by
+   * this class without loading the class (for security).
+   */
+  private boolean isImplementedRemoteServiceInterface(String intfName) {
+    synchronized (knownImplementedInterfaces) {
+      // See if it's cached.
+      //
+      if (knownImplementedInterfaces.contains(intfName)) {
+        return true;
+      }
+
+      Class cls = getClass();
+
+      // Unknown, so walk up the class hierarchy to find the first class that
+      // implements the requested interface
+      //
+      while ((cls != null) && !GWTRemoteServiceServlet.class.equals(cls)) {
+        Class[] intfs = cls.getInterfaces();
+        for (int i = 0; i < intfs.length; i++) {
+          Class intf = intfs[i];
+          if (isImplementedRemoteServiceInterfaceRecursive(intfName, intf)) {
+            knownImplementedInterfaces.add(intfName);
+            return true;
+          }
+        }
+
+        // did not find the interface in this class so we look in the
+        // superclass
+        cls = cls.getSuperclass();
+      }
+
+      return false;
+    }
+  }
+
+  /**
+   * Only called from isImplementedInterface().
+   */
+  private boolean isImplementedRemoteServiceInterfaceRecursive(String intfName,
+      Class intfToCheck) {
+    assert (intfToCheck.isInterface());
+
+    if (intfToCheck.getName().equals(intfName)) {
+      // The name is right, but we also verify that it is assignable to
+      // RemoteService.
+      // 
+      if (RemoteService.class.isAssignableFrom(intfToCheck)) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+    Class[] intfs = intfToCheck.getInterfaces();
+    for (int i = 0; i < intfs.length; i++) {
+      Class intf = intfs[i];
+      if (isImplementedRemoteServiceInterfaceRecursive(intfName, intf)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  private String readPayloadAsUtf8(HttpServletRequest request)
+      throws IOException, ServletException {
+    int contentLength = request.getContentLength();
+    if (contentLength == -1) {
+      // Content length must be known.
+      throw new ServletException("Content-Length must be specified");
+    }
+
+    String contentType = request.getContentType();
+    boolean contentTypeIsOkay = false;
+    // Content-Type must be specified.
+    if (contentType != null) {
+      // The type must be plain text.
+      if (contentType.startsWith("text/plain")) {
+        // And it must be UTF-8 encoded (or unspecified, in which case we assume
+        // that it's either UTF-8 or ASCII).
+        if (contentType.indexOf("charset=") == -1) {
+          contentTypeIsOkay = true;
+        } else if (contentType.indexOf("charset=utf-8") != -1) {
+          contentTypeIsOkay = true;
+        }
+      }
+    }
+    if (!contentTypeIsOkay) {
+      throw new ServletException(
+          "Content-Type must be 'text/plain' with 'charset=utf-8' (or unspecified charset)");
+    }
+    InputStream in = request.getInputStream();
+    try {
+      byte[] payload = new byte[contentLength];
+      int offset = 0;
+      int len = contentLength;
+      int byteCount;
+      while (offset < contentLength) {
+        byteCount = in.read(payload, offset, len);
+        if (byteCount == -1) {
+          throw new ServletException("Client did not send " + contentLength
+              + " bytes as expected");
+        }
+        offset += byteCount;
+        len -= byteCount;
+      }
+      return new String(payload, "UTF-8");
+    } finally {
+      if (in != null) {
+        in.close();
+      }
+    }
+  }
+
+  /**
+   * Called when the machinery of this class itself has a problem, rather than
+   * the invoked third-party method. It writes a simple 500 message back to the
+   * client.
+   */
+  private void respondWithFailure(HttpServletResponse response, Throwable caught) {
+    ServletContext servletContext = getServletContext();
+    servletContext.log("Exception while dispatching incoming RPC call", caught);
+    try {
+      response.setContentType("text/plain");
+      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      response.getWriter().write(GENERIC_FAILURE_MSG);
+    } catch (IOException e) {
+      servletContext.log(
+          "sendError() failed while sending the previous failure to the client",
+          caught);
+    }
+  }
+
+  private void writeResponse(HttpServletRequest request,
+      HttpServletResponse response, String responsePayload) throws IOException {
+
+    byte[] reply = responsePayload.getBytes(CHARSET_UTF8);
+    String contentType = CONTENT_TYPE_TEXT_PLAIN_UTF8;
+
+    if (acceptsGzipEncoding(request)
+        && shouldCompressResponse(request, response, responsePayload)) {
+      // Compress the reply and adjust headers.
+      //
+      ByteArrayOutputStream output = null;
+      GZIPOutputStream gzipOutputStream = null;
+      Throwable caught = null;
+      try {
+        output = new ByteArrayOutputStream(reply.length);
+        gzipOutputStream = new GZIPOutputStream(output);
+        gzipOutputStream.write(reply);
+        gzipOutputStream.finish();
+        gzipOutputStream.flush();
+        response.setHeader(CONTENT_ENCODING, CONTENT_ENCODING_GZIP);
+        reply = output.toByteArray();
+      } catch (UnsupportedEncodingException e) {
+        caught = e;
+      } catch (IOException e) {
+        caught = e;
+      } finally {
+        if (null != gzipOutputStream) {
+          gzipOutputStream.close();
+        }
+        if (null != output) {
+          output.close();
+        }
+      }
+
+      if (caught != null) {
+        getServletContext().log("Unable to compress response", caught);
+        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        return;
+      }
+    }
+
+    // Send the reply.
+    //
+    response.setContentLength(reply.length);
+    response.setContentType(contentType);
+    response.setStatus(HttpServletResponse.SC_OK);
+    response.getOutputStream().write(reply);
+  }
+}
+


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTRemoteServiceServlet.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapter.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,171 @@
+package org.jboss.seam.remoting.gwt;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.brms.server.ServiceImplementation;
+import org.drools.brms.server.util.TestEnvironmentSessionHelper;
+import org.drools.repository.RulesRepository;
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.WebRemote;
+import org.jboss.seam.contexts.Contexts;
+
+/**
+ * This class adapts GWT RPC mechanism to Seam actions.
+ * 
+ * @author Michael Neale
+ */
+public class GWTToSeamAdapter {
+
+    /** A very simple cache of previously looked up methods */
+    static final Map METHOD_CACHE = new HashMap();
+
+
+    /**
+     * Call the service. 
+     * @param serviceIntfName The interface name - this will be the fully qualified name of the remote service interface as
+     * understood by GWT. This correlates to a component name in seam.
+     * @param methodName The method name of the service being invoked.
+     * @param paramTypes The types of parameters - needed for method lookup for polymorphism.
+     * @param args The values to be passed to the service method.
+     * @return A populated ReturnedObject - the returned object payload may be null, but the type will not be.
+     * @throws InvocationTargetException
+     * @throws IllegalAccessException
+     */
+    public ReturnedObject callWebRemoteMethod(String serviceIntfName,
+                         String methodName,
+                         Class[] paramTypes,
+                         Object[] args) throws InvocationTargetException, IllegalAccessException, SecurityException {
+
+            Object component = getServiceComponent( serviceIntfName );
+            Class clz = component.getClass();
+
+            Method method = getMethod( serviceIntfName, methodName,
+                            clz,
+                            paramTypes );
+
+            
+            Object result = method.invoke( component, args );
+            return new ReturnedObject(method.getReturnType(), result);
+
+        
+    }
+
+    /**
+     * Get the method on the class, including walking up the class heirarchy if needed.
+     * Methods have to be marked as "@WebRemote" to be allowed.
+     * @param methodName
+     * @param clz
+     * @param paramTypes
+     * @return
+     */
+    private Method getMethod(String serviceName, 
+                             String methodName,
+                                Class clz,
+                                Class[] paramTypes)  {
+        String key = getKey( serviceName,  methodName, paramTypes );
+        if (METHOD_CACHE.containsKey( key )) {
+            return (Method) METHOD_CACHE.get( key );
+        } else {
+            try {
+                synchronized ( METHOD_CACHE ) {
+                    Method m = findMethod( clz, methodName, paramTypes );
+                    if (m == null) throw new NoSuchMethodException();
+                    METHOD_CACHE.put( key, m );
+                    return m;
+                }
+                
+            } catch ( NoSuchMethodException e ) {
+                  throw new SecurityException("Unable to access a service method called [" + methodName + "] on class [" + clz.getName() + "] without the @WebRemote attribute. " +
+                  "This may be a hack attempt, or someone simply neglected to use the @WebRemote attribute to indicate a method as" +
+                  " remotely accessible.");
+            }
+        }
+    }
+
+    private String getKey(String serviceName,
+                          String methodName,
+                          Class[] paramTypes) {
+        if (paramTypes == null) {
+            return serviceName + "." + methodName;    
+        } else {
+            String pTypes = "";
+            for ( int i = 0; i < paramTypes.length; i++ ) {
+                pTypes += paramTypes[i].getName();
+            }
+            return serviceName + "." + methodName + "(" + pTypes + ")";
+        }
+        
+    }
+    
+    /**
+     * Recurse up the class hierarchy, looking for a compatable method that is marked as "@WebRemote".
+     * If one is not found (or we hit Object.class) then we barf - basically trust nothing from the client
+     * other then what we want to allow them to call. 
+     */
+    private Method findMethod(Class clz, String methodName, Class[] paramTypes ) throws NoSuchMethodException {
+        if (clz == Object.class) {
+            return null;
+        } else {
+            Method m = clz.getMethod( methodName, paramTypes );
+            if (isWebRemoteAnnotated( m )) {
+                return m;
+            } else {
+                return findMethod(clz.getSuperclass(), methodName, paramTypes);
+            }
+        }
+    }
+
+    /**
+     * Only allow methods annotated with @WebRemote for security reasons.
+     */
+    private boolean isWebRemoteAnnotated(Method method) {
+        if (method == null) return false;
+        return method.getAnnotation( WebRemote.class ) != null;
+    }
+
+    /**
+     * Return the service component that has been bound to the given name.
+     */
+    protected Object getServiceComponent(String serviceIntfName) {
+        if (Contexts.isApplicationContextActive()) {
+            return Component.getInstance( serviceIntfName );
+        } else {
+
+            //MN: NOTE THIS IS MY HACKERY TO GET IT WORKING IN GWT HOSTED MODE.
+            //THIS IS ALL THAT IS NEEDED.
+            System.out.println("WARNING: RUNNING IN NON SEAM MODE SINGLE USER MODE - ONLY FOR TESTING AND DEBUGGING !!!!!");
+            ServiceImplementation impl = new ServiceImplementation();
+             
+            try {
+                impl.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession(false));
+                return impl;
+            } catch ( Exception e ) {
+                throw new IllegalStateException("Unable to launch debug mode...");
+            }
+            
+            
+        }
+    }
+
+    /**
+     * This is used for returning results to the GWT service endpoint.
+     * The class is needed even if the result is null. 
+     * a void.class responseType is perfectly acceptable.
+     * @author Michael Neale
+     */
+    static class ReturnedObject {
+        public ReturnedObject(Class type,
+                              Object result) {
+            this.returnType = type;
+            this.returnedObject = result;
+        }
+        public Class returnType;
+        public Object returnedObject;
+    }
+    
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapter.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/resources/seam.properties
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/resources/seam.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/resources/seam.properties	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1 @@
+#just an empty one, as required by Seam
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/resources/seam.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/components.xml
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/components.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/components.xml	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+            xmlns:core="http://jboss.com/products/seam/core"
+            xmlns:security="http://jboss.com/products/seam/security"
+            xmlns:web="http://jboss.com/products/seam/web"
+            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation=
+                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-1.2.xsd
+                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-1.2.xsd
+                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-1.2.xsd
+                 http://jboss.com/products/seam/web http://jboss.com/products/seam/web-1.2.xsd">
+
+    <core:init debug="true"/>
+
+	<component name="repositoryConfiguration">
+		<!--
+		  *** This is for configuring the "home" directory for the repo storage. the directory must exist. 	***
+	      <property name="homeDirectory">/home/michael/RulesRepository_001</property>
+	    -->  
+	    
+	    <!--   
+	      Optional: this is for creating a configurator for a seperate repository type.
+	      <property name="repositoryConfigurator">org.drools.repository.JackrabbitRepositoryConfigurator</property>
+	    -->
+    </component>
+
+</components>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/components.xml
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/web.xml
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/web.xml	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/webapp/WEB-INF/web.xml	2007-03-23 10:49:23 UTC (rev 10468)
@@ -5,9 +5,24 @@
 <web-app>
   <display-name>Archetype Created Web Application</display-name>
   
+    <listener>
+        <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+    </listener>  
+  
+    <filter>
+        <filter-name>Seam Filter</filter-name>
+        <filter-class>org.jboss.seam.web.ContextFilter</filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>Seam Filter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+      
+  
 	<servlet>
-		<servlet-name>JBRMSServiceServlet</servlet-name>
-		<servlet-class>org.drools.brms.server.JBRMSServiceServlet</servlet-class>
+		<servlet-name>GWTRemotingServlet</servlet-name>
+		<servlet-class>org.jboss.seam.remoting.gwt.GWTRemoteServiceServlet</servlet-class>
 	</servlet>  
 	
 	<servlet>
@@ -16,7 +31,7 @@
 	</servlet>  
   
 	<servlet-mapping>
-		<servlet-name>JBRMSServiceServlet</servlet-name>
+		<servlet-name>GWTRemotingServlet</servlet-name>
 		<url-pattern>/org.drools.brms.JBRMS/jbrmsService</url-pattern>
 	</servlet-mapping>  
 	
@@ -24,5 +39,12 @@
 		<servlet-name>FileUploadServlet</servlet-name>
 		<url-pattern>/org.drools.brms.JBRMS/fileManager</url-pattern>
 	</servlet-mapping>  
+	
+	<!--
+    <listener>
+        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
+    </listener>	
+    -->
+
   
 </web-app>

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/FileUploadServletTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/FileUploadServletTest.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/FileUploadServletTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -10,6 +10,7 @@
 import junit.framework.TestCase;
 
 import org.apache.commons.fileupload.FileItem;
+import org.drools.brms.server.util.TestEnvironmentSessionHelper;
 import org.drools.repository.AssetItem;
 import org.drools.repository.RulesRepository;
 
@@ -22,7 +23,7 @@
         
         
         
-        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
        
         AssetItem item = repo.loadDefaultPackage().addAsset( "testUploadFile", "description" );
         upload.uuid = item.getUUID();

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/PopulateDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/PopulateDataTest.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/PopulateDataTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -7,7 +7,7 @@
 import org.drools.brms.client.common.AssetFormats;
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.brms.client.rpc.PackageConfigData;
-import org.drools.brms.server.rules.SuggestionCompletionLoader;
+import org.drools.brms.server.util.TestEnvironmentSessionHelper;
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 import org.drools.repository.RulesRepository;
@@ -29,7 +29,8 @@
 public class PopulateDataTest extends TestCase {
 
     public void testPopulate() throws Exception {
-        JBRMSServiceServlet serv = new TestHarnessJBRMSServiceServlet();
+        ServiceImplementation serv = new ServiceImplementation();
+        serv.repository = new RulesRepository(TestEnvironmentSessionHelper.getSession());
         
         createCategories( serv );
         createStates( serv );
@@ -41,8 +42,8 @@
         
     }
 
-    private void createModel(JBRMSServiceServlet serv) throws Exception {
-        RulesRepository repo = serv.getRulesRepository();
+    private void createModel(ServiceImplementation serv) throws Exception {
+        RulesRepository repo = serv.repository;
         String uuid = serv.createNewRule( "DomainModel", "This is the business object model", null, "com.billasurf.manufacturing.plant", AssetFormats.MODEL );
         InputStream file = this.getClass().getResourceAsStream( "/billasurf.jar" );
         assertNotNull(file);
@@ -83,13 +84,13 @@
         
     }
 
-    private void createPackageSnapshots(JBRMSServiceServlet serv) {
+    private void createPackageSnapshots(ServiceImplementation serv) {
         serv.createPackageSnapshot( "com.billasurf.finance", "TEST", false, "The testing region." );
         serv.createPackageSnapshot( "com.billasurf.finance", "PRODUCTION", false, "The testing region." );
         serv.createPackageSnapshot( "com.billasurf.finance", "PRODUCTION ROLLBACK", false, "The testing region." );
     }
 
-    private void createSomeRules(JBRMSServiceServlet serv) throws SerializableException {
+    private void createSomeRules(ServiceImplementation serv) throws SerializableException {
         String uuid = serv.createNewRule( "Surfboard_Colour_Combination", "allowable combinations for basic boards.", "Manufacturing/Boards", "com.billasurf.manufacturing", AssetFormats.BUSINESS_RULE );
         serv.changeState( uuid, "Pending", false );
         uuid = serv.createNewRule( "Premium_Colour_Combinations", "This defines XXX.", "Manufacturing/Boards", "com.billasurf.manufacturing", AssetFormats.BUSINESS_RULE );
@@ -101,7 +102,7 @@
         
     }
 
-    private void createPackages(JBRMSServiceServlet serv) throws SerializableException {
+    private void createPackages(ServiceImplementation serv) throws SerializableException {
         String uuid = serv.createPackage( "com.billasurf.manufacturing", "Rules for manufacturing." );
         
         PackageConfigData conf = serv.loadPackageConfig( uuid );
@@ -115,12 +116,12 @@
         
     }
 
-    private void createStates(JBRMSServiceServlet serv) throws SerializableException {
+    private void createStates(ServiceImplementation serv) throws SerializableException {
         serv.createState( "Approved" );
         serv.createState( "Pending" );
     }
 
-    private void createCategories(JBRMSServiceServlet serv) {
+    private void createCategories(ServiceImplementation serv) {
         serv.createCategory( "/", "HR", "" );
         serv.createCategory( "/", "Sales", "" );
         serv.createCategory( "/", "Manufacturing", "" );

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -19,9 +19,11 @@
 import org.drools.brms.client.rpc.ValidatedResponse;
 import org.drools.brms.client.rulelist.AssetItemListViewer;
 import org.drools.brms.server.util.TableDisplayHandler;
+import org.drools.brms.server.util.TestEnvironmentSessionHelper;
 import org.drools.repository.AssetItem;
 import org.drools.repository.CategoryItem;
 import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepository;
 import org.drools.repository.StateItem;
 
 import com.google.gwt.user.client.rpc.SerializableException;
@@ -33,8 +35,10 @@
   public void testCategory() throws Exception {
         //ServiceImpl impl = new ServiceImpl(new RulesRepository(SessionHelper.getSession()));
 
-        RepositoryService impl = new TestHarnessJBRMSServiceServlet();
+        
       
+        RepositoryService impl = getService();
+      
         String[] originalCats = impl.loadChildCategories( "/" );
         
         Boolean result = impl.createCategory( "/",
@@ -62,13 +66,13 @@
   public void testAddRuleAndListPackages() throws Exception {
       //ServiceImpl impl = new ServiceImpl(new RulesRepository(SessionHelper.getSession()));
       
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      ServiceImplementation impl = getService();
       
-      impl.repo.loadDefaultPackage();
-      impl.repo.createPackage( "another", "woot" );
+      impl.repository.loadDefaultPackage();
+      impl.repository.createPackage( "another", "woot" );
       
       
-      CategoryItem cat = impl.repo.loadCategory( "/" );
+      CategoryItem cat = impl.repository.loadCategory( "/" );
       cat.addCategory( "testAddRule", "yeah" );
       
       
@@ -99,11 +103,11 @@
   }
 
   public void testAttemptDupeRule() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
-      CategoryItem cat = impl.repo.loadCategory( "/" );
+      ServiceImplementation impl = getService();
+      CategoryItem cat = impl.repository.loadCategory( "/" );
       cat.addCategory( "testAttemptDupeRule", "yeah" );
       
-      impl.repo.createPackage("dupes", "yeah");
+      impl.repository.createPackage("dupes", "yeah");
       
       impl.createNewRule( "testAttemptDupeRule", "ya", "testAttemptDupeRule", "dupes", "rule" );
       
@@ -117,14 +121,14 @@
   }
   
   public void testRuleTableLoad() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      ServiceImplementation impl = getService();
       TableConfig conf = impl.loadTableConfig( AssetItemListViewer.RULE_LIST_TABLE_ID );
       assertNotNull(conf.headers);
       
-      CategoryItem cat = impl.repo.loadCategory( "/" );
+      CategoryItem cat = impl.repository.loadCategory( "/" );
       cat.addCategory( "testRuleTableLoad", "yeah" );
             
-      impl.repo.createPackage("testRuleTableLoad", "yeah");      
+      impl.repository.createPackage("testRuleTableLoad", "yeah");      
       impl.createNewRule( "testRuleTableLoad", "ya", "testRuleTableLoad", "testRuleTableLoad", "rule" );
       impl.createNewRule( "testRuleTableLoad2", "ya", "testRuleTableLoad", "testRuleTableLoad", "rule" );
 
@@ -151,8 +155,8 @@
   }
   
   public void testLoadRuleAsset() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
-      impl.repo.createPackage( "testLoadRuleAsset", "desc" );
+      ServiceImplementation impl = getService();
+      impl.repository.createPackage( "testLoadRuleAsset", "desc" );
       impl.createCategory( "", "testLoadRuleAsset", "this is a cat" );
       
       
@@ -185,8 +189,8 @@
       assertEquals(1, asset.metaData.categories.length);
       assertEquals("testLoadRuleAsset", asset.metaData.categories[0]);
       
-      AssetItem rule = impl.repo.loadPackage( "testLoadRuleAsset" ).loadAsset( "testLoadRuleAsset" );
-      impl.repo.createState( "whee" );
+      AssetItem rule = impl.repository.loadPackage( "testLoadRuleAsset" ).loadAsset( "testLoadRuleAsset" );
+      impl.repository.createState( "whee" );
       rule.updateState( "whee" );
       rule.checkin( "changed state" );
       asset = impl.loadRuleAsset( uuid );
@@ -205,8 +209,8 @@
   }
   
   public void testLoadAssetHistoryAndRestore() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
-      impl.repo.createPackage( "testLoadAssetHistory", "desc" );
+      ServiceImplementation impl = getService();
+      impl.repository.createPackage( "testLoadAssetHistory", "desc" );
       impl.createCategory( "", "testLoadAssetHistory", "this is a cat" );
       
       
@@ -245,7 +249,7 @@
   
   
   public void testCheckin() throws Exception {
-          TestHarnessJBRMSServiceServlet serv = new TestHarnessJBRMSServiceServlet();
+          RepositoryService serv = getService();
           
           serv.listPackages();
           
@@ -304,12 +308,12 @@
   
   
   public void testCreatePackage() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      ServiceImplementation impl = getService();
       PackageConfigData[] pkgs = impl.listPackages();
       String uuid = impl.createPackage( "testCreatePackage", "this is a new package" );
       assertNotNull( uuid );
       
-      PackageItem item = impl.repo.loadPackage( "testCreatePackage" );
+      PackageItem item = impl.repository.loadPackage( "testCreatePackage" );
       assertNotNull(item);
       assertEquals("this is a new package", item.getDescription());
       
@@ -323,13 +327,13 @@
   }
   
   public void testLoadPackageConfig() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
-      PackageItem it = impl.repo.loadDefaultPackage();
+      ServiceImplementation impl = getService();
+      PackageItem it = impl.repository.loadDefaultPackage();
       String uuid = it.getUUID();
       it.updateCoverage( "xyz" );
       it.updateExternalURI( "ext" );
       it.updateHeader( "header" );
-      impl.repo.save();
+      impl.repository.save();
       
       PackageConfigData data = impl.loadPackageConfig( uuid );
       assertNotNull(data);
@@ -343,7 +347,7 @@
   }
   
   public void testPackageConfSave() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String uuid = impl.createPackage( "testPackageConfSave", "a desc" );
       PackageConfigData data = impl.loadPackageConfig( uuid );
       
@@ -375,7 +379,7 @@
   }
   
   public void testListByFormat() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String cat = "testListByFormat";
       impl.createCategory( "/", cat, "ya" );
       String pkgUUID = impl.createPackage( "testListByFormat", "used for listing by format." );
@@ -432,7 +436,7 @@
   }
   
   public void testStatus() throws Exception {
-      TestHarnessJBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String uuid = impl.createState( "testStatus1" );
       assertNotNull(uuid);
       
@@ -486,7 +490,7 @@
   }
   
   public void testMovePackage() throws Exception {
-      JBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String[] cats = impl.loadChildCategories( "/" );
       if (cats.length == 0) {
           impl.createCategory( "/", "la", "d" );
@@ -517,7 +521,7 @@
   }
   
   public void testCopyAsset() throws Exception {
-      JBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       impl.createCategory( "/", "templates", "ya" );
       String uuid = impl.createNewRule( "testCopyAsset", "", "templates", "default", "drl" );
       String uuid2 = impl.copyAsset( uuid, "default", "testCopyAsset2" );
@@ -530,7 +534,7 @@
   }
   
   public void testSnapshot() throws Exception {
-      JBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       impl.createCategory( "/", "snapshotTesting", "y" );
       impl.createPackage( "testSnapshot", "d" );
       String uuid = impl.createNewRule( "testSnapshotRule", "", "snapshotTesting", "testSnapshot", "drl" );
@@ -572,7 +576,7 @@
   
   public void testRemoveCategory() throws Exception {
       
-      JBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String[] children = impl.loadChildCategories( "/" );
       impl.createCategory( "/", "testRemoveCategory", "foo" );
       
@@ -582,7 +586,7 @@
   }
   
   public void testLoadSuggestionCompletionEngine() throws Exception {
-      JBRMSServiceServlet impl = new TestHarnessJBRMSServiceServlet();
+      RepositoryService impl = getService();
       String uuid = impl.createPackage( "testSuggestionComp", "x" );
       PackageConfigData conf = impl.loadPackageConfig( uuid );
       conf.header = "import java.util.List";
@@ -592,5 +596,11 @@
       
   }
   
+  private ServiceImplementation getService() throws Exception {
+      ServiceImplementation impl = new ServiceImplementation();
+      impl.repository = new RulesRepository( TestEnvironmentSessionHelper.getSession() );
+      return impl;
+  }
+  
     
 }

Deleted: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/SessionHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/SessionHelper.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/SessionHelper.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -1,29 +0,0 @@
-package org.drools.brms.server;
-
-import javax.jcr.Repository;
-import javax.jcr.Session;
-
-import org.drools.brms.server.util.RepositoryManager;
-import org.drools.repository.RepositoryConfigurator;
-
-/**
- * A simple utility to create a single session for the unit tests.
- * This is not used by the servlet test, only by all the other ones.
- */
-public class SessionHelper {
-
-    public static Session testSession;
-    
-    public static Session getSession() throws Exception {
-        if (testSession == null) {
-            RepositoryConfigurator config = new RepositoryConfigurator();
-            Repository repo = RepositoryManager.getJCRRepository( config );
-            testSession = config.login( repo );
-            config.clearRulesRepository( testSession );
-            config.setupRulesRepository( testSession );
-        }
-        return testSession;
-        
-    }
-    
-}

Deleted: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/TestHarnessJBRMSServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/TestHarnessJBRMSServiceServlet.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/TestHarnessJBRMSServiceServlet.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -1,24 +0,0 @@
-package org.drools.brms.server;
-
-import org.drools.repository.RulesRepository;
-
-/**
- * This isn't really a mock, it just stubs out enough so I can test it from the servlet
- * down - at least the non servlet specific stuff.
- * 
- * @author michael neale.
- *
- */
-public class TestHarnessJBRMSServiceServlet extends JBRMSServiceServlet {
-
-    RulesRepository repo;
-
-    public TestHarnessJBRMSServiceServlet() throws Exception  {
-        repo = new RulesRepository(SessionHelper.getSession());        
-    }
-    
-    RulesRepository getRulesRepository() {        
-        return repo;
-    }
-
-}

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/BRMSRepositoryConfigurationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/BRMSRepositoryConfigurationTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/BRMSRepositoryConfigurationTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,15 @@
+package org.drools.brms.server.repository;
+
+import junit.framework.TestCase;
+
+public class BRMSRepositoryConfigurationTest extends TestCase {
+
+    public void testConfiguration() {
+        
+        BRMSRepositoryConfiguration config = new BRMSRepositoryConfiguration();
+        config.create();
+        assertNotNull(config.newSession("foo"));
+        assertNotSame(config.newSession("foo"), config.newSession("foo"));
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/BRMSRepositoryConfigurationTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/RulesRepositoryDecoratorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/RulesRepositoryDecoratorTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/RulesRepositoryDecoratorTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,24 @@
+package org.drools.brms.server.repository;
+
+import junit.framework.TestCase;
+
+public class RulesRepositoryDecoratorTest extends TestCase {
+
+    public void testDecorator() {
+        RulesRepositoryManager dec = new RulesRepositoryManager();
+        BRMSRepositoryConfiguration config = new BRMSRepositoryConfiguration();
+        config.create();
+        
+        dec.repositoryConfiguration = config;
+        dec.userName = "test";
+        dec.create();
+        
+        assertNotNull(dec.getRepository().getSession());
+        assertTrue(dec.getRepository().getSession().isLive());
+        dec.close();
+        assertFalse(dec.getRepository().getSession().isLive());
+        
+        
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/repository/RulesRepositoryDecoratorTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-23 10:48:15 UTC (rev 10467)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -1,19 +1,19 @@
 package org.drools.brms.server.rules;
 
+import junit.framework.TestCase;
+
 import org.drools.brms.client.common.AssetFormats;
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
-import org.drools.brms.server.SessionHelper;
+import org.drools.brms.server.util.TestEnvironmentSessionHelper;
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 import org.drools.repository.RulesRepository;
 
-import junit.framework.TestCase;
-
 public class SuggestionCompletionLoaderTest extends TestCase {
 
     public void testLoader() throws Exception {
         
-        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
         PackageItem item = repo.createPackage( "testLoader", "to test the loader" );
         item.updateHeader( "import java.util.Date" );
         repo.save();
@@ -41,7 +41,7 @@
     
     public void testFactTemplates() throws Exception {
         
-        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
         PackageItem item = repo.createPackage( "testLoader2", "to test the loader for fact templates" );
         item.updateHeader( "import java.util.Date\ntemplate Person\njava.lang.String name\nDate birthDate\nend" );
         repo.save();
@@ -68,7 +68,7 @@
     
     public void testLoadDSLs() throws Exception {
         String dsl = "[when]The agents rating is {rating}=doNothing()\n[then]Send a notification to manufacturing '{message}'=foo()";
-        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
         PackageItem item = repo.createPackage( "testLoadDSLs", "to test the loader for DSLs" );
         AssetItem asset = item.addAsset( "mydsl", "" );
         asset.updateFormat( AssetFormats.DSL );
@@ -90,7 +90,7 @@
     }
     
     public void testErrors() throws Exception {
-        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        RulesRepository repo = new RulesRepository(TestEnvironmentSessionHelper.getSession());
         PackageItem item = repo.createPackage( "testErrorsInPackage", "to test error handling" );
 
         SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/util/GWTNoSeamTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/util/GWTNoSeamTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/util/GWTNoSeamTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,26 @@
+package org.drools.brms.server.util;
+
+import org.drools.brms.server.ServiceImplementation;
+import org.jboss.seam.remoting.gwt.GWTToSeamAdapter;
+
+import junit.framework.TestCase;
+
+public class GWTNoSeamTest extends TestCase {
+
+    /**
+     * Check that my hacked Seam adapter is working.
+     * This is needed for hosted mode.
+     */
+    public void testTestSession() {
+        TestAdapter ad = new TestAdapter();
+        Object obj = ad.getComponent( "foobar" );
+        assertTrue(obj instanceof ServiceImplementation);
+    }    
+    
+    static class TestAdapter extends GWTToSeamAdapter {
+        public Object getComponent(String x) {
+            return super.getServiceComponent( x );
+        }
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/util/GWTNoSeamTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/AnotherService.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/AnotherService.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/AnotherService.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,15 @@
+package org.jboss.seam.remoting.gwt;
+
+import org.jboss.seam.annotations.WebRemote;
+
+public class AnotherService {
+
+    public boolean called = false;
+    
+    @WebRemote
+    public void doSomething() {
+        called = true;
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/AnotherService.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapterTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapterTest.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,79 @@
+package org.jboss.seam.remoting.gwt;
+
+import junit.framework.TestCase;
+
+import org.jboss.seam.remoting.gwt.GWTToSeamAdapter.ReturnedObject;
+
+public class GWTToSeamAdapterTest extends TestCase {
+
+    public void testAdapter() throws Exception {
+        MyServiceThingie service = new SubServiceThingie();
+        StubbedAdapter adapter = new StubbedAdapter(service);
+        
+        int startSize = StubbedAdapter.METHOD_CACHE.size();
+        
+        ReturnedObject obj = adapter.callWebRemoteMethod( "x", "doSomething", new Class[] {String.class}, new String[] {"yeah"} );
+        assertEquals(startSize + 1, StubbedAdapter.METHOD_CACHE.size());
+        assertEquals("yeah", service.something);
+        assertNull(obj.returnedObject);
+        assertEquals("x", adapter.calledService);
+        
+        //check its still the same size, ie the cache is working.
+        obj = adapter.callWebRemoteMethod( "x", "doSomething", new Class[] {String.class}, new String[] {"yeah"} );
+        assertEquals(startSize + 1, StubbedAdapter.METHOD_CACHE.size());        
+        
+        assertEquals(void.class, obj.returnType);
+        adapter.callWebRemoteMethod( "x", "doSomething", new Class[] {String.class}, new String[] {"no"} );
+        assertEquals("no", service.something);
+
+        
+        obj = adapter.callWebRemoteMethod( "x", "yeahYeah", null, null );
+        assertEquals(String.class, obj.returnType);
+        assertEquals("whee", obj.returnedObject);
+        
+        try {
+            adapter.callWebRemoteMethod( "x", "notMe", null, null );
+            fail("This should not be allowed");
+        } catch (SecurityException e) {
+            assertNotNull(e.getMessage());
+        }
+        
+        
+        try {
+            adapter.callWebRemoteMethod( "x", "abc", null, null );
+            fail("This should not be allowed");
+        } catch (SecurityException e) {
+            assertNotNull(e.getMessage());
+        }        
+        
+    }
+    
+
+    
+    public void testAnotherClass() throws Exception {
+        AnotherService b = new AnotherService();
+        GWTToSeamAdapter ad = new StubbedAdapter(b);
+        int oldSize = StubbedAdapter.METHOD_CACHE.size();
+        ad.callWebRemoteMethod( "y", "doSomething", null, null );
+        assertTrue(b.called);
+        assertEquals(oldSize + 1, StubbedAdapter.METHOD_CACHE.size());
+    }
+    
+    static class StubbedAdapter extends GWTToSeamAdapter {
+        private Object target;
+
+        public String calledService;
+        
+        public StubbedAdapter(Object target) {
+            this.target = target;
+        }
+        
+        @Override
+        protected Object getServiceComponent(String serviceIntfName) {
+            this.calledService = serviceIntfName;
+            return target;
+        }
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/GWTToSeamAdapterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/MyServiceThingie.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/MyServiceThingie.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/MyServiceThingie.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,21 @@
+package org.jboss.seam.remoting.gwt;
+
+import org.jboss.seam.annotations.WebRemote;
+
+public abstract class MyServiceThingie {
+
+    public String something;
+    
+    @WebRemote
+    public abstract void doSomething(String x);
+    
+    public String notMe() {
+        return "Not allowed as doesn't have WebRemote";
+    }
+    
+    @WebRemote
+    public String yeahYeah() {
+        return "whee";
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/MyServiceThingie.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/SubServiceThingie.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/SubServiceThingie.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/SubServiceThingie.java	2007-03-23 10:49:23 UTC (rev 10468)
@@ -0,0 +1,12 @@
+package org.jboss.seam.remoting.gwt;
+
+import org.jboss.seam.annotations.WebRemote;
+
+public class SubServiceThingie extends MyServiceThingie {
+
+    
+    public void doSomething(String x) {
+        something = x;
+    }    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/jboss/seam/remoting/gwt/SubServiceThingie.java
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list