[jboss-svn-commits] JBL Code SVN: r32788 - in labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src: main/java/org/drools/repository/services/assets and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 7 14:31:40 EDT 2010


Author: diegoll
Date: 2010-05-07 14:31:38 -0400 (Fri, 07 May 2010)
New Revision: 32788

Added:
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/assets/
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/assets/AssetFormats.java
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/MigrateRepository.java
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/producers/RulesRepositoryProducer.java
Modified:
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/RepositoryStartupService.java
   labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/test/java/org/drools/repository/services/tests/RepositoryStartupServiceTest.java
Log:
first RulesRepository created by CDI

Added: labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/assets/AssetFormats.java
===================================================================
--- labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/assets/AssetFormats.java	                        (rev 0)
+++ labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/assets/AssetFormats.java	2010-05-07 18:31:38 UTC (rev 32788)
@@ -0,0 +1,103 @@
+package org.drools.repository.services.assets;
+/*
+ * Copyright 2005 JBoss 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.
+ */
+
+
+/**
+ * Keeps track of the different rule formats we support.
+ * Each format type corresponds to the dublin core "format" attribute.
+ *
+ * This is used both by the UI, to determine what are valid formats, and also on the server.
+ * If you are adding new types they need to be registered here.
+ *
+ * If an asset type is unknown, then it will be opened with the default editor.
+ *
+ * @author Michael Neale
+ */
+public class AssetFormats {
+
+    /** For functions */
+    public static final String FUNCTION = "function";
+
+    /** For BPEL */
+    public static final String BPEL_PACKAGE= "bpel.jar";
+
+    /** For "model" assets */
+    public static final String MODEL = "jar";
+
+    /** For DSL language grammars */
+    public static final String DSL = "dsl";
+
+    /** Vanilla DRL "file" */
+    public static final String DRL = "drl";
+
+    /** Use the rule modeller */
+    public static final String BUSINESS_RULE = "brl";
+
+
+    /** use a DSL, free text editor */
+    public static final String DSL_TEMPLATE_RULE   = "dslr";
+
+
+    /** Use a decision table.*/
+    public static final String DECISION_SPREADSHEET_XLS = "xls";
+
+    public static final String DECISION_TABLE_GUIDED = "gdst";
+
+    /** Use a ruleflow.*/
+    public static final String RULE_FLOW_RF = "rf";
+    public static final String BPMN2_PROCESS = "bpmn";
+
+    /** Use a data enum.*/
+    public static final String ENUMERATION = "enumeration";
+
+    /** For test scenarios.  */
+    public static final String TEST_SCENARIO = "scenario";
+
+    /** For fact models in drl.     */
+    public static final String DRL_MODEL = "model.drl";
+    
+    public static final String XML = "xml";
+    
+    public static final String PROPERTIES = "properties";
+
+    public static final String WORKING_SET = "workingset";
+    
+    public static final String RULE_TEMPLATE = "template";
+    
+    /**
+     * The following group the assets together for lists, helpers etc...
+     */
+    public static final String[] BUSINESS_RULE_FORMATS = new String[]{AssetFormats.BUSINESS_RULE, AssetFormats.DSL_TEMPLATE_RULE, AssetFormats.DECISION_SPREADSHEET_XLS, AssetFormats.DECISION_TABLE_GUIDED, AssetFormats.RULE_TEMPLATE};
+
+    /**
+     * These define assets that are really package level "things". Used to decide when to flush any caches.
+     */
+    private static final String[] PACKAGE_DEPENCENCIES = new String[] {AssetFormats.FUNCTION, AssetFormats.DSL, AssetFormats.MODEL, AssetFormats.ENUMERATION, AssetFormats.DRL_MODEL, AssetFormats.WORKING_SET};
+
+    /**
+     * Will return true if the given asset format is a package dependency (eg a function, DSL, model etc).
+     * Package dependencies are needed before the package is validated, and any rule assets are processed.
+     */
+    public static boolean isPackageDependency(String format) {
+        for (String dep : PACKAGE_DEPENCENCIES) {
+            if (dep.equals( format )) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/MigrateRepository.java
===================================================================
--- labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/MigrateRepository.java	                        (rev 0)
+++ labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/MigrateRepository.java	2010-05-07 18:31:38 UTC (rev 32788)
@@ -0,0 +1,165 @@
+package org.drools.repository.services.internal;
+
+import javax.jcr.RepositoryException;
+
+import org.drools.compiler.xml.processes.RuleFlowMigrator;
+import org.drools.repository.AssetItem;
+import org.drools.repository.AssetItemIterator;
+import org.drools.repository.PackageItem;
+import org.drools.repository.PackageIterator;
+import org.drools.repository.RulesRepository;
+import org.drools.repository.services.assets.AssetFormats;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is used to migrate version 4 ruleflow assets in a version 4
+ * or 5 drools repository into version 5 ruleflow assets.
+ * IMPORTANT: the current code only performs the transformations if the
+ * Drools system property drools.ruleflow.port is true, just as the 
+ * drools compiler only transforms version 4 ruleflows to 5 if this
+ * property is set.
+ * 
+ * If a ruleflow is migrated, it is checked in as new version so that
+ * the previous version is preserved. The current code checks-in
+ * the new version as the admin user with an appropriate comment indicating
+ * that the flow has been migrated. Hover, the code could also be changed
+ * to check-in each migrated ruleflow using the credentials of the last
+ * person to check-in the ruleflow, however, in future there may be a 
+ * danger that the person who last checked in the file may have lost
+ * privileges to check-in the file, so we use the admin user
+ * for now.
+ * 
+ * @author Shahad Ahmed
+ */
+public class MigrateRepository {
+	
+	private static final Logger log  = LoggerFactory.getLogger( MigrateRepository.class );
+
+	
+	/*************************************************************************
+	 * Returns true if the drools system property drools.ruleflow.port is true
+	 * indicating that ruleflow migration should be performed.
+	 * @param repo
+	 * @return true if the drools system property drools.ruleflow.port is true
+     * indicating that ruleflow migration should be performed.
+	 * @throws RepositoryException
+	 ************************************************************************/
+	public static boolean needsRuleflowMigration(RulesRepository repo) throws RepositoryException {
+		String portRuleFlow = System.getProperty( "drools.ruleflow.port", "false" );
+		return portRuleFlow.equalsIgnoreCase("true");
+	}
+
+	
+	/*************************************************************************
+	 * Iterates through all the packages in the given repository  
+	 * migrating all drools 4 .rfm and .rf ruleflow assets that need to be 
+	 * migrated to 5.
+	 * Note that archived assets, and assets in snapshots are also migrated.
+	 * @param repo
+	 * @throws RepositoryException
+	 ************************************************************************/
+	public static void migrateRuleflows(RulesRepository repo) throws RepositoryException 
+	{
+		log.debug("AUTO MIGRATION: Performing drools ruleflow migration...");
+
+		PackageIterator pkgs = repo.listPackages();
+		boolean performed = false;
+		while(pkgs.hasNext()) {
+			performed = true;
+			PackageItem pkg = (PackageItem) pkgs.next();
+			migrateRuleflows(pkg);
+
+			String[] snaps = repo.listPackageSnapshots(pkg.getName());
+			if (snaps != null) {
+				for (int i = 0; i < snaps.length; i++) {
+					PackageItem snap = repo.loadPackageSnapshot(pkg.getName(), snaps[i]);
+					migrateRuleflows(snap);
+				}
+			}
+		}
+
+		if (performed) {
+			log.debug("AUTO MIGRATION: Drools rulesflow migration completed.");
+		}
+	}
+
+	
+	/*************************************************************************
+	 * migrate all ruleflows in the package, including archived ones.
+	 * The migrated ruleflow is checked in as a new version and previous 
+	 * versions are not migrated.
+	 * NOTE that we always try to migrate if the drools.ruleflow.port
+	 * property is true, even if the repository has been migrated before.
+	 * This is needed as the drools.ruleflow.port property may have been
+	 * false when the repository was first migrated (i.e. the 
+	 * HEADER_PROPERTY_NAME above may have been migrated, but not the 
+	 * ruleflows).
+	 * Also, all snapshot packages are updated as well.
+	 * @param pkg
+	 ************************************************************************/
+	private static void migrateRuleflows(PackageItem pkg) 
+	{
+		String portRuleFlow = System.getProperty( "drools.ruleflow.port", "false" );
+		if ( portRuleFlow.equalsIgnoreCase( "true" ) ) 
+		{
+			AssetItemIterator it = listAssetsByFormatIncludingArchived(pkg, 
+						new String[]{AssetFormats.RULE_FLOW_RF});
+
+			while(it.hasNext())
+			{
+				AssetItem item = it.next();
+				String rf = item.getContent();
+				try
+				{
+					if(RuleFlowMigrator.needToMigrateRFM(rf))
+					{
+						log.debug("Migrating v4 RFM to v5: " + item.getName());
+						rf = RuleFlowMigrator.portRFMToCurrentVersion(rf);
+						item.updateContent(rf);
+						item.checkin("Auto migration from ruleflow RFM version 4 to 5");
+					}
+					else if(RuleFlowMigrator.needToMigrateRF(rf))
+                    {
+                        log.debug("Migrating v4 RF to v5: " + item.getName());
+                        rf = RuleFlowMigrator.portRFToCurrentVersion(rf);
+                        item.updateContent(rf);
+                        item.checkin("Auto migration from ruleflow RF version 4 to 5");
+                    }
+				}
+				catch (Exception ex)
+				{
+					log.error("Ruleflow migration failed for item: " 
+							+ item.getName() + " due to " + ex);
+					ex.printStackTrace(System.out);
+				}
+
+			}
+		}
+	}
+	
+	
+    /*************************************************************************
+     * This will load an iterator for assets in the given package of the 
+     * given format type, including archived assets.
+     * @param pkg The package to check
+     * @param formats an array of the format types to find.
+     * @return an iterator for assets of the given format type, including
+     * archived assets.
+     ************************************************************************/
+    private static AssetItemIterator listAssetsByFormatIncludingArchived(PackageItem pkg,
+    		String[] formats) {
+        if (formats.length == 1) {
+            return pkg.queryAssets( "drools:format='" + formats[0] + "'" , true);
+        } else {
+            String predicate = " ( ";
+            for ( int i = 0; i < formats.length; i++ ) {
+                predicate = predicate + "drools:format='" + formats[i] + "'";
+                if (!(i == formats.length -1 )) { predicate =  predicate + " OR "; }
+            }
+            predicate = predicate + " ) ";
+            return pkg.queryAssets( predicate , true);
+        }
+    }
+
+}

Modified: labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/RepositoryStartupService.java
===================================================================
--- labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/RepositoryStartupService.java	2010-05-07 17:59:38 UTC (rev 32787)
+++ labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/RepositoryStartupService.java	2010-05-07 18:31:38 UTC (rev 32788)
@@ -1,4 +1,5 @@
 package org.drools.repository.services.internal;
+
 /*
  * Copyright 2005 JBoss Inc
  *
@@ -18,21 +19,74 @@
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
+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.RulesRepository;
+import org.drools.repository.RulesRepositoryAdministrator;
+import org.drools.repository.RulesRepositoryException;
 
-
 @Singleton
 @Named("repositoryConfiguration")
 public class RepositoryStartupService {
 
 	private JCRRepositoryConfigurator configurator;
+	private Repository repository;
+	private String repositoryHomeDirectory;
 
 	@Inject
 	public RepositoryStartupService(JCRRepositoryConfigurator configurator) {
 		this.configurator = configurator;
+		repository = configurator.getJCRRepository(repositoryHomeDirectory);
+		Session sessionForSetup = newSession("admin");
+		initialize(sessionForSetup);
+
+		// startMailboxService();
+		// registerCheckinListener();
 	}
 
+	/**
+	 * 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);
+		}
+	}
+
+	private void initialize(Session sessionForSetup) {
+
+		RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(sessionForSetup);
+		if (!admin.isRepositoryInitialized()) {
+			getConfigurator().setupRulesRepository(sessionForSetup);
+		}
+
+		//
+		// Migrate v4 ruleflows to v5
+		// This section checks if the repository contains drools v4
+		// ruleflows that need to be migrated to drools v5
+		//
+		RulesRepository repo = new RulesRepository(sessionForSetup);
+		try {
+			if (MigrateRepository.needsRuleflowMigration(repo)) {
+				MigrateRepository.migrateRuleflows(repo);
+			}
+		} catch (RepositoryException e) {
+			e.printStackTrace();
+			throw new RulesRepositoryException(e);
+		}
+	}
+
 	public JCRRepositoryConfigurator getConfigurator() {
 		return this.configurator;
 	}

Added: labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/producers/RulesRepositoryProducer.java
===================================================================
--- labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/producers/RulesRepositoryProducer.java	                        (rev 0)
+++ labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/main/java/org/drools/repository/services/internal/producers/RulesRepositoryProducer.java	2010-05-07 18:31:38 UTC (rev 32788)
@@ -0,0 +1,20 @@
+package org.drools.repository.services.internal.producers;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+import org.drools.repository.RulesRepository;
+import org.drools.repository.services.internal.RepositoryStartupService;
+
+public class RulesRepositoryProducer {
+
+    private static String READ_ONLY_USER = "anonymous";
+    
+    static
+	@Inject
+	@Produces
+	public RulesRepository produceRuleRepository(RepositoryStartupService repositoryStartupService){
+		return new RulesRepository(repositoryStartupService.newSession(READ_ONLY_USER));
+	}
+	
+}

Modified: labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/test/java/org/drools/repository/services/tests/RepositoryStartupServiceTest.java
===================================================================
--- labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/test/java/org/drools/repository/services/tests/RepositoryStartupServiceTest.java	2010-05-07 17:59:38 UTC (rev 32787)
+++ labs/jbossrules/branches/drools_repo_services_diega_baunax/drools-repository-services/src/test/java/org/drools/repository/services/tests/RepositoryStartupServiceTest.java	2010-05-07 18:31:38 UTC (rev 32788)
@@ -2,6 +2,7 @@
 
 import junit.framework.Assert;
 
+import org.drools.repository.RulesRepository;
 import org.drools.repository.services.internal.RepositoryStartupService;
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
@@ -23,4 +24,10 @@
 		Assert.assertNotNull(repositoryStartupService);
 		Assert.assertNotNull(repositoryStartupService.getConfigurator());
 	}
+	
+	@Test
+	public void testGetRuleRepository() {
+		RulesRepository rulesRepository = weld.instance().select(RulesRepository.class).get();
+		Assert.assertNotNull(rulesRepository);
+	}
 }



More information about the jboss-svn-commits mailing list