Author: mic...@jb... Date: 2006-01-25 06:29:25 -0500 (Wed, 25 Jan 2006) New Revision: 2194 Added: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/LocalStore.java trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalStoreTest.java Removed: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryException.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryFactory.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManager.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManagerImpl.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/ISaveHistory.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepoProxyHandler.java trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/IntegrationTest.java trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java Log: fixed up cascade saves, locking etc Added: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/LocalStore.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/LocalStore.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/LocalStore.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -0,0 +1,91 @@ +package org.drools.repository; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + + +/** + * This utility provides local persistence for rules. + * <p/> + * Rules can be saved to a single file for later synchronization with the repository. + * + * This uses XStream, as well as (optionally) object serialization. + * @author <a href="mailto:mic...@gm..."> Michael Neale</a> + */ +public class LocalStore { + + public static final int MODE_XSTREAM = 1; + public static final int MODE_OBJECT_SER = 2; + + private int mode = MODE_XSTREAM; + + /** Default instance. */ + public LocalStore() { + } + + /** Can use XStream for XML storage, or object serialization if required */ + public LocalStore(int mode) { + this.mode = mode; + } + + /** Saves the asset locally. Applies to the whole object graph */ + public void save(Asset ruleAsset, OutputStream out) { + if (mode == MODE_XSTREAM) { + OutputStreamWriter writer = new OutputStreamWriter(out); + getXStream().toXML(ruleAsset, writer); + } else if (mode == MODE_OBJECT_SER) { + try { + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(ruleAsset); + objOut.flush(); + } + catch ( IOException e ) { + throw new RepositoryException("Unable to store asset locally.", e); + } + } else { + throw new IllegalArgumentException("Unknown local persistence mode."); + } + } + + + /** Loads up the whole object graph. */ + public Asset load(InputStream input) { + if (mode == MODE_XSTREAM) { + InputStreamReader reader = new InputStreamReader(input); + Asset asset = (Asset) getXStream().fromXML(reader); + return asset; + } else if (mode == MODE_OBJECT_SER) { + try { + + ObjectInputStream objIn = new ObjectInputStream(input); + Asset asset = (Asset) objIn.readObject(); + return asset; + + } + catch ( Exception e ) { + throw new RepositoryException("Unable to store asset locally.", e); + } + } else { + throw new IllegalArgumentException("Unknown local persistence mode."); + } + + } + + private XStream getXStream() { + XStream xstream = new XStream(new DomDriver()); + return xstream; + } + + + + + +} Property changes on: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/LocalStore.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryException.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryException.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryException.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -21,4 +21,8 @@ super(message); } + public RepositoryException(String message, Throwable cause) { + super(message, cause); + } + } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryFactory.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryFactory.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryFactory.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -42,6 +42,17 @@ public static RepositoryManager getRepository(Principal currentUser, boolean stateful) { return getRepo(currentUser, stateful); } + + /** + * User this factory if you want to have audited, controlled access to the repository. + * + * @param currentUser the user accessing the repository. + */ + public static RepositoryManager getRepository(Principal currentUser) { + return getRepo(currentUser, false); + } + + private static RepositoryManager getProxy(RepoProxyHandler handler) { RepositoryManager manager = (RepositoryManager) Proxy.newProxyInstance(RepositoryFactory.class.getClassLoader(), Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManager.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManager.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManager.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -143,15 +143,15 @@ * * The properties should be (key, value) where value is the appropriate type of the field to query on. * The key maps to a " :key" item in your query string. - * + * <p/> * For instance, <code>query = "from RuleDef where versionNumber > :max and name = :name";</code> - * will have a map: + * will have a map:<p/> * <code> * map.put("max", new Long(42)); * map.put("name", "This is a String"); * //note the appropriate type to match the properties you want to search ! * </code> - * + * <p/> * @param query HQL query. Can be of the format "from ClassName where propertyName = :variableInMap" * You can also do "select name from RuleSetDef where ..." and so on. It will then return a list * of strings. If you do "select name, Id from RuleDef .." it will return a list of Object[] "tuples". Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManagerImpl.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManagerImpl.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RepositoryManagerImpl.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -9,6 +9,7 @@ import org.drools.repository.db.ISaveHistory; +import org.drools.repository.db.IVersionable; import org.hibernate.Query; import org.hibernate.Session; @@ -37,8 +38,6 @@ this.session = session; } - - /* (non-Javadoc) * @see org.drools.repository.db.RepositoryManager#loadRule(java.lang.String, long) */ @@ -83,9 +82,21 @@ return result; } + /** We will "manually" cascade changes to the ruleset */ public void save(Asset asset) { + if (asset instanceof RuleSetDef) { + cascadeChanges( (RuleSetDef) asset); + } session.saveOrUpdate( asset ); } + + public void cascadeChanges(RuleSetDef ruleSet) { + for ( Iterator iter = ruleSet.getModified().iterator(); iter.hasNext(); ) { + Asset asset = (Asset) iter.next(); + session.saveOrUpdate(asset); + iter.remove(); + } + } /* (non-Javadoc) * @see org.drools.repository.db.RepositoryManager#loadRuleSet(java.lang.String, long) @@ -219,6 +230,18 @@ session.update(attachment); } + + public List query(String query, + Map parameters) { + Query q = session.createQuery(query); + + for ( Iterator iter = parameters.keySet().iterator(); iter.hasNext(); ) { + String key = (String) iter.next(); + q.setParameter(key, parameters.get(key)); + } + + return q.list(); + } public void close() { /*implemented by the proxy */} @@ -245,21 +268,6 @@ session.disableFilter( "workingVersionFilter" ); } - - - public List query(String query, - Map parameters) { - Query q = session.createQuery(query); - - for ( Iterator iter = parameters.keySet().iterator(); iter.hasNext(); ) { - String key = (String) iter.next(); - q.setParameter(key, parameters.get(key)); - } - - return q.list(); - } - - /** Sets the current user principal for auditing, and access control purposes */ public void setCurrentUser(Principal user) { this.currentUser = user; Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleDef.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -240,21 +240,6 @@ this.historicalRecord = historicalRecord; } - public boolean isStateChanged(ISaveHistory oldObject) { - RuleDef old = (RuleDef) oldObject; - if (diffStr(this.getContent(), old.getContent())) { - return true; - } else { - return false; - } - } - - - /** return true if different */ - private boolean diffStr(String left, String right) { - return !left.equals(right); - } - private int getLockingVersion() { return lockingVersion; } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetAttachment.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -194,11 +194,6 @@ public void setHistoricalRecord(boolean historicalRecord) { this.historicalRecord = historicalRecord; } - - public boolean isStateChanged(ISaveHistory oldObject) { - return true; - } - } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/RuleSetDef.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -1,7 +1,5 @@ package org.drools.repository; -import java.util.List; -import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -44,7 +42,11 @@ private Set imports; private Set applicationData; private Set functions; + + private Set modifiedAssets = new HashSet(); + + public RuleSetDef(String name, MetaData meta) { this.name = name; @@ -57,6 +59,7 @@ this.applicationData = new HashSet(); this.imports = new HashSet(); this.workingVersionNumber = 1; + addNewVersionHistory("new"); } @@ -148,26 +151,32 @@ * The repository API has a delete(RuleDef rule) method * */ - public void removeRule(RuleDef rule) { - rule.setVersionNumber(IVersionable.NO_VERSION); + public void removeRule(RuleDef rule) { + rule.setOwningRuleSetName(null); + removeAsset(rule); } public void removeFunction(FunctionDef function) { - function.setVersionNumber(IVersionable.NO_VERSION); + removeAsset(function); } public void removeApplicationData(ApplicationDataDef appData) { - appData.setVersionNumber(IVersionable.NO_VERSION); + removeAsset(appData); } public void removeImport(ImportDef imp) { - imp.setVersionNumber(IVersionable.NO_VERSION); + removeAsset(imp); } public void removeAttachment(RuleSetAttachment attachment) { - attachment.setVersionNumber(IVersionable.NO_VERSION); + removeAsset(attachment); } + private void removeAsset(IVersionable asset) { + asset.setVersionNumber(IVersionable.NO_VERSION); + modifiedAssets.add(asset); + } + /** * @return a rule that is associated with this ruleset by the rules name. * If its not found, then it will return null. @@ -202,8 +211,26 @@ asset.setVersionComment( "new" ); } set.add( asset ); + + //don't forget this for cascasing ! + this.modifiedAssets.add( asset ); return this; } + + /** + * Call this so the repository knows what assets to save + * when the time comes to sync with the repository. + * + * This is only needed if you change the content of a rule for instance. + * Adding and removing things is automatic. + * + * This can be done so the ruleset temporarily remembers changes, + * or you can save the changes one by one yourself. + * @param A versionable asset (like a RuleDef, Function etc). + */ + public void modify(IVersionable asset) { + this.modifiedAssets.add( asset ); + } public MetaData getMetaData() { return metaData; @@ -289,7 +316,7 @@ * (think of that versioning as "minor" versions, and this sort of ruleset * versions as major versions). * - * Ideally once a new version is created, the RuleSet should be stored and + * IMPORTANT: once a new version is created, the RuleSet should be saved and * then loaded fresh, which will hide the non working versions of the rules. */ public void createNewVersion(String comment) { @@ -350,6 +377,7 @@ } } assets.addAll( newVersions ); + modifiedAssets.addAll( newVersions ); } public String toString() { @@ -397,6 +425,8 @@ this.imports = imports; } + Set getModified() { + return this.modifiedAssets; + } - } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/ISaveHistory.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/ISaveHistory.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/ISaveHistory.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -19,11 +19,6 @@ boolean isHistoricalRecord(); void setHistoricalRecord(boolean b); - /** - * - * @param oldObject Previous version of the object of this type. - * @return - */ - boolean isStateChanged(ISaveHistory oldObject); + } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepoProxyHandler.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepoProxyHandler.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/RepoProxyHandler.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -8,7 +8,6 @@ import org.drools.repository.RepositoryException; import org.drools.repository.RepositoryManagerImpl; import org.hibernate.Session; -import org.hibernate.StaleObjectStateException; import org.hibernate.Transaction; /** @@ -20,10 +19,10 @@ * This is the glue between the actual implementation and the interface. * * It also provides the stateful and stateless behaviour. - * Stateful simple means that a session instance is created the first time, and + * Stateful simple means that a new session instance is created the first time, and * kept around (long running sessions). + * Stateless uses getCurrentSession functionality in hibernate 3. * - * * It can also be extended to provide user context to the implementation class * (for auditing, access control and locking for instance). * @@ -109,7 +108,7 @@ InvocationTargetException e) { if (! (e.getTargetException() instanceof RepositoryException)) { try { - repoImpl.injectSession(null); + repoImpl.injectSession(null); //not really needed... but anyway session.close(); } catch (Exception e2) { /*ignore*/ } } Modified: trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/java/org/drools/repository/db/StoreEventListener.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -49,15 +49,14 @@ ISaveHistory prev = (ISaveHistory) session.load( entity.getClass(), versionable.getId(), LockMode.NONE ); - if ( versionable.isStateChanged( prev ) ) { - ISaveHistory copy = (ISaveHistory) prev.copy(); - copy.setHistoricalId( versionable.getId() ); - copy.setHistoricalRecord( true ); - session.save( copy ); - session.flush(); - session.close(); - } - + ISaveHistory copy = (ISaveHistory) prev.copy(); + copy.setHistoricalId( versionable.getId() ); + copy.setHistoricalRecord( true ); + //session.beginTransaction(); + session.save( copy ); + //session.getTransaction().commit(); + session.flush(); + session.close(); } /** Modified: trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml =================================================================== --- trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/main/resources/org/drools/repository/RuleSetDef.hbm.xml 2006-01-25 11:29:25 UTC (rev 2194) @@ -42,32 +42,39 @@ <one-to-many class="org.drools.repository.RuleSetVersionInfo"/> </set> - <!-- now come the versioned assets --> - <set name="rules" lazy="false" table="RULESET_RULES" cascade="all" optimistic-lock="false"> + <!-- now come the versioned assets + IMPORTANT: Note that cascading is done in the "save" method, not by hibernate + This is due to stop accidental version updates + + Note: the versioned asset sets are really "views" into the latest versions + of the assets. Hence no auto cascading. + + --> + <set name="rules" lazy="false" table="RULESET_RULES" cascade="none" optimistic-lock="false"> <key column="OWNING_RULESET_ID" /> <one-to-many class="org.drools.repository.RuleDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = VERSION_NUMBER" /> </set> - <set name="attachments" lazy="false" table="RULESET_ATTACHMENTS" cascade="all" optimistic-lock="false"> + <set name="attachments" lazy="false" table="RULESET_ATTACHMENTS" cascade="none" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.RuleSetAttachment"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = versionNumber" /> </set> - <set name="imports" lazy="false" table="RULESET_IMPORTS" cascade="all" optimistic-lock="false"> + <set name="imports" lazy="false" table="RULESET_IMPORTS" cascade="none" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.ImportDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = VERSION_NUMBER" /> </set> - <set name="functions" lazy="false" table="RULESET_FUNCTIONS" cascade="all" optimistic-lock="false"> + <set name="functions" lazy="false" table="RULESET_FUNCTIONS" cascade="none" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.FunctionDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = VERSION_NUMBER" /> </set> - <set name="applicationData" table="RULESET_APP_DATA" lazy="false" cascade="all" optimistic-lock="false"> + <set name="applicationData" table="RULESET_APP_DATA" lazy="false" cascade="none" optimistic-lock="false"> <key column="RULESET_ID"/> <one-to-many class="org.drools.repository.ApplicationDataDef"/> <filter name="workingVersionFilter" condition=":filteredVersionNumber = VERSION_NUMBER" /> Modified: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/IntegrationTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/IntegrationTest.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/IntegrationTest.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -1,5 +1,7 @@ package org.drools.repository; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.security.Principal; import java.util.HashMap; import java.util.Iterator; @@ -32,17 +34,69 @@ * Any failure will cause the test to stop, but this is not a unit test, * so that is acceptable. */ - public void testBootstrap() { + public void testBootstrap() throws Exception { runVersioningTests(); runAttachmentTests(); - + runLocalOfflineTests(); runConcurrentTests(); -// runLocalPersistTests(); } /** + * Test local store features, simulating 2 users running offline. + */ + private void runLocalOfflineTests() throws Exception { + + RuleSetDef setA = new RuleSetDef("offline1", null); + setA.addRule(new RuleDef("offline1", "blah")); + setA.addRule(new RuleDef("offline2", "blah")); + + RepositoryManager repo = RepositoryFactory.getStatefulRepository(); + repo.save(setA); + repo.close(); + + repo = RepositoryFactory.getStatefulRepository(); + //load up copy A + setA = repo.loadRuleSet("offline1", 1); + repo.close(); + + //now load up copy B + repo = RepositoryFactory.getStatefulRepository(); + RuleSetDef setB = repo.loadRuleSet("offline1", 1); + repo.close(); + + //now store them locally + LocalStore store = new LocalStore(); + ByteArrayOutputStream outA = new ByteArrayOutputStream(); + ByteArrayOutputStream outB = new ByteArrayOutputStream(); + store.save(setA, outA); + store.save(setB, outB); + + + setA = (RuleSetDef) store.load(new ByteArrayInputStream(outA.toByteArray())); + setB = (RuleSetDef) store.load(new ByteArrayInputStream(outB.toByteArray())); + //setA.addRule(new RuleDef("yeah", "boo")); + //setB.addRule(new RuleDef("goo", "ya")); + RuleDef rule1 = setA.findRuleByName("offline1"); + RuleDef rule2 = setB.findRuleByName("offline2"); + rule1.setContent("something"); + //setA.addApplicationData(new ApplicationDataDef("dsadsa", "dfsads")); + //setB.setMetaData(new MetaData()); + + //no problems expected, as they were editing different rules + repo = RepositoryFactory.getStatefulRepository(); + repo.save(setA); + repo.close(); + + repo = RepositoryFactory.getStatefulRepository(); + repo.save(setB); + repo.close(); + + } + + + /** * The purpose of this test is to simulate 2 different users editing rules * in different session. Detached and all. */ @@ -285,6 +339,7 @@ for ( Iterator iter = ruleSet.getRules().iterator(); iter.hasNext(); ) { RuleDef myRule = (RuleDef) iter.next(); myRule.setContent("CHANGED RULE TEXT"); + ruleSet.modify(myRule); //this should cause us to have some rule history saved. //this has nothing to do with ruleset versioning. } Deleted: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalPersistTest.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -1,34 +0,0 @@ -package org.drools.repository; - -import org.drools.repository.db.PersistentCase; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; - -public class LocalPersistTest extends PersistentCase { - - public void testXStream() { - RuleSetDef def = new RuleSetDef("xstream1", new MetaData()); - def.addRule(new RuleDef("rulex1", "ndklsanlkdsan")); - XStream xstream = new XStream(new DomDriver()); - String xml = xstream.toXML(def); - //System.out.println(xml); - - def = (RuleSetDef) xstream.fromXML(xml); - - RepositoryManager repo = getRepo(); - repo.save(def); - - def = repo.loadRuleSet("xstream1", 1); - xml = xstream.toXML(def); - //System.out.println(xml); - - def = (RuleSetDef) xstream.fromXML(xml); - def.addRule( new RuleDef("xstream2", "xxxx")); - repo.save(def); - - assertNotNull(def); - - } - -} Added: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalStoreTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalStoreTest.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalStoreTest.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -0,0 +1,117 @@ +package org.drools.repository; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +import org.drools.repository.db.PersistentCase; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +/** + * @author <a href="mailto:mic...@gm..."> Michael Neale</a> + */ +public class LocalStoreTest extends PersistentCase { + + public void testXStream() { + RuleSetDef def = getRuleSet(); + XStream xstream = new XStream(new DomDriver()); + String xml = xstream.toXML(def); + //System.out.println(xml); + + def = (RuleSetDef) xstream.fromXML(xml); + + RepositoryManager repo = getRepo(); + repo.save(def); + + def = repo.loadRuleSet("xstream1", 1); + xml = xstream.toXML(def); + //System.out.println(xml); + + def = (RuleSetDef) xstream.fromXML(xml); + def.addRule( new RuleDef("xstream2", "xxxx")); + repo.save(def); + + assertNotNull(def); + + } + + /** + * The aim of this is to create a ruledef in one session, persist and then load + * edit and save in a different session. + */ + public void testMultiSession() { + RuleSetDef def1 = new RuleSetDef("multiSess", new MetaData()); + def1.addApplicationData(new ApplicationDataDef("xx", "abc")); + def1.addRule(new RuleDef("multis1", "abc")); + + RepositoryManager repo = RepositoryFactory.getStatefulRepository(); + repo.save(def1); + repo.close(); + + LocalStore store = new LocalStore(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + store.save(def1, out); + + def1 = (RuleSetDef) store.load(new ByteArrayInputStream(out.toByteArray())); + def1.addRule(new RuleDef("multi12", "njkfdkj")); + def1.addAttachment(new RuleSetAttachment("dsl", "nothing", "yeah".getBytes(), "nil")); + def1.createNewVersion("new version"); + out = new ByteArrayOutputStream(); + store.save(def1, out); + + def1 = (RuleSetDef) store.load(new ByteArrayInputStream(out.toByteArray())); + + repo = RepositoryFactory.getStatefulRepository(); + repo.save(def1); + repo.close(); + + repo = RepositoryFactory.getStatefulRepository(); + RuleSetDef def2 = repo.loadRuleSet("multiSess", 2); + assertEquals(1, def2.getAttachments().size()); + assertEquals(2, def2.getWorkingVersionNumber()); + repo.close(); + + + } + + + public void testLocalStoreXstream() { + runSaveLoad(new LocalStore()); + } + + public void testLocalStoreObjectSerialization() { + runSaveLoad(new LocalStore(LocalStore.MODE_OBJECT_SER)); + } + + + + private void runSaveLoad(LocalStore local) { + + RuleSetDef set = getRuleSet(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + local.save(set, out); + + InputStream in = new ByteArrayInputStream(out.toByteArray()); + Asset result = local.load(in); + assertNotNull(result); + + RuleSetDef loaded = (RuleSetDef) result; + assertEquals(set.getName(), loaded.getName()); + assertEquals(set.getRules().size(), loaded.getRules().size()); + assertTrue(System.identityHashCode(set) != System.identityHashCode(loaded)); + } + + + private RuleSetDef getRuleSet() { + RuleSetDef def = new RuleSetDef("xstream1", new MetaData()); + def.addRule(new RuleDef("rulex1", "ndklsanlkdsan")); + return def; + } + + + +} Property changes on: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/LocalStoreTest.java ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RulePersistenceTest.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -119,6 +119,7 @@ rs = repo.loadRuleSet("rule history", 1); RuleDef firstLoaded = rs.findRuleByName("rh1"); firstLoaded.setContent("new again"); + rs.modify(firstLoaded); repo.save(rs); rs = repo.loadRuleSet("rule history", 1); Modified: trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java =================================================================== --- trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-24 22:55:11 UTC (rev 2193) +++ trunk/labs/jbossrules/drools-repository/src/test/java/org/drools/repository/RuleSetPersistenceTest.java 2006-01-25 11:29:25 UTC (rev 2194) @@ -33,6 +33,8 @@ //now modify the content of a rule, ensure it is saved RuleDef rule = (RuleDef) def2.getRules().iterator().next(); rule.setContent("Something new"); + def2.modify(rule); + repo.save(def2); def2 = repo.loadRuleSet("my ruleset", 1); @@ -129,6 +131,7 @@ def = repo.loadRuleSet("addRemove", 2); RuleDef onlyRule = (RuleDef) def.getRules().iterator().next(); def.removeRule(onlyRule); + assertEquals(null, onlyRule.getOwningRuleSetName()); //assertEquals(0, def.getRules().size()); repo.save(def); @@ -278,6 +281,7 @@ repo.save(old); assertEquals(0, repo.listSaveHistory(newRule).size()); newRule.setContent("CHANGED CONTENT"); + old.modify(newRule); repo.save(old); assertEquals(1, repo.listSaveHistory(newRule).size()); @@ -296,6 +300,7 @@ //just make sure it preserves content, and same ID (now new versions). func.setFunctionContent("xyz"); + def.modify(func); Long id = func.getId(); repo.save(def); def = repo.loadRuleSet("with functions", 1); |