Feature Toggle in Java

In our project, we choose togglz as a framework for feature toggle.

import togglz in project

We need to add these dependencies in project file build.gradle

  compile 'org.togglz:togglz-core:2.2.0.Final'
  compile 'org.togglz:togglz-servlet:2.2.0.Final'
  compile 'org.togglz:togglz-jsp:2.2.0.Final' //support jsp
  compile 'org.togglz:togglz-console:2.2.0.Final'  //support togglz console
  compile 'org.togglz:togglz-spring-security:2.2.0.Final' //support user authentication

  testCompile 'org.togglz:togglz-testing:2.2.0.Final' //support togglz test
  testCompile 'org.togglz:togglz-junit:2.2.0.Final' //support togglz test

config togglz in project

Add a new class ToggledFeature implements Feature

public enum ToggledFeature implements Feature {
    @Label("CONFIRM_PASSWORD")
    CONFIRM_PASSWORD,

    @Label("ADDRESS")
    ADDRESS,

    @Label("AGREE_TERMS")
    AGREE_TERMS,

    @Label("EMAIL_CONFIRMATION")
    EMAIL_CONFIRMATION;

    public boolean isActive() {
        return FeatureContext.getFeatureManager().isActive(this);
    }
}

Add a new class ToggledFeatureConfiguration implements TogglzConfig

public class ToggledFeatureConfiguration implements TogglzConfig{
    public Class<? extends Feature> getFeatureClass() {
        return ToggledFeature.class;
    }

    public StateRepository getStateRepository() {
        ClassLoader classLoader = getClass().getClassLoader();
        File file = new File(classLoader.getResource("features.properties").getFile());
        return new FileBasedStateRepository(file);
    }

    @Override
    public UserProvider getUserProvider() {
        return new SpringSecurityUserProvider("ROLE_ADMIN") {
        };
    }

}

Add a features.peoperties file to set togglz status

CONFIRM_PASSWORD=true
ADDRESS=true
AGREE_TERMS=true
EMAIL_CONFIRMATION=true

Then config togglz in web.xml

<context-param>
       <param-name>org.togglz.core.manager.TogglzConfig</param-name>
       <param-value>com.trailblazers.freewheelers.utils.ToggledFeature.ToggledFeatureConfiguration</param-value>
   </context-param>

   <filter>
       <filter-name>TogglzFilter</filter-name>
       <filter-class>org.togglz.servlet.TogglzFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>TogglzFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

Now we can use <togglz:feature> in JSP file

<%@ taglib prefix="togglz" uri="http://togglz.org/taglib"%>
    <togglz:feature name="AGREE_TERMS">
        <div>

        </div>
    </togglz:feature>

How to use togglz in Unit Test

public class ToggledFeaturesTest {

    @Rule
    public TogglzRule togglzRule = TogglzRule.allEnabled(ToggledFeature.class);

    @Test
    public void testToggleFeature() {

        assertTrue(ToggledFeature.CONFIRM_PASSWORD.isActive());

        togglzRule.disable(ToggledFeature.CONFIRM_PASSWORD);
        assertFalse(ToggledFeature.CONFIRM_PASSWORD.isActive());
    }

    @After
    public void tearDown() throws Exception {
        togglzRule.disableAll();
    }
}

How to show toggle console in browser

    <servlet>
        <servlet-name>TogglzConsoleServlet</servlet-name>
        <servlet-class>org.togglz.console.TogglzConsoleServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TogglzConsoleServlet</servlet-name>
        <url-pattern>/togglz/*</url-pattern>
    </servlet-mapping>