[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