private void init(Properties properties) {
    this.immutable = false;

    this.chainedProperties = new ChainedProperties("rulebase.conf", this.classLoader, true);

    if (properties != null) {
      this.chainedProperties.addProperties(properties);
    }

    setSequentialAgenda(
        SequentialAgenda.determineSequentialAgenda(
            this.chainedProperties.getProperty(
                SequentialAgendaOption.PROPERTY_NAME, "sequential")));

    setSequential(
        Boolean.valueOf(this.chainedProperties.getProperty(SequentialOption.PROPERTY_NAME, "false"))
            .booleanValue());

    setRemoveIdentities(
        Boolean.valueOf(this.chainedProperties.getProperty("drools.removeIdentities", "false"))
            .booleanValue());

    setShareAlphaNodes(
        Boolean.valueOf(
                this.chainedProperties.getProperty(ShareAlphaNodesOption.PROPERTY_NAME, "true"))
            .booleanValue());

    setShareBetaNodes(
        Boolean.valueOf(
                this.chainedProperties.getProperty(ShareBetaNodesOption.PROPERTY_NAME, "true"))
            .booleanValue());

    setPermGenThreshold(
        Integer.parseInt(
            this.chainedProperties.getProperty(
                PermGenThresholdOption.PROPERTY_NAME, "" + PermGenThresholdOption.DEFAULT_VALUE)));

    setAlphaNodeHashingThreshold(
        Integer.parseInt(
            this.chainedProperties.getProperty(AlphaThresholdOption.PROPERTY_NAME, "3")));

    setCompositeKeyDepth(
        Integer.parseInt(
            this.chainedProperties.getProperty(CompositeKeyDepthOption.PROPERTY_NAME, "3")));

    setIndexLeftBetaMemory(
        Boolean.valueOf(
                this.chainedProperties.getProperty(IndexLeftBetaMemoryOption.PROPERTY_NAME, "true"))
            .booleanValue());
    setIndexRightBetaMemory(
        Boolean.valueOf(
                this.chainedProperties.getProperty(
                    IndexRightBetaMemoryOption.PROPERTY_NAME, "true"))
            .booleanValue());

    setIndexPrecedenceOption(
        IndexPrecedenceOption.determineIndexPrecedence(
            this.chainedProperties.getProperty(IndexPrecedenceOption.PROPERTY_NAME, "equality")));

    setAssertBehaviour(
        AssertBehaviour.determineAssertBehaviour(
            this.chainedProperties.getProperty(EqualityBehaviorOption.PROPERTY_NAME, "identity")));

    setExecutorService(
        this.chainedProperties.getProperty(
            "drools.executorService", "org.drools.core.concurrent.DefaultExecutorService"));

    setConsequenceExceptionHandler(
        this.chainedProperties.getProperty(
            ConsequenceExceptionHandlerOption.PROPERTY_NAME,
            "org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler"));

    setRuleBaseUpdateHandler(
        this.chainedProperties.getProperty("drools.ruleBaseUpdateHandler", ""));

    setConflictResolver(
        determineConflictResolver(
            this.chainedProperties.getProperty(
                "drools.conflictResolver", "org.drools.core.conflict.DepthConflictResolver")));

    setAdvancedProcessRuleIntegration(
        Boolean.valueOf(
                this.chainedProperties.getProperty(
                    "drools.advancedProcessRuleIntegration", "false"))
            .booleanValue());

    setMultithreadEvaluation(
        Boolean.valueOf(
                this.chainedProperties.getProperty(
                    MultithreadEvaluationOption.PROPERTY_NAME, "false"))
            .booleanValue());

    setMaxThreads(
        Integer.parseInt(this.chainedProperties.getProperty(MaxThreadsOption.PROPERTY_NAME, "3")));

    setEventProcessingMode(
        EventProcessingOption.determineEventProcessingMode(
            this.chainedProperties.getProperty(EventProcessingOption.PROPERTY_NAME, "cloud")));

    setMBeansEnabled(
        MBeansOption.isEnabled(
            this.chainedProperties.getProperty(MBeansOption.PROPERTY_NAME, "disabled")));

    setClassLoaderCacheEnabled(
        Boolean.valueOf(
            this.chainedProperties.getProperty(ClassLoaderCacheOption.PROPERTY_NAME, "true")));

    setPhreakEnabled(
        Boolean.valueOf(this.chainedProperties.getProperty(PhreakOption.PROPERTY_NAME, "false")));
    setDeclarativeAgendaEnabled(
        Boolean.valueOf(
            this.chainedProperties.getProperty(DeclarativeAgendaOption.PROPERTY_NAME, "false")));

    this.componentFactory = new ReteooComponentFactory();
  }
  public void setProperty(String name, String value) {
    name = name.trim();
    if (StringUtils.isEmpty(name)) {
      return;
    }

    if (name.equals(SequentialAgendaOption.PROPERTY_NAME)) {
      setSequentialAgenda(
          SequentialAgenda.determineSequentialAgenda(
              StringUtils.isEmpty(value) ? "sequential" : value));
    } else if (name.equals(SequentialOption.PROPERTY_NAME)) {
      setSequential(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(RemoveIdentitiesOption.PROPERTY_NAME)) {
      setRemoveIdentities(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(ShareAlphaNodesOption.PROPERTY_NAME)) {
      setShareAlphaNodes(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(ShareBetaNodesOption.PROPERTY_NAME)) {
      setShareBetaNodes(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(PermGenThresholdOption.PROPERTY_NAME)) {
      setPermGenThreshold(
          StringUtils.isEmpty(value)
              ? PermGenThresholdOption.DEFAULT_VALUE
              : Integer.parseInt(value));
    } else if (name.equals(AlphaThresholdOption.PROPERTY_NAME)) {
      setAlphaNodeHashingThreshold(StringUtils.isEmpty(value) ? 3 : Integer.parseInt(value));
    } else if (name.equals(CompositeKeyDepthOption.PROPERTY_NAME)) {
      setCompositeKeyDepth(StringUtils.isEmpty(value) ? 3 : Integer.parseInt(value));
    } else if (name.equals(IndexLeftBetaMemoryOption.PROPERTY_NAME)) {
      setIndexLeftBetaMemory(StringUtils.isEmpty(value) ? true : Boolean.valueOf(value));
    } else if (name.equals(IndexRightBetaMemoryOption.PROPERTY_NAME)) {
      setIndexRightBetaMemory(StringUtils.isEmpty(value) ? true : Boolean.valueOf(value));
    } else if (name.equals(IndexPrecedenceOption.PROPERTY_NAME)) {
      setIndexPrecedenceOption(
          StringUtils.isEmpty(value)
              ? IndexPrecedenceOption.EQUALITY_PRIORITY
              : IndexPrecedenceOption.determineIndexPrecedence(value));
    } else if (name.equals(EqualityBehaviorOption.PROPERTY_NAME)) {
      setAssertBehaviour(
          AssertBehaviour.determineAssertBehaviour(
              StringUtils.isEmpty(value) ? "identity" : value));
    } else if (name.equals(ConsequenceExceptionHandlerOption.PROPERTY_NAME)) {
      setConsequenceExceptionHandler(
          StringUtils.isEmpty(value) ? DefaultConsequenceExceptionHandler.class.getName() : value);
    } else if (name.equals("drools.ruleBaseUpdateHandler")) {
      setRuleBaseUpdateHandler(StringUtils.isEmpty(value) ? "" : value);
    } else if (name.equals("drools.conflictResolver")) {
      setConflictResolver(
          determineConflictResolver(
              StringUtils.isEmpty(value) ? DepthConflictResolver.class.getName() : value));
    } else if (name.equals("drools.advancedProcessRuleIntegration")) {
      setAdvancedProcessRuleIntegration(
          StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(MultithreadEvaluationOption.PROPERTY_NAME)) {
      setMultithreadEvaluation(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    } else if (name.equals(MaxThreadsOption.PROPERTY_NAME)) {
      setMaxThreads(StringUtils.isEmpty(value) ? 3 : Integer.parseInt(value));
    } else if (name.equals(EventProcessingOption.PROPERTY_NAME)) {
      setEventProcessingMode(
          EventProcessingOption.determineEventProcessingMode(
              StringUtils.isEmpty(value) ? "cloud" : value));
    } else if (name.equals(MBeansOption.PROPERTY_NAME)) {
      setMBeansEnabled(MBeansOption.isEnabled(value));
    } else if (name.equals(ClassLoaderCacheOption.PROPERTY_NAME)) {
      setClassLoaderCacheEnabled(StringUtils.isEmpty(value) ? true : Boolean.valueOf(value));
    } else if (name.equals(PhreakOption.PROPERTY_NAME)) {
      setPhreakEnabled(StringUtils.isEmpty(value) ? false : Boolean.valueOf(value));
    }
  }