[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