← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 22016: EventReporting Removed

 

------------------------------------------------------------
revno: 22016
committer: Zubair Asghar<zubair@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2016-02-22 12:40:17 +0100
message:
  EventReporting Removed
removed:
  dhis-2/dhis-services/dhis-service-eventreporting/
  dhis-2/dhis-services/dhis-service-eventreporting/pom.xml
  dhis-2/dhis-services/dhis-service-eventreporting/src/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionDeletionHandler.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionSchedulingManager.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionTask.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultCaseAggregateConditionSchedulingManager.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultProgramSchedulingManager.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/ProgramSchedulingManager.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/SendScheduledMessageTask.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate/
  dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate/CaseAggregationCondition.hbm.xml
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionServiceTest.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStoreTest.java
  dhis-2/dhis-services/dhis-service-eventreporting/src/test/resources/
modified:
  dhis-2/dhis-services/pom.xml


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/pom.xml'
--- dhis-2/dhis-services/dhis-service-eventreporting/pom.xml	2016-01-15 00:52:40 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/pom.xml	1970-01-01 00:00:00 +0000
@@ -1,37 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0";
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd";>
-  <modelVersion>4.0.0</modelVersion>
-  
-  <parent>
-    <groupId>org.hisp.dhis</groupId>
-    <artifactId>dhis-services</artifactId>
-    <version>2.23-SNAPSHOT</version>
-  </parent>
-  
-  <artifactId>dhis-service-eventreporting</artifactId>
-  <packaging>jar</packaging>
-  <name>DHIS Event Reporting Service</name>
-  
-  <dependencies>
-    
-    <!-- DHIS -->
-        
-    <dependency>
-      <groupId>org.hisp.dhis</groupId>
-      <artifactId>dhis-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hisp.dhis</groupId>
-      <artifactId>dhis-service-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.hisp.dhis</groupId>
-      <artifactId>dhis-service-analytics</artifactId>
-    </dependency>
-    
-  </dependencies>
-  <properties>
-    <rootDir>../../</rootDir>
-  </properties>
-</project>

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionDeletionHandler.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionDeletionHandler.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionDeletionHandler.java	1970-01-01 00:00:00 +0000
@@ -1,148 +0,0 @@
-package org.hisp.dhis.caseaggregation;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Collection;
-
-import org.hisp.dhis.dataelement.DataElement;
-import org.hisp.dhis.dataelement.DataElementCategoryCombo;
-import org.hisp.dhis.program.Program;
-import org.hisp.dhis.system.deletion.DeletionHandler;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-
-/**
- * @author Chau Thu Tran
- */
-public class CaseAggregationConditionDeletionHandler
-    extends DeletionHandler
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private CaseAggregationConditionService aggregationConditionService;
-
-    public void setAggregationConditionService( CaseAggregationConditionService aggregationConditionService )
-    {
-        this.aggregationConditionService = aggregationConditionService;
-    }
-
-    // -------------------------------------------------------------------------
-    // DeletionHandler implementation
-    // -------------------------------------------------------------------------
-
-    @Override
-    protected String getClassName()
-    {
-        return CaseAggregationCondition.class.getSimpleName();
-    }
-
-    @Override
-    public String allowDeleteDataElement( DataElement dataElement )
-    {
-        Collection<CaseAggregationCondition> conditions = aggregationConditionService
-            .getCaseAggregationCondition( dataElement );
-
-        if ( conditions != null && conditions.size() > 0 )
-        {
-            return ERROR;
-        }
-
-        conditions = aggregationConditionService.getAllCaseAggregationCondition();
-
-        for ( CaseAggregationCondition condition : conditions )
-        {
-            Collection<DataElement> dataElements = aggregationConditionService.getDataElementsInCondition( condition
-                .getAggregationExpression() );
-
-            if ( dataElements != null && dataElements.contains( dataElement ) )
-            {
-                return ERROR;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String allowDeleteDataElementCategoryCombo( DataElementCategoryCombo categoryCombo )
-    {
-        Collection<CaseAggregationCondition> conditions = aggregationConditionService.getAllCaseAggregationCondition();
-
-        for ( CaseAggregationCondition condition : conditions )
-        {
-            if ( categoryCombo.getOptionCombos().contains( condition.getOptionCombo() ) )
-            {
-                return ERROR;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String allowDeleteProgram( Program program )
-    {
-        Collection<CaseAggregationCondition> conditions = aggregationConditionService
-            .getAllCaseAggregationCondition();
-
-        for ( CaseAggregationCondition condition : conditions )
-        {
-            Collection<Program> programs = aggregationConditionService.getProgramsInCondition( condition
-                .getAggregationExpression() );
-
-            if ( programs != null && programs.contains( program ) )
-            {
-                return condition.getName();
-            }
-        }
-
-        return null;
-    }
-    
-    @Override
-    public String allowDeleteTrackedEntityAttribute( TrackedEntityAttribute attribute )
-    {
-        Collection<CaseAggregationCondition> conditions = aggregationConditionService
-            .getAllCaseAggregationCondition();
-
-        for ( CaseAggregationCondition condition : conditions )
-        {
-            Collection<TrackedEntityAttribute> attributes = aggregationConditionService.getTrackedEntityAttributesInCondition( condition
-                .getAggregationExpression() );
-
-            if ( attributes != null && attributes.contains( attribute ) )
-            {
-                return condition.getName();
-            }
-        }
-
-        return null;
-    }
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/DefaultCaseAggregationConditionService.java	1970-01-01 00:00:00 +0000
@@ -1,665 +0,0 @@
-package org.hisp.dhis.caseaggregation;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_END_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_START_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ID;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ISO_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_ID;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_OBJECT;
-import static org.hisp.dhis.i18n.I18nUtils.i18n;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Future;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.hisp.dhis.common.Grid;
-import org.hisp.dhis.dataelement.DataElement;
-import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
-import org.hisp.dhis.dataelement.DataElementCategoryService;
-import org.hisp.dhis.dataelement.DataElementService;
-import org.hisp.dhis.i18n.I18n;
-import org.hisp.dhis.i18n.I18nFormat;
-import org.hisp.dhis.i18n.I18nService;
-import org.hisp.dhis.organisationunit.OrganisationUnit;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.program.Program;
-import org.hisp.dhis.program.ProgramService;
-import org.hisp.dhis.program.ProgramStage;
-import org.hisp.dhis.program.ProgramStageService;
-import org.hisp.dhis.scheduling.TaskId;
-import org.hisp.dhis.system.notification.Notifier;
-import org.hisp.dhis.system.util.DateUtils;
-import org.hisp.dhis.commons.util.ConcurrentUtils;
-import org.hisp.dhis.system.util.SystemUtils;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * @author Chau Thu Tran
- */
-@Transactional
-public class DefaultCaseAggregationConditionService
-    implements CaseAggregationConditionService
-{
-    private static final String INVALID_CONDITION = "Invalid condition";
-
-    private static final String IN_CONDITION_GET_ALL = "*";
-
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private CaseAggregationConditionStore aggregationConditionStore;
-
-    private DataElementService dataElementService;
-
-    private ProgramStageService programStageService;
-
-    private ProgramService programService;
-
-    private TrackedEntityAttributeService attributeService;
-
-    private PeriodService periodService;
-
-    private I18nService i18nService;
-    
-    @Autowired
-    private DataElementCategoryService categoryService;
-    
-    @Autowired
-    private Notifier notifier;
-    
-    // -------------------------------------------------------------------------
-    // Getters && Setters
-    // -------------------------------------------------------------------------
-
-    public void setAggregationConditionStore( CaseAggregationConditionStore aggregationConditionStore )
-    {
-        this.aggregationConditionStore = aggregationConditionStore;
-    }
-
-    public void setAttributeService( TrackedEntityAttributeService attributeService )
-    {
-        this.attributeService = attributeService;
-    }
-
-    public void setProgramService( ProgramService programService )
-    {
-        this.programService = programService;
-    }
-
-    public void setProgramStageService( ProgramStageService programStageService )
-    {
-        this.programStageService = programStageService;
-    }
-
-    public void setDataElementService( DataElementService dataElementService )
-    {
-        this.dataElementService = dataElementService;
-    }
-
-    public void setPeriodService( PeriodService periodService )
-    {
-        this.periodService = periodService;
-    }
-
-    public void setI18nService( I18nService service )
-    {
-        i18nService = service;
-    }
-
-    // -------------------------------------------------------------------------
-    // Implementation Methods
-    // -------------------------------------------------------------------------
-
-    @Override
-    public int addCaseAggregationCondition( CaseAggregationCondition caseAggregationCondition )
-    {
-        return aggregationConditionStore.save( caseAggregationCondition );
-    }
-
-    @Override
-    public void deleteCaseAggregationCondition( CaseAggregationCondition caseAggregationCondition )
-    {
-        aggregationConditionStore.delete( caseAggregationCondition );
-    }
-
-    @Override
-    public Collection<CaseAggregationCondition> getAllCaseAggregationCondition()
-    {
-        return i18n( i18nService, aggregationConditionStore.getAll() );
-    }
-
-    @Override
-    public CaseAggregationCondition getCaseAggregationCondition( int id )
-    {
-        return i18n( i18nService, aggregationConditionStore.get( id ) );
-    }
-
-    @Override
-    public CaseAggregationCondition getCaseAggregationCondition( String name )
-    {
-        return i18n( i18nService, aggregationConditionStore.getByName( name ) );
-    }
-
-    @Override
-    public CaseAggregationCondition getCaseAggregationConditionByUid( String uid )
-    {
-        return i18n( i18nService, aggregationConditionStore.getByUid( uid ) );
-    }
-
-    @Override
-    public void updateCaseAggregationCondition( CaseAggregationCondition caseAggregationCondition )
-    {
-        aggregationConditionStore.update( caseAggregationCondition );
-    }
-
-    @Override
-    public Collection<CaseAggregationCondition> getCaseAggregationCondition( DataElement dataElement )
-    {
-        return i18n( i18nService, aggregationConditionStore.get( dataElement ) );
-    }
-
-    @Override
-    public CaseAggregationCondition getCaseAggregationCondition( DataElement dataElement,
-        DataElementCategoryOptionCombo optionCombo )
-    {
-        return i18n( i18nService, aggregationConditionStore.get( dataElement, optionCombo ) );
-    }
-
-    @Override
-    public String getConditionDescription( String condition )
-    {
-        StringBuffer description = new StringBuffer();
-
-        Pattern patternCondition = Pattern.compile( CaseAggregationCondition.regExp );
-
-        Matcher matcher = patternCondition.matcher( condition );
-
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE_DATAELEMENT ) )
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-
-                int programId = Integer.parseInt( ids[0] );
-                Program program = programService.getProgram( programId );
-
-                String programStageId = ids[1];
-                String programStageName = "";
-                if ( !programStageId.equals( IN_CONDITION_GET_ALL ) )
-                {
-                    ProgramStage ps = programStageService.getProgramStage( Integer.parseInt( programStageId ) );
-                    if ( ps != null )
-                    {
-                        programStageName = ps.getName();
-                    }
-                }
-                else
-                {
-                    programStageName = programStageId;
-                }
-
-                int dataElementId = Integer.parseInt( ids[2] );
-                DataElement dataElement = dataElementService.getDataElement( dataElementId );
-
-                if ( program == null || dataElement == null || programStageName.isEmpty() )
-                {
-                    return INVALID_CONDITION;
-                }
-
-                matcher.appendReplacement( description, "[" + program.getDisplayName() + SEPARATOR_ID
-                    + programStageName + SEPARATOR_ID + dataElement.getName() + "]" );
-            }
-            else
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-
-                if ( info[0].equalsIgnoreCase( OBJECT_TRACKED_ENTITY_ATTRIBUTE ) )
-                {
-                    int objectId = Integer.parseInt( ids[0] );
-
-                    TrackedEntityAttribute attribute = attributeService.getTrackedEntityAttribute( objectId );
-
-                    if ( attribute == null )
-                    {
-                        return INVALID_CONDITION;
-                    }
-
-                    matcher.appendReplacement( description, "[" + OBJECT_TRACKED_ENTITY_ATTRIBUTE + SEPARATOR_OBJECT
-                        + attribute.getDisplayName() + "]" );
-                }
-                else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM ) )
-                {
-                    int objectId = Integer.parseInt( ids[0] );
-
-                    Program program = programService.getProgram( objectId );
-
-                    if ( program == null )
-                    {
-                        return INVALID_CONDITION;
-                    }
-
-                    String programDes = OBJECT_PROGRAM + SEPARATOR_ID + program.getDisplayName();
-                    if ( ids.length == 2 )
-                    {
-                        programDes += SEPARATOR_OBJECT + ids[1];
-                    }
-                    matcher.appendReplacement( description, "[" + programDes + "]" );
-                }
-                else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE )
-                    || info[0].equalsIgnoreCase( OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
-                {
-                    int objectId = Integer.parseInt( ids[0] );
-                    ProgramStage programStage = programStageService.getProgramStage( objectId );
-
-                    if ( programStage == null )
-                    {
-                        return INVALID_CONDITION;
-                    }
-
-                    String count = (ids.length == 2) ? SEPARATOR_ID + ids[1] : "";
-                    matcher.appendReplacement( description,
-                        "[" + info[0] + SEPARATOR_OBJECT + programStage.getDisplayName() + count + "]" );
-                }
-            }
-
-        }
-
-        matcher.appendTail( description );
-
-        return description.toString();
-    }
-
-    @Override
-    public Collection<DataElement> getDataElementsInCondition( String aggregationExpression )
-    {
-        String regExp = "\\[" + OBJECT_PROGRAM_STAGE_DATAELEMENT + SEPARATOR_OBJECT + "[0-9]+" + SEPARATOR_ID
-            + "[0-9]+" + SEPARATOR_ID + "[0-9]+" + "\\]";
-
-        Collection<DataElement> dataElements = new HashSet<>();
-
-        // ---------------------------------------------------------------------
-        // parse expressions
-        // ---------------------------------------------------------------------
-
-        Pattern pattern = Pattern.compile( regExp );
-
-        Matcher matcher = pattern.matcher( aggregationExpression );
-
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-            String[] ids = info[1].split( SEPARATOR_ID );
-
-            int dataElementId = Integer.parseInt( ids[2] );
-            DataElement dataElement = dataElementService.getDataElement( dataElementId );
-
-            dataElements.add( dataElement );
-        }
-
-        return dataElements;
-    }
-
-    @Override
-    public Collection<Program> getProgramsInCondition( String aggregationExpression )
-    {
-        String regExp = "\\[(" + OBJECT_PROGRAM + "|" + OBJECT_PROGRAM_STAGE_DATAELEMENT + ")" + SEPARATOR_OBJECT
-            + "[a-zA-Z0-9\\- ]+";
-
-        Collection<Program> programs = new HashSet<>();
-
-        // ---------------------------------------------------------------------
-        // parse expressions
-        // ---------------------------------------------------------------------
-
-        Pattern pattern = Pattern.compile( regExp );
-
-        Matcher matcher = pattern.matcher( aggregationExpression );
-
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-            String[] ids = info[1].split( SEPARATOR_ID );
-
-            int programId = Integer.parseInt( ids[0] );
-            Program program = programService.getProgram( programId );
-
-            programs.add( program );
-        }
-
-        return programs;
-    }
-
-    @Override
-    public Collection<TrackedEntityAttribute> getTrackedEntityAttributesInCondition( String aggregationExpression )
-    {
-        String regExp = "\\[" + OBJECT_TRACKED_ENTITY_ATTRIBUTE + SEPARATOR_OBJECT + "[0-9]+\\]";
-
-        Collection<TrackedEntityAttribute> attributes = new HashSet<>();
-
-        // ---------------------------------------------------------------------
-        // parse expressions
-        // ---------------------------------------------------------------------
-
-        Pattern pattern = Pattern.compile( regExp );
-
-        Matcher matcher = pattern.matcher( aggregationExpression );
-
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            int attributeId = Integer.parseInt( info[1] );
-            TrackedEntityAttribute attribute = attributeService.getTrackedEntityAttribute( attributeId );
-
-            attributes.add( attribute );
-        }
-
-        return attributes;
-    }
-
-    @Override
-    public Collection<CaseAggregationCondition> getCaseAggregationConditions( Collection<DataElement> dataElements, String key,Integer first, Integer max )
-    {
-        return i18n( i18nService, aggregationConditionStore.get( dataElements, key, first, max ) );
-    }
-
-    @Override
-    public int countCaseAggregationCondition( Collection<DataElement> dataElements, String key )
-    {
-        return aggregationConditionStore.count( dataElements, key );
-    }
-    
-    @Override
-    public void aggregate( List<CaseAggregateSchedule> caseAggregateSchedules, String taskStrategy, TaskId taskId )
-    {   
-        // Generate the periods
-        
-        for( CaseAggregateSchedule  schedule : caseAggregateSchedules ){
-            List<Period> periods = new ArrayList<>(aggregationConditionStore.getPeriods( schedule.getPeriodTypeName(),
-                taskStrategy ));
-            periodService.reloadPeriods( periods );
-        }
-        
-        ConcurrentLinkedQueue<CaseAggregateSchedule> queryBuilderQ = new ConcurrentLinkedQueue<>(
-            caseAggregateSchedules );
-        List<Future<?>> futures = new ArrayList<>();
-
-        for ( int i = 0; i < getProcessNo(); i++ )
-        { 
-            Future<?> future = aggregateValueManager( queryBuilderQ, taskStrategy, taskId );
-            if ( future != null )
-            {
-                futures.add( future );
-            }
-        }
-        
-        ConcurrentUtils.waitForCompletion( futures );
-    }
-
-    @Override
-    public List<Grid> getAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions, Collection<Integer> orgunitIds,
-        Collection<Period> periods, I18nFormat format, I18n i18n )
-    {
-        Collection<Integer> _orgunitIds = aggregationConditionStore.getServiceOrgunit();
-        _orgunitIds.retainAll( orgunitIds );
-        if ( _orgunitIds.size() > 0 )
-        {
-            int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
-            List<Grid> grids = new ArrayList<>();
-            for ( CaseAggregationCondition condition : caseAggregationConditions )
-            {  
-                String sql = aggregationConditionStore.parseExpressionToSql( false, condition, attributeOptioncomboId, _orgunitIds );
-                for ( Period period : periods )
-                {
-                    period =  periodService.reloadPeriod( period );
-                    String periodSQL = sql;
-                    periodSQL = replacePeriodSql( periodSQL, period );
-                   
-                    Grid grid = aggregationConditionStore.getAggregateValue( periodSQL, format, i18n );
-                    grid.setTitle( condition.getDisplayName() );
-                    grid.setSubtitle( format.formatPeriod( period ) );
-
-                    grids.add( grid );
-                }
-            }
-            
-            return grids;
-        }
-        
-        return null;
-    }
-    
-    @Override
-    public Grid getAggregateValueDetails( CaseAggregationCondition aggregationCondition, OrganisationUnit orgunit,
-        Period period, I18nFormat format, I18n i18n )
-    {
-        periodService.reloadPeriod( period );
-
-        boolean nonRegistrationProgram = singleEventWithoutRegistrationProgram( aggregationCondition.getAggregationExpression() );
-        return aggregationConditionStore.getAggregateValueDetails( aggregationCondition, orgunit, period, nonRegistrationProgram, format, i18n  );
-    }
-
-    @Override
-    public void insertAggregateValue( Collection<CaseAggregationCondition> caseAggregationConditions,
-        Collection<Integer> orgunitIds, Collection<Period> periods )
-    {
-        Collection<Integer> _orgunitIds = aggregationConditionStore.getServiceOrgunit();
-        _orgunitIds.retainAll( orgunitIds );
-        if ( _orgunitIds.size() > 0 )
-        {
-            DataElementCategoryOptionCombo attributeOptioncombo = categoryService.getDefaultDataElementCategoryOptionCombo();
-            for( CaseAggregationCondition caseAggregationCondition : caseAggregationConditions )
-            {
-                String sql = aggregationConditionStore.parseExpressionToSql(true, caseAggregationCondition, attributeOptioncombo.getId(), _orgunitIds );
-    
-                for ( Period period : periods )
-                {
-                    period = periodService.reloadPeriod( period );
-                    sql = replacePeriodSql( sql, period );
-                    aggregationConditionStore.insertAggregateValue( sql, caseAggregationCondition.getAggregationDataElement(), 
-                        caseAggregationCondition.getOptionCombo(), attributeOptioncombo, _orgunitIds, period );
-                }
-            }
-        }
-    }
-
-    @Override
-    public String parseExpressionDetailsToSql( String caseExpression, String operator, Integer orgunitId, Period period )
-    {
-        periodService.reloadPeriod( period );
-
-        boolean nonRegistrationProgram = singleEventWithoutRegistrationProgram( caseExpression );
-        return aggregationConditionStore.parseExpressionDetailsToSql( caseExpression, operator, orgunitId, period, nonRegistrationProgram );
-    }
-
-    @Override
-    public String parseExpressionToSql( boolean isInsert, String caseExpression, String operator,
-        Integer aggregateDeId, String aggregateDeName, Integer optionComboId, String optionComboName, Integer deSumId,
-        Collection<Integer> orgunitIds, Period period )
-    {
-        periodService.reloadPeriod( period );
-
-        int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
-        
-        String sql = aggregationConditionStore.parseExpressionToSql( isInsert, caseExpression, operator, aggregateDeId,
-            aggregateDeName, optionComboId, optionComboName, attributeOptioncomboId, deSumId, orgunitIds );
-        
-        return replacePeriodSql( sql, period );
-    }
-
-    @Override
-    public List<Integer> executeSQL( String sql )
-    {
-        return aggregationConditionStore.executeSQL( sql );
-    }
-    
-    // -------------------------------------------------------------------------
-    // Support Methods
-    // -------------------------------------------------------------------------
-
-    private String replacePeriodSql( String sql, Period period )
-    {
-        sql = sql.replaceAll( "COMBINE", "" );
-        sql = sql.replaceAll( PARAM_PERIOD_START_DATE,  DateUtils.getMediumDateString( period.getStartDate() ));
-        sql = sql.replaceAll( PARAM_PERIOD_END_DATE,  DateUtils.getMediumDateString( period.getEndDate() ));
-        sql = sql.replaceAll( PARAM_PERIOD_ID,  period.getId() + "" );
-        sql = sql.replaceAll( PARAM_PERIOD_ISO_DATE, period.getIsoDate() );
-
-        return sql;
-    }
-    
-    @Async
-    private Future<?> aggregateValueManager( ConcurrentLinkedQueue<CaseAggregateSchedule> caseAggregateSchedule,
-        String taskStrategy, TaskId taskId )
-    {
-        int attributeOptioncomboId = categoryService.getDefaultDataElementCategoryOptionCombo().getId();
-        
-        taskLoop: while ( true )
-        {
-            CaseAggregateSchedule condition = caseAggregateSchedule.poll();
-            if ( condition == null )
-            {
-                break taskLoop;
-            }
-
-            Collection<Period> periods = aggregationConditionStore.getPeriods( condition.getPeriodTypeName(),
-                taskStrategy );
-            if( taskId != null )
-            {
-                notifier.notify( taskId, "Importing data for " + condition.getCaseAggregateName() );
-            }
-            aggregationConditionStore.runAggregate( null, condition, periods, attributeOptioncomboId );
-        }
-
-        return null;
-    }
-
-    private int getProcessNo()
-    {
-        return Math.max( (SystemUtils.getCpuCores() - 1), 1 );
-    }
-
-    public Integer calValue( Collection<Integer> entityInstanceIds, String operator )
-    {
-        return entityInstanceIds.size();
-    }
-
-    private boolean singleEventWithoutRegistrationProgram( String expression )
-    {
-        Pattern patternCondition = Pattern.compile( CaseAggregationCondition.regExp );
-
-        Matcher matcher = patternCondition.matcher( expression );
-
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE_DATAELEMENT ) )
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-                
-                int programId = Integer.parseInt( ids[0] );
-                Program program = programService.getProgram( programId );
-
-                if ( program != null && !program.isRegistration() )
-                {
-                    return true;
-                }
-            }
-            else
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-
-                if ( info[0].equalsIgnoreCase( OBJECT_TRACKED_ENTITY_ATTRIBUTE ) )
-                {
-                    return false;
-                }
-                else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM ) )
-                {
-                    int objectId = Integer.parseInt( ids[0] );
-
-                    Program program = programService.getProgram( objectId );
-
-                    if ( program != null && !program.isRegistration() )
-                    {
-                        return true;
-                    }
-                }
-                else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE )
-                    || info[0].equalsIgnoreCase( OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
-                {
-                    int objectId = Integer.parseInt( ids[0] );
-                    ProgramStage programStage = programStageService.getProgramStage( objectId );
-                    if (programStage!=null && !programStage.getProgram().isRegistration() )
-                    {
-                        return true;
-                    }
-                }
-            }
-
-        }
-
-        return false;
-    }
-}

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/caseaggregation/hibernate/HibernateCaseAggregationConditionStore.java	1970-01-01 00:00:00 +0000
@@ -1,1424 +0,0 @@
-package org.hisp.dhis.caseaggregation.hibernate;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_PROGRAM_STAGE_PROPERTY;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_END_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ID;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_ISO_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.PARAM_PERIOD_START_DATE;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_ID;
-import static org.hisp.dhis.caseaggregation.CaseAggregationCondition.SEPARATOR_OBJECT;
-import static org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager.TASK_AGGREGATE_QUERY_BUILDER_LAST_12_MONTH;
-import static org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager.TASK_AGGREGATE_QUERY_BUILDER_LAST_3_MONTH;
-import static org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager.TASK_AGGREGATE_QUERY_BUILDER_LAST_6_MONTH;
-import static org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager.TASK_AGGREGATE_QUERY_BUILDER_LAST_MONTH;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.hibernate.Criteria;
-import org.hibernate.criterion.Order;
-import org.hibernate.criterion.Projections;
-import org.hibernate.criterion.Restrictions;
-import org.hisp.dhis.caseaggregation.CaseAggregateSchedule;
-import org.hisp.dhis.caseaggregation.CaseAggregationCondition;
-import org.hisp.dhis.caseaggregation.CaseAggregationConditionStore;
-import org.hisp.dhis.common.Grid;
-import org.hisp.dhis.common.GridHeader;
-import org.hisp.dhis.common.ValueType;
-import org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore;
-import org.hisp.dhis.commons.util.TextUtils;
-import org.hisp.dhis.dataelement.DataElement;
-import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
-import org.hisp.dhis.dataelement.DataElementService;
-import org.hisp.dhis.datavalue.DataValue;
-import org.hisp.dhis.datavalue.DataValueService;
-import org.hisp.dhis.i18n.I18n;
-import org.hisp.dhis.i18n.I18nFormat;
-import org.hisp.dhis.jdbc.StatementBuilder;
-import org.hisp.dhis.organisationunit.OrganisationUnit;
-import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.period.CalendarPeriodType;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.period.PeriodType;
-import org.hisp.dhis.system.grid.ListGrid;
-import org.hisp.dhis.system.util.DateUtils;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.support.rowset.SqlRowSet;
-
-/**
- * @author Chau Thu Tran
- */
-public class HibernateCaseAggregationConditionStore
-    extends HibernateIdentifiableObjectStore<CaseAggregationCondition>
-    implements CaseAggregationConditionStore
-{
-    private static final String IS_NULL = "is null";
-
-    private static final String IN_CONDITION_GET_ALL = "*";
-
-    private static final String IN_CONDITION_START_SIGN = "@";
-
-    private static final String IN_CONDITION_END_SIGN = "#";
-
-    private static final String IN_CONDITION_COUNT_X_TIMES = "COUNT";
-
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private JdbcTemplate jdbcTemplate;
-
-    @Override
-    public void setJdbcTemplate( JdbcTemplate jdbcTemplate )
-    {
-        this.jdbcTemplate = jdbcTemplate;
-    }
-
-    private StatementBuilder statementBuilder;
-
-    public void setStatementBuilder( StatementBuilder statementBuilder )
-    {
-        this.statementBuilder = statementBuilder;
-    }
-
-    private DataElementService dataElementService;
-
-    public void setDataElementService( DataElementService dataElementService )
-    {
-        this.dataElementService = dataElementService;
-    }
-
-    @Autowired
-    DataValueService dataValueService;
-
-    @Autowired
-    private PeriodService periodService;
-
-    @Autowired
-    private OrganisationUnitService orgunitService;
-
-    @Autowired
-    private TrackedEntityAttributeService attributeService;
-
-    // -------------------------------------------------------------------------
-    // Implementation Methods
-    // -------------------------------------------------------------------------
-
-    @SuppressWarnings( "unchecked" )
-    @Override
-    public Collection<CaseAggregationCondition> get( DataElement dataElement )
-    {
-        return getCriteria( Restrictions.eq( "aggregationDataElement", dataElement ) ).list();
-    }
-
-    @Override
-    public int count( Collection<DataElement> dataElements, String key )
-    {
-        Criteria criteria = getCriteria();
-
-        if ( dataElements != null )
-        {
-            criteria.add( Restrictions.in( "aggregationDataElement", dataElements ) );
-        }
-        if ( key != null )
-        {
-            criteria.add( Restrictions.ilike( "name", "%" + key + "%" ) );
-        }
-
-        Number rs = (Number) criteria.setProjection( Projections.rowCount() ).uniqueResult();
-        return rs != null ? rs.intValue() : 0;
-    }
-
-    @Override
-    public CaseAggregationCondition get( DataElement dataElement, DataElementCategoryOptionCombo optionCombo )
-    {
-        return (CaseAggregationCondition) getCriteria( Restrictions.eq( "aggregationDataElement", dataElement ),
-            Restrictions.eq( "optionCombo", optionCombo ) ).uniqueResult();
-    }
-
-    @SuppressWarnings( "unchecked" )
-    @Override
-    public Collection<CaseAggregationCondition> get( Collection<DataElement> dataElements, String key, Integer first,
-        Integer max )
-    {
-        Criteria criteria = getCriteria();
-
-        if ( dataElements != null )
-        {
-            criteria.add( Restrictions.in( "aggregationDataElement", dataElements ) );
-        }
-        if ( key != null )
-        {
-            criteria.add( Restrictions.ilike( "name", "%" + key + "%" ) );
-        }
-
-        if ( first != null && max != null )
-        {
-            criteria.setFirstResult( first );
-            criteria.setMaxResults( max );
-        }
-
-        criteria.addOrder( Order.desc( "name" ) );
-
-        return criteria.list();
-    }
-
-    @Override
-    public Grid getAggregateValue( String sql, I18nFormat format, I18n i18n )
-    {
-        Grid grid = new ListGrid();
-
-        grid.addHeader( new GridHeader( i18n.getString( "dataelementid" ), true, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboid" ), true, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "periodid" ), true, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "organisationunitid" ), true, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "storedby" ), true, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "dataelementname" ), false, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "categoryoptioncomboname" ), false, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "organisationunitname" ), false, true ) );
-        grid.addHeader( new GridHeader( i18n.getString( "value" ), false, true ) );
-
-        SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
-        grid.addRows( rs );
-
-        return grid;
-    }
-
-    @Override
-    public Grid getAggregateValueDetails( CaseAggregationCondition aggregationCondition, OrganisationUnit orgunit,
-        Period period, boolean nonRegistrationProgram, I18nFormat format, I18n i18n )
-    {
-        Grid grid = new ListGrid();
-        grid.setTitle( orgunit.getName() + " - " + aggregationCondition.getDisplayName() );
-        grid.setSubtitle( format.formatPeriod( period ) );
-
-        String sql = parseExpressionDetailsToSql( aggregationCondition.getAggregationExpression(),
-            aggregationCondition.getOperator(), orgunit.getId(), period, nonRegistrationProgram );
-
-        SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
-
-        for ( String colName : rs.getMetaData().getColumnNames() )
-        {
-            grid.addHeader( new GridHeader( i18n.getString( colName ), false, true ) );
-        }
-
-        addRows( rs, grid );
-
-        return grid;
-    }
-
-    public void addRows( SqlRowSet rs, Grid grid )
-    {
-        int cols = rs.getMetaData().getColumnCount();
-        String idValue = "";
-        int index = 1;
-        while ( rs.next() )
-        {
-            grid.addRow();
-            for ( int i = 1; i <= cols; i++ )
-            {
-                Object value = rs.getObject( i );
-                if ( i == 1 )
-                {
-                    if ( !value.toString().equals( idValue ) )
-                    {
-                        grid.addValue( index );
-                        idValue = value.toString();
-                        index++;
-                    }
-                    else
-                    {
-                        grid.addValue( "" );
-                    }
-                }
-                else
-                {
-                    grid.addValue( value );
-                }
-            }
-        }
-    }
-
-    @Override
-    public void insertAggregateValue( String sql, DataElement dataElement, DataElementCategoryOptionCombo optionCombo,
-        DataElementCategoryOptionCombo attributeOptionCombo, Collection<Integer> orgunitIds, Period period )
-    {
-        try
-        {
-            SqlRowSet row = jdbcTemplate.queryForRowSet( sql );
-            while ( row.next() )
-            {
-                int value = row.getInt( "value" );
-                OrganisationUnit source = orgunitService.getOrganisationUnit( row.getInt( "sourceid" ) );
-
-                DataValue dataValue = dataValueService.getDataValue( dataElement, period, source, optionCombo );
-
-                if ( dataValue == null )
-                {
-                    dataValue = new DataValue( dataElement, period, source, optionCombo, attributeOptionCombo );
-                    dataValue.setValue( value + "" );
-                    dataValue.setStoredBy( row.getString( "storedby" ) );
-                    dataValueService.addDataValue( dataValue );
-                }
-                else if ( dataValue != null && value == 0 && !dataElement.isZeroIsSignificant() )
-                {
-                    dataValueService.deleteDataValue( dataValue );
-                }
-                else if ( dataValue != null )
-                {
-                    dataValue.setValue( value + "" );
-                    dataValueService.updateDataValue( dataValue );
-                }
-            }
-        }
-        catch ( Exception ex )
-        {
-            ex.printStackTrace();
-        }
-    }
-
-    @Override
-    public void insertAggregateValue( String sql, int dataElementId, int optionComboId, Collection<Integer> orgunitIds,
-        Period period )
-    {
-        try
-        {
-            final String deleteDataValueSql = "delete from datavalue where dataelementid=" + dataElementId
-                + " and categoryoptioncomboid=" + optionComboId + " and sourceid in ("
-                + TextUtils.getCommaDelimitedString( orgunitIds ) + ") " + "and periodid = " + period.getId();
-            jdbcTemplate.update( deleteDataValueSql );
-
-            jdbcTemplate.update( sql );
-
-        }
-        catch ( Exception ex )
-        {
-            ex.printStackTrace();
-        }
-    }
-
-    @Override
-    public String parseExpressionToSql( boolean isInsert, CaseAggregationCondition aggregationCondition,
-        int attributeOptionComboId, Collection<Integer> orgunitIds )
-    {
-        String caseExpression = aggregationCondition.getAggregationExpression();
-        String operator = aggregationCondition.getOperator();
-        Integer aggregateDeId = aggregationCondition.getAggregationDataElement().getId();
-        String aggregateDeName = aggregationCondition.getAggregationDataElement().getName();
-        Integer optionComboId = aggregationCondition.getOptionCombo().getId();
-        String optionComboName = aggregationCondition.getOptionCombo().getName();
-        Integer deSumId = (aggregationCondition.getDeSum() == null) ? null : aggregationCondition.getDeSum().getId();
-
-        return parseExpressionToSql( isInsert, caseExpression, operator, aggregateDeId, aggregateDeName, optionComboId,
-            optionComboName, attributeOptionComboId, deSumId, orgunitIds );
-    }
-
-    @Override
-    public String parseExpressionToSql( boolean isInsert, String caseExpression, String operator, Integer aggregateDeId,
-        String aggregateDeName, Integer optionComboId, String optionComboName, int attributeOptioncomboId, Integer deSumId,
-        Collection<Integer> orgunitIds )
-    {
-        String select = "SELECT '" + aggregateDeId + "' as dataelementid, '" + optionComboId
-            + "' as categoryoptioncomboid, '" + attributeOptioncomboId
-            + "' as attributeoptioncomboid, ou.organisationunitid as sourceid, '" + PARAM_PERIOD_ID + "' as periodid,'"
-            + CaseAggregationCondition.AUTO_STORED_BY + "' as storedby, ";
-
-        if ( isInsert )
-        {
-            select = "INSERT INTO datavalue (dataelementid, categoryoptioncomboid, attributeoptioncomboid, sourceid, periodid, storedby, lastupdated, followup, created, value) "
-                + select + " now(), false, now(), ";
-        }
-        else
-        {
-            select += "'" + PARAM_PERIOD_ISO_DATE + "' as periodIsoDate,'" + aggregateDeName + "' as dataelementname, '"
-                + optionComboName + "' as categoryoptioncomboname, ou.name as organisationunitname, ";
-        }
-
-        String sql = select + " ( select ";
-        if ( operator.equals( CaseAggregationCondition.AGGRERATION_COUNT )
-            || operator.equals( CaseAggregationCondition.AGGRERATION_SUM ) )
-        {
-            if ( hasOrgunitProgramStageCompleted( caseExpression ) )
-            {
-                sql += createSQL( caseExpression, operator, orgunitIds );
-            }
-            else
-            {
-                if ( operator.equals( CaseAggregationCondition.AGGRERATION_COUNT ) )
-                {
-                    sql += " count(distinct(pi.trackedentityinstanceid)) as value ";
-                }
-                else
-                {
-                    sql += " count(psi.programinstanceid) as value ";
-                }
-
-                sql += "FROM ";
-                boolean hasDataelement = hasDataelementCriteria( caseExpression );
-                boolean hasEntityInstance = hasEntityInstanceCriteria( caseExpression );
-
-                if ( hasEntityInstance && hasDataelement )
-                {
-                    sql += " programinstance as pi ";
-                    sql += " INNER JOIN trackedentityinstance p on p.trackedentityinstanceid=pi.trackedentityinstanceid ";
-                    sql += " INNER JOIN programstageinstance psi ON pi.programinstanceid=psi.programinstanceid ";
-                }
-                else if ( hasEntityInstance )
-                {
-                    sql += " programinstance as pi INNER JOIN trackedentityinstance p on p.trackedentityinstanceid=pi.trackedentityinstanceid ";
-                }
-                else
-                {
-                    sql += " programinstance as pi ";
-                    sql += " INNER JOIN programstageinstance psi ON pi.programinstanceid=psi.programinstanceid ";
-                }
-
-                sql += " WHERE " + createSQL( caseExpression, operator, orgunitIds );
-
-                sql += "GROUP BY ou.organisationunitid ) from organisationunit ou where ou.organisationunitid in ( " + TextUtils.getCommaDelimitedString( orgunitIds ) + " ) ";
-            }
-        }
-        else
-        {
-            sql += " " + operator + "( cast( pdv.value as " + statementBuilder.getDoubleColumnType() + " ) ) ";
-            sql += "FROM trackedentitydatavalue pdv ";
-            sql += "    INNER JOIN programstageinstance psi  ";
-            sql += "            ON psi.programstageinstanceid = pdv.programstageinstanceid ";
-            sql += "WHERE executiondate >='" + PARAM_PERIOD_START_DATE + "'  ";
-            sql += "    AND executiondate <='" + PARAM_PERIOD_END_DATE + "' AND pdv.dataelementid=" + deSumId;
-
-            if ( caseExpression != null && !caseExpression.isEmpty() )
-            {
-                sql += " AND " + createSQL( caseExpression, operator, orgunitIds );
-            }
-
-            sql += "GROUP BY ou.organisationunitid ) from organisationunit ou where ou.organisationunitid in ( " + TextUtils.getCommaDelimitedString( orgunitIds ) + " ) ";
-
-        }
-
-        return sql;
-    }
-
-    @Override
-    public void runAggregate( Collection<Integer> orgunitIds, CaseAggregateSchedule condition, Collection<Period> periods, int attributeOptioncomboId )
-    {
-        Collection<Integer> _orgunitIds = getServiceOrgunit();
-
-        if ( orgunitIds == null )
-        {
-            orgunitIds = new HashSet<>();
-            orgunitIds.addAll( _orgunitIds );
-        }
-        else
-        {
-            orgunitIds.retainAll( _orgunitIds );
-        }
-
-        if ( !orgunitIds.isEmpty() )
-        {
-            String sql = "select caseaggregationconditionid, aggregationdataelementid, optioncomboid, "
-                + "aggregationexpression as caseexpression, operator as caseoperator, desum as desumid "
-                + "from caseaggregationcondition where caseaggregationconditionid = " + condition.getCaseAggregateId();
-
-            SqlRowSet rs = jdbcTemplate.queryForRowSet( sql );
-
-            if ( rs.next() )
-            {
-                String caseExpression = rs.getString( "caseexpression" );
-                int dataElementId = rs.getInt( "aggregationdataelementid" );
-                int optionComboId = rs.getInt( "optioncomboid" );
-                String caseOperator = rs.getString( "caseoperator" );
-                int deSumId = rs.getInt( "desumid" );
-                String insertParamsSql = parseExpressionToSql( true, caseExpression, caseOperator, dataElementId, "de_name", optionComboId, "optioncombo_name", attributeOptioncomboId, deSumId, _orgunitIds );
-
-                for ( Period period : periods )
-                {
-                    String insertSql = replacePeriodSql( insertParamsSql, period );
-                    insertAggregateValue( insertSql, dataElementId, optionComboId, _orgunitIds, period );
-                }
-
-            }
-        }
-    }
-
-    /**
-     * Return standard SQL from query builder formula
-     *
-     * @param caseExpression The query builder expression
-     * @param operator       There are six operators, includes Number of persons,
-     *                       Number of visits, Sum, Average, Minimum and Maximum of data
-     *                       element values.
-     * @param deType         Aggregate Data element type
-     * @param orgunitIds     The ids of organisation units where to aggregate data
-     *                       value
-     */
-    private String createSQL( String caseExpression, String operator, Collection<Integer> orgunitIds )
-    {
-        caseExpression = caseExpression.replaceAll( "\"", "'" );
-        boolean orgunitCompletedProgramStage = false;
-
-        StringBuffer sqlResult = new StringBuffer();
-
-        String sqlOrgunitCompleted = "";
-
-        // Date dataElement - dateOfIncident/executionDate/enrollmentDate
-
-        Map<Integer, String> minusDe1SQLMap = new HashMap<>();
-        int idxDe1 = 0;
-        Pattern patternMinus = Pattern.compile( CaseAggregationCondition.minusDataelementRegExp1 );
-        Matcher matcherMinus = patternMinus.matcher( caseExpression );
-        while ( matcherMinus.find() )
-        {
-            String programIdStr = matcherMinus.group( 1 );
-            String programStageIdStr = matcherMinus.group( 2 );
-            String dataElementId = matcherMinus.group( 3 );
-            String dateProperty = matcherMinus.group( 5 );
-            String compareSide = matcherMinus.group( 6 ) + matcherMinus.group( 7 );
-
-            Integer programId = null;
-            Integer programStageId = null;
-            if ( !programIdStr.equals( IN_CONDITION_GET_ALL ) )
-            {
-                programId = Integer.parseInt( programIdStr );
-            }
-
-            if ( !programStageIdStr.equals( IN_CONDITION_GET_ALL ) )
-            {
-                programStageId = Integer.parseInt( programStageIdStr );
-            }
-
-            minusDe1SQLMap.put(
-                idxDe1,
-                getConditionForMinusDataElement1( orgunitIds, programId, programStageId, Integer.parseInt( dataElementId ),
-                    dateProperty, compareSide ) );
-
-            caseExpression = caseExpression.replace( matcherMinus.group( 0 ), CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR_TYPE_ONE
-                + "_" + idxDe1 );
-
-            idxDe1++;
-        }
-
-        // dateOfIncident/executionDate/enrollmentDate - Date dataElement
-
-        Map<Integer, String> minusDe2SQLMap = new HashMap<>();
-        int idxDe2 = 0;
-        Pattern patternDE1Map = Pattern.compile( CaseAggregationCondition.minusDataelementRegExp2 );
-        Matcher matcherMinusDE1 = patternDE1Map.matcher( caseExpression );
-        while ( matcherMinusDE1.find() )
-        {
-            String dateProperty = matcherMinusDE1.group( 1 );
-            String programIdStr = matcherMinusDE1.group( 3 );
-            String programStageIdStr = matcherMinusDE1.group( 4 );
-            String dataElementId = matcherMinusDE1.group( 5 );
-            String compareSide = matcherMinusDE1.group( 6 ) + matcherMinusDE1.group( 7 );
-
-            Integer programId = null;
-            Integer programStageId = null;
-            if ( !programIdStr.equals( IN_CONDITION_GET_ALL ) )
-            {
-                programId = Integer.parseInt( programIdStr );
-            }
-
-            if ( !programStageIdStr.equals( IN_CONDITION_GET_ALL ) )
-            {
-                programStageId = Integer.parseInt( programStageIdStr );
-            }
-
-            minusDe2SQLMap.put(
-                idxDe2,
-                getConditionForMinusDataElement2( orgunitIds, programId, programStageId, Integer.parseInt( dataElementId ),
-                    dateProperty, compareSide ) );
-
-            caseExpression = caseExpression.replace( matcherMinusDE1.group( 0 ),
-                CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR_TYPE_TWO + "_" + idxDe2 );
-
-            idxDe2++;
-        }
-
-        // Date dataElement - Date dataElement
-
-        Map<Integer, String> minus2DeSQLMap = new HashMap<>();
-        int idx2De = 0;
-        Pattern patternMinus2 = Pattern.compile( CaseAggregationCondition.minus2DataelementRegExp );
-        Matcher matcherMinus2 = patternMinus2.matcher( caseExpression );
-
-        while ( matcherMinus2.find() )
-        {
-            String[] ids1 = matcherMinus2.group( 2 ).split( SEPARATOR_ID );
-            String[] ids2 = matcherMinus2.group( 5 ).split( SEPARATOR_ID );
-
-            minus2DeSQLMap.put(
-                idx2De,
-                getConditionForMisus2DataElement( orgunitIds, ids1[1], ids1[2], ids2[1], ids2[2],
-                    matcherMinus2.group( 6 ) + matcherMinus2.group( 7 ) ) );
-            caseExpression = caseExpression.replace( matcherMinus2.group( 0 ),
-                CaseAggregationCondition.MINUS_2DATAELEMENT_OPERATOR + "_" + idx2De );
-
-            idx2De++;
-        }
-
-        // currentDate/ dateOfIncident/executionDate/enrollmentDate - Date attribute
-
-        Map<Integer, String> minusAttr1SQLMap = new HashMap<>();
-        int idxAttr1 = 0;
-        Pattern patternMinus3 = Pattern.compile( CaseAggregationCondition.minusAttributeRegExp1 );
-        Matcher matcherMinus3 = patternMinus3.matcher( caseExpression );
-        while ( matcherMinus3.find() )
-        {
-            String property = matcherMinus3.group( 1 );
-            String attributeId = matcherMinus3.group( 3 );
-            String compareSide = matcherMinus3.group( 4 ) + matcherMinus3.group( 5 );
-            minusAttr1SQLMap.put(
-                idxAttr1,
-                getConditionForMisusAttribute1( attributeId, property, compareSide ) );
-
-            caseExpression = caseExpression.replace( matcherMinus3.group( 0 ),
-                CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR_TYPE_ONE + "_" + idxAttr1 );
-
-            idxAttr1++;
-        }
-
-
-        // Date attribute - currentDate/ dateOfIncident/executionDate/enrollmentDate
-
-        Map<Integer, String> minusAttr2SQLMap = new HashMap<>();
-        int idxAttr2 = 0;
-        Pattern patternAttr2Minus = Pattern.compile( CaseAggregationCondition.minusAttributeRegExp2 );
-
-        Matcher matcherAttr2Minus = patternAttr2Minus.matcher( caseExpression );
-        while ( matcherAttr2Minus.find() )
-        {
-            minusAttr2SQLMap.put(
-                idxAttr2,
-                getConditionForMisusAttribute2( matcherAttr2Minus.group( 1 ), matcherAttr2Minus.group( 3 ), matcherAttr2Minus.group( 4 ) + matcherAttr2Minus.group( 5 ) ) );
-
-            caseExpression = caseExpression.replace( matcherAttr2Minus.group( 0 ),
-                CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR_TYPE_TWO + "_" + idxAttr2 );
-
-            idxAttr2++;
-        }
-
-
-        //  Date attribute - Date attribute
-
-        Map<Integer, String> minus2AttrSQLMap = new HashMap<>();
-        int idx2Attr = 0;
-        Pattern patternAttrMinus2 = Pattern.compile( CaseAggregationCondition.minus2AttributeRegExp );
-        Matcher matcherAttrMinus2 = patternAttrMinus2.matcher( caseExpression );
-        while ( matcherAttrMinus2.find() )
-        {
-            String attribute1 = matcherAttrMinus2.group( 2 );
-            String attribute2 = matcherAttrMinus2.group( 5 );
-            String compareSide = matcherAttrMinus2.group( 6 ) + matcherAttrMinus2.group( 7 );
-            minus2AttrSQLMap.put( idx2Attr, getConditionForMisus2Attribute( attribute1, attribute2, compareSide ) );
-
-            caseExpression = caseExpression.replace( matcherAttrMinus2.group( 0 ),
-                CaseAggregationCondition.MINUS_2ATTRIBUTE_OPERATOR + "_" + idx2Attr );
-
-            idx2Attr++;
-        }
-
-
-        // Run nornal expression
-        String[] expression = caseExpression.split( "(AND|OR)" );
-        caseExpression = caseExpression.replaceAll( "AND", " ) AND " );
-        caseExpression = caseExpression.replaceAll( "OR", " ) OR " );
-
-        // ---------------------------------------------------------------------
-        // parse expressions
-        // ---------------------------------------------------------------------
-
-        Pattern patternCondition = Pattern.compile( CaseAggregationCondition.regExp );
-
-        Matcher matcherCondition = patternCondition.matcher( caseExpression );
-
-        String condition = "";
-
-        int index = 0;
-        while ( matcherCondition.find() )
-        {
-            String match = matcherCondition.group();
-
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-            if ( info[0].equalsIgnoreCase( OBJECT_TRACKED_ENTITY_ATTRIBUTE ) )
-            {
-                String attributeId = info[1];
-
-                String compareValue = expression[index].replace( "[" + match + "]", "" ).trim();
-
-                boolean isExist = compareValue.equals( IS_NULL ) ? false : true;
-                condition = getConditionForTrackedEntityAttribute( attributeId, orgunitIds, isExist );
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE_DATAELEMENT ) )
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-
-                int programId = Integer.parseInt( ids[0] );
-                String programStageId = ids[1];
-                int dataElementId = Integer.parseInt( ids[2] );
-
-                String compareValue = expression[index].replace( "[" + match + "]", "" ).trim();
-
-                boolean isExist = compareValue.equals( IS_NULL ) ? false : true;
-                condition = getConditionForDataElement( isExist, programId, programStageId, dataElementId, orgunitIds );
-            }
-
-            else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_PROPERTY ) )
-            {
-                condition = getConditionForProgramProperty( operator, info[1] );
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM ) )
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-                condition = getConditionForProgram( ids[0], operator, orgunitIds );
-                if ( ids.length > 1 )
-                {
-                    condition += ids[1];
-                }
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE ) )
-            {
-                String[] ids = info[1].split( SEPARATOR_ID );
-                if ( ids.length == 2 && ids[1].equals( IN_CONDITION_COUNT_X_TIMES ) )
-                {
-                    condition = getConditionForCountProgramStage( ids[0], operator, orgunitIds );
-                }
-                else
-                {
-                    condition = getConditionForProgramStage( ids[0], orgunitIds );
-                }
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_PROGRAM_STAGE_PROPERTY ) )
-            {
-                condition = getConditionForProgramStageProperty( info[1], operator, orgunitIds );
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY ) )
-            {
-                condition = getConditionForTrackedEntityProgramStageProperty( info[1], operator );
-            }
-            else if ( info[0].equalsIgnoreCase( OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
-            {
-                sqlOrgunitCompleted += getConditionForOrgunitProgramStageCompleted( info[1], operator, orgunitIds,
-                    orgunitCompletedProgramStage );
-                orgunitCompletedProgramStage = true;
-            }
-
-            matcherCondition.appendReplacement( sqlResult, condition );
-
-            index++;
-        }
-
-        matcherCondition.appendTail( sqlResult );
-
-        if ( !sqlOrgunitCompleted.isEmpty() )
-        {
-            sqlOrgunitCompleted = sqlOrgunitCompleted.substring( 0, sqlOrgunitCompleted.length() - 2 );
-        }
-
-        sqlResult.append( sqlOrgunitCompleted );
-
-        String sql = sqlResult.toString();
-
-        sql = sql.replaceAll( IN_CONDITION_START_SIGN, "(" );
-        sql = sql.replaceAll( IN_CONDITION_END_SIGN, ")" );
-        sql = sql.replaceAll( IS_NULL, " " );
-        for ( int i = 0; i < idxDe1; i++ )
-        {
-            sql = sql.replace( CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR_TYPE_ONE + "_" + i, minusDe1SQLMap.get( i ) );
-        }
-
-
-        for ( int i = 0; i < idxDe2; i++ )
-        {
-            sql = sql.replace( CaseAggregationCondition.MINUS_DATAELEMENT_OPERATOR_TYPE_TWO + "_" + i,
-                minusDe2SQLMap.get( i ) );
-        }
-
-        for ( int i = 0; i < idx2De; i++ )
-        {
-            sql = sql
-                .replace( CaseAggregationCondition.MINUS_2DATAELEMENT_OPERATOR + "_" + i, minus2DeSQLMap.get( i ) );
-        }
-
-        for ( int i = 0; i < idxAttr1; i++ )
-        {
-            sql = sql
-                .replace( CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR_TYPE_ONE + "_" + i, minusAttr1SQLMap.get( i ) );
-        }
-
-        for ( int i = 0; i < idxAttr2; i++ )
-        {
-            sql = sql
-                .replace( CaseAggregationCondition.MINUS_ATTRIBUTE_OPERATOR_TYPE_TWO + "_" + i, minusAttr2SQLMap.get( i ) );
-        }
-
-        for ( int i = 0; i < idx2Attr; i++ )
-        {
-            sql = sql
-                .replace( CaseAggregationCondition.MINUS_2ATTRIBUTE_OPERATOR + "_" + i, minus2AttrSQLMap.get( i ) );
-        }
-
-        sql = sql.replaceAll( CaseAggregationCondition.CURRENT_DATE, "now()" );
-
-        sql += " ) ";
-        if ( hasDataelementCriteria( caseExpression ) )
-        {
-            sql += " and psi.organisationunitid=ou.organisationunitid ";
-        }
-        else
-        {
-            sql += " and pi.organisationunitid=ou.organisationunitid ";
-        }
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL of the expression to compare data value as null
-     */
-    private String getConditionForDataElement( boolean isExist, int programId, String programStageId,
-        int dataElementId, Collection<Integer> orgunitIds )
-    {
-        String keyExist = isExist ? "EXISTS" : "NOT EXISTS";
-
-        String sql = " " + keyExist + " ( SELECT * "
-            + "FROM trackedentitydatavalue _pdv inner join programstageinstance _psi "
-            + "ON _pdv.programstageinstanceid=_psi.programstageinstanceid JOIN programinstance _pi "
-            + "ON _pi.programinstanceid=_psi.programinstanceid "
-            + "WHERE psi.programstageinstanceid=_pdv.programstageinstanceid AND _pdv.dataelementid=" + dataElementId
-            + "  AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  "
-            + "  AND _pi.programid = " + programId + " AND _psi.executionDate>='" + PARAM_PERIOD_START_DATE
-            + "' AND _psi.executionDate <= '" + PARAM_PERIOD_END_DATE + "' ";
-
-        if ( !programStageId.equals( IN_CONDITION_GET_ALL ) )
-        {
-            sql += " AND _psi.programstageid = " + programStageId;
-        }
-
-        if ( isExist )
-        {
-            ValueType valueType = dataElementService.getDataElement( dataElementId ).getValueType();
-
-            if ( valueType.isNumeric() )
-            {
-                sql += " AND ( cast( _pdv.value as " + statementBuilder.getDoubleColumnType() + " )  ) ";
-            }
-            else
-            {
-                sql += " AND _pdv.value ";
-            }
-        }
-
-        if ( !isExist )
-        {
-            sql = "(" + sql + " ) AND " + getConditionForProgramStage( programStageId, orgunitIds ) + ")";
-        }
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL of a dynamic tracked-entity-attribute expression. E.g
-     * [CA:1] OR [CA:1.age]
-     */
-    private String getConditionForTrackedEntityAttribute( String attributeId, Collection<Integer> orgunitIds,
-        boolean isExist )
-    {
-        String sql = "  SELECT * FROM trackedentityattributevalue _pav ";
-
-        if ( attributeId.split( SEPARATOR_ID ).length == 2 )
-        {
-            if ( attributeId.split( SEPARATOR_ID )[1].equals( CaseAggregationCondition.FORMULA_VISIT ) )
-            {
-                sql += " inner join programinstance _pi on _pav.trackedentityinstanceid=_pi.trackedentityinstanceid ";
-                sql += " inner join programstageinstance _psi on _pi.programinstanceid=_psi.programinstanceid ";
-
-                attributeId = attributeId.split( SEPARATOR_ID )[0];
-                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
-                    + attributeId + " AND DATE(_psi.executiondate) - DATE( _pav.value ) ";
-            }
-            else if ( attributeId.split( SEPARATOR_ID )[1].equals( CaseAggregationCondition.FORMULA_AGE ) )
-            {
-                sql += " inner join programinstance _pi on _pav.trackedentityinstanceid=_pi.trackedentityinstanceid ";
-
-                attributeId = attributeId.split( SEPARATOR_ID )[0];
-                sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
-                    + attributeId + " AND DATE(_psi.enrollmentdate) - DATE( _pav.value ) ";
-            }
-        }
-        else
-        {
-            sql += " WHERE _pav.trackedentityinstanceid=pi.trackedentityinstanceid AND _pav.trackedentityattributeid="
-                + attributeId;
-
-            if ( isExist )
-            {
-                TrackedEntityAttribute attribute = attributeService.getTrackedEntityAttribute( Integer.parseInt( attributeId ) );
-
-                if ( ValueType.NUMBER == attribute.getValueType() )
-                {
-                    sql += " AND cast( _pav.value as " + statementBuilder.getDoubleColumnType() + " )  ";
-                }
-                else
-                {
-                    sql += " AND _pav.value ";
-                }
-            }
-        }
-
-        if ( isExist )
-        {
-            sql = " EXISTS ( " + sql;
-        }
-        else
-        {
-            sql = " NOT EXISTS ( " + sql;
-        }
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL of the program-property expression. E.g
-     * [PC:executionDate]
-     */
-    private String getConditionForTrackedEntityProgramStageProperty( String propertyName, String operator )
-    {
-        String sql = " EXISTS ( SELECT _psi.programstageinstanceid from programstageinstance _psi "
-            + "WHERE _psi.programstageinstanceid=psi.programstageinstanceid AND ( _psi.executionDate BETWEEN '"
-            + PARAM_PERIOD_START_DATE + "' AND '" + PARAM_PERIOD_END_DATE + "') AND " + propertyName;
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL of the program expression. E.g
-     * [PP:DATE@enrollmentdate#-DATE@dateofincident#] for geting the number of
-     * days between date of enrollment and date of incident.
-     */
-    private String getConditionForProgramProperty( String operator, String property )
-    {
-        String sql = " EXISTS ( SELECT _pi.programinstanceid FROM programinstance as _pi WHERE _pi.programinstanceid=pi.programinstanceid AND "
-            + "pi.enrollmentdate >= '"
-            + PARAM_PERIOD_START_DATE
-            + "' AND pi.enrollmentdate <= '"
-            + PARAM_PERIOD_END_DATE + "' AND " + property + " ";
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL to retrieve the number of persons enrolled into the
-     * program. E.g [PG:1]
-     */
-    private String getConditionForProgram( String programId, String operator, Collection<Integer> orgunitIds )
-    {
-        String sql = " EXISTS ( SELECT * FROM programinstance as _pi inner join trackedentityinstance _p on _p.trackedentityinstanceid=_pi.trackedentityinstanceid "
-            + "WHERE _pi.trackedentityinstanceid=pi.trackedentityinstanceid AND _pi.programid="
-            + programId
-            + " AND _pi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") AND _pi.enrollmentdate >= '"
-            + PARAM_PERIOD_START_DATE
-            + "' AND _pi.enrollmentdate <= '"
-            + PARAM_PERIOD_END_DATE + "' ";
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL to retrieve the number of visits a program-stage. E.g
-     * [PS:1]
-     */
-    private String getConditionForProgramStage( String programStageId, Collection<Integer> orgunitIds )
-    {
-        String sql = " EXISTS ( SELECT _psi.programstageinstanceid FROM programstageinstance _psi "
-            + "WHERE _psi.programstageinstanceid=psi.programstageinstanceid ";
-        if ( !programStageId.equals( IN_CONDITION_GET_ALL ) )
-        {
-            sql += "AND _psi.programstageid=" + programStageId;
-        }
-
-        sql += "  AND _psi.executiondate >= '" + PARAM_PERIOD_START_DATE
-            + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE + "' AND _psi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  ";
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL to retrieve the x-time of a person visited one
-     * program-stage. E.g a mother came to a hospital 3th time for third
-     * trimester.
-     */
-    private String getConditionForCountProgramStage( String programStageId, String operator,
-        Collection<Integer> orgunitIds )
-    {
-        String sql = " EXISTS ( SELECT _psi.programstageinstanceid FROM programstageinstance as _psi "
-            + "WHERE psi.programstageinstanceid=_psi.programstageinstanceid AND _psi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds ) + ") and _psi.programstageid = " + programStageId + " "
-            + "AND _psi.executionDate >= '" + PARAM_PERIOD_START_DATE + "' AND _psi.executionDate <= '"
-            + PARAM_PERIOD_END_DATE + "' " + "GROUP BY _psi.programinstanceid,_psi.programstageinstanceid "
-            + "HAVING count(_psi.programstageinstanceid) ";
-
-        return sql;
-
-    }
-
-    /**
-     * Return standard SQL to retrieve the number of days between report-date
-     * and due-date. E.g [PSP:DATE@executionDate#-DATE@dueDate#]
-     */
-    private String getConditionForProgramStageProperty( String property, String operator, Collection<Integer> orgunitIds )
-    {
-        String sql = " EXISTS ( SELECT * FROM programstageinstance _psi "
-            + "WHERE psi.programstageinstanceid=_psi.programstageinstanceid AND _psi.executiondate >= '"
-            + PARAM_PERIOD_START_DATE + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE
-            + "' AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds ) + ") AND "
-            + property + " ";
-
-        return sql;
-    }
-
-    /**
-     * Return standard SQL to retrieve the number of children orgunits has all
-     * program-stage-instance completed and due-date. E.g [PSIC:1]
-     *
-     * @flag True if there are many stages in the expression
-     */
-    private String getConditionForOrgunitProgramStageCompleted( String programStageId, String operator,
-        Collection<Integer> orgunitIds, boolean flag )
-    {
-        String sql = "";
-        if ( !flag )
-        {
-            sql = " '1' FROM organisationunit ou WHERE ou.organisationunitid in ("
-                + TextUtils.getCommaDelimitedString( orgunitIds ) + ")  ";
-        }
-
-        sql += " AND EXISTS ( SELECT programstageinstanceid FROM programstageinstance _psi "
-            + " WHERE _psi.organisationunitid=ou.organisationunitid AND _psi.programstageid = " + programStageId
-            + " AND _psi.completed=true AND _psi.executiondate >= '" + PARAM_PERIOD_START_DATE
-            + "' AND _psi.executiondate <= '" + PARAM_PERIOD_END_DATE + "' ) ";
-
-        return sql;
-    }
-
-    private String getConditionForMinusDataElement1( Collection<Integer> orgunitIds, Integer programId, Integer programStageId,
-        Integer dataElementId, String dateProperty, String compareSide )
-    {
-        String sql = " EXISTS ( SELECT _pdv.value FROM trackedentitydatavalue _pdv inner join programstageinstance _psi "
-            + "                         ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
-            + "                 JOIN programinstance _pi ON _pi.programinstanceid=_psi.programinstanceid "
-            + "           WHERE psi.programstageinstanceid=_pdv.programstageinstanceid "
-            + "                  AND _pdv.dataelementid=" + dataElementId
-            + "                 AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") ";
-
-
-        if ( programId != null )
-        {
-            sql += " AND _pi.programid = " + programId;
-        }
-
-        if ( programId != null )
-        {
-            sql += " AND _psi.programstageid = " + programStageId;
-        }
-
-        sql += " AND ( _psi.executionDate BETWEEN '" + PARAM_PERIOD_START_DATE + "' AND '" + PARAM_PERIOD_END_DATE
-            + "') " + "                 AND ( DATE(_pdv.value) - DATE(" + dateProperty + ") " + compareSide + "  ) ";
-
-        return sql;
-    }
-
-    private String getConditionForMinusDataElement2( Collection<Integer> orgunitIds, Integer programId, Integer programStageId,
-        Integer dataElementId, String dateProperty, String compareSide )
-    {
-        String sql = " EXISTS ( SELECT _pdv.value FROM trackedentitydatavalue _pdv inner join programstageinstance _psi "
-            + "                         ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
-            + "                 JOIN programinstance _pi ON _pi.programinstanceid=_psi.programinstanceid "
-            + "           WHERE psi.programstageinstanceid=_pdv.programstageinstanceid "
-            + "                  AND _pdv.dataelementid=" + dataElementId
-            + "                 AND _psi.organisationunitid in (" + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") ";
-
-
-        if ( programId != null )
-        {
-            sql += " AND _pi.programid = " + programId;
-        }
-
-        if ( programId != null )
-        {
-            sql += " AND _psi.programstageid = " + programStageId;
-        }
-
-        sql += " AND ( _psi.executionDate BETWEEN '" + PARAM_PERIOD_START_DATE + "' AND '" + PARAM_PERIOD_END_DATE
-            + "') " + "                 AND ( DATE(" + dateProperty + ") - DATE(_pdv.value) " + compareSide + "  ) ";
-
-        return sql;
-    }
-
-    private String getConditionForMisus2DataElement( Collection<Integer> orgunitIds, String programStageId1,
-        String dataElementId1, String programStageId2, String dataElementId2, String compareSide )
-    {
-        return " EXISTS ( SELECT * FROM ( SELECT _pdv.value FROM trackedentitydatavalue _pdv "
-            + "                 INNER JOIN programstageinstance _psi ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
-            + "                 JOIN programinstance _pi ON _pi.programinstanceid=_psi.programinstanceid "
-            + "           WHERE _pi.programinstanceid=pi.programinstanceid AND _pdv.dataelementid= "
-            + dataElementId1
-            + "                 AND _psi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") "
-            + "                 AND _psi.programstageid = "
-            + programStageId1
-            + "                 AND _psi.executionDate>='"
-            + PARAM_PERIOD_START_DATE
-            + "'  "
-            + "                 AND _psi.executionDate <= '"
-            + PARAM_PERIOD_END_DATE
-            + "' ) AS d1 cross join "
-            + "         (  SELECT _pdv.value FROM trackedentitydatavalue _pdv INNER JOIN programstageinstance _psi "
-            + "                        ON _pdv.programstageinstanceid=_psi.programstageinstanceid "
-            + "                  JOIN programinstance _pi ON _pi.programinstanceid=_psi.programinstanceid "
-            + "           WHERE _pi.programinstanceid=pi.programinstanceid and _pdv.dataelementid= "
-            + dataElementId2
-            + "                 AND _psi.organisationunitid in ("
-            + TextUtils.getCommaDelimitedString( orgunitIds )
-            + ") "
-            + "                 AND _psi.programstageid =  "
-            + programStageId2
-            + "                 AND _psi.executionDate>='"
-            + PARAM_PERIOD_START_DATE
-            + "'  "
-            + "                 AND _psi.executionDate <= '"
-            + PARAM_PERIOD_END_DATE
-            + "' ) AS d2 WHERE DATE(d1.value ) - DATE(d2.value) " + compareSide;
-    }
-
-    private String getConditionForMisus2Attribute( String attribute1, String attribute2, String compareSide )
-    {
-        return " EXISTS ( SELECT * FROM (  SELECT _teav.value FROM trackedentityattributevalue _teav "
-            + " WHERE _teav.trackedentityinstanceid=p.trackedentityinstanceid "
-            + " and _teav.trackedentityattributeid = " + attribute1 + " ) as a1 , "
-            + " ( SELECT _teav.value FROM trackedentityattributevalue _teav "
-            + " WHERE _teav.trackedentityinstanceid=p.trackedentityinstanceid  "
-            + " and  _teav.trackedentityattributeid =  " + attribute2 + " ) as a2 "
-            + " WHERE DATE(a1.value ) - DATE(a2.value) " + compareSide;
-    }
-
-    private String getConditionForMisusAttribute1( String attribute, String dateProperty, String compareSide )
-    {
-        if ( dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_INCIDENT_DATE )
-            || dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_ENROLLEMENT_DATE ) )
-        {
-            return " EXISTS ( select * from trackedentityattributevalue _teav "
-                + "inner join programinstance _pi on _teav.trackedentityinstanceid=_pi.trackedentityinstanceid "
-                + "where _teav.trackedentityattributeid=" + attribute + " and date(" + dateProperty + ") - date(_teav.value) " + compareSide;
-        }
-        else if ( dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_REPORT_DATE ) )
-        {
-            return " EXISTS ( select * from trackedentityattributevalue _teav "
-                + "inner join programinstance _pi on _teav.trackedentityinstanceid=_pi.trackedentityinstanceid "
-                + "inner join programstageinstance _psi on _psi.programinstanceid=_pi.programinstanceid "
-                + "where _teav.trackedentityattributeid=" + attribute + " and date(" + dateProperty + ") - date(_teav.value) " + compareSide;
-        }
-
-        return " EXISTS (select * from trackedentityattributevalue _teav where _teav.trackedentityattributeid="
-            + attribute + " and date(now()) - date(_teav.value)  " + compareSide;
-    }
-
-    private String getConditionForMisusAttribute2( String attribute, String dateProperty, String compareSide )
-    {
-        if ( dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_INCIDENT_DATE )
-            || dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_ENROLLEMENT_DATE ) )
-        {
-            return " EXISTS ( select * from trackedentityattributevalue _teav "
-                + "inner join programinstance _pi on _teav.trackedentityinstanceid=_pi.trackedentityinstanceid "
-                + "where _teav.trackedentityattributeid=" + attribute + " and date(_teav.value) - date(" + dateProperty + ") " + compareSide;
-        }
-        else if ( dateProperty.equals( CaseAggregationCondition.OBJECT_PROGRAM_PROPERTY_REPORT_DATE ) )
-        {
-            return " EXISTS ( select * from trackedentityattributevalue _teav "
-                + "inner join programinstance _pi on _teav.trackedentityinstanceid=_pi.trackedentityinstanceid "
-                + "inner join programstageinstance _psi on _psi.programinstanceid=_pi.programinstanceid "
-                + "where _teav.trackedentityattributeid=" + attribute + " and date(_teav.value) - date(" + dateProperty + ") " + compareSide;
-        }
-
-        return " EXISTS (select * from trackedentityattributevalue _teav where _teav.trackedentityattributeid="
-            + attribute + " and date(_teav.value) - date(now()) " + compareSide;
-    }
-
-    /**
-     * Return the Ids of organisation units which entity instances registered or
-     * events happened.
-     */
-    @Override
-    public Collection<Integer> getServiceOrgunit()
-    {
-        String sql = "(select distinct organisationunitid from trackedentityinstance)";
-        sql += " UNION ";
-        sql += "(select distinct organisationunitid from programstageinstance where organisationunitid is not null)";
-
-        Collection<Integer> orgunitIds = jdbcTemplate.query( sql, new RowMapper<Integer>()
-        {
-            @Override
-            public Integer mapRow( ResultSet rs, int rowNum )
-                throws SQLException
-            {
-                return rs.getInt( 1 );
-            }
-        } );
-
-        return orgunitIds;
-    }
-
-    @Override
-    public String parseExpressionDetailsToSql( String caseExpression, String operator, Integer orgunitId,
-        Period period, boolean nonRegistrationProgram )
-    {
-        String sql = "SELECT ";
-
-        Collection<Integer> orgunitIds = new HashSet<>();
-        orgunitIds.add( orgunitId );
-
-        if ( hasOrgunitProgramStageCompleted( caseExpression ) )
-        {
-            sql += "ou.name " + createSQL( caseExpression, operator, orgunitIds );
-        }
-        else if ( nonRegistrationProgram )
-        {
-            sql += " pdv.programstageinstanceid as event, pgs.name as program_stage, de.name as data_element, pdv.value, psi.executiondate as report_date ";
-            sql += " FROM programstageinstance psi inner join programinstance pi on pi.programinstanceid=psi.programinstanceid ";
-            sql += " INNER JOIN organisationunit ou ON ou.organisationunitid=psi.organisationunitid ";
-            sql += " INNER JOIN trackedentitydatavalue pdv ON pdv.programstageinstanceid=psi.programstageinstanceid ";
-            sql += " INNER JOIN dataelement de ON de.dataelementid=pdv.dataelementid ";
-            sql += " INNER JOIN program pg on pg.programid=pi.programid ";
-            sql += " INNER JOIN programstage pgs ON pgs.programid=pg.programid ";
-        }
-        else
-        {
-            sql += " p.trackedentityinstanceid as tracked_entity_instance, tea.name as attribute, ";
-            sql += "teav.value as value, pg.name as program ";
-            sql += "FROM trackedentityinstance p ";
-            sql += "INNER JOIN trackedentityattributevalue teav on p.trackedentityinstanceid=teav.trackedentityinstanceid  ";
-            sql += "INNER JOIN trackedentityattribute tea on tea.trackedentityattributeid=teav.trackedentityattributeid  ";
-            sql += "INNER JOIN programinstance as pi on p.trackedentityinstanceid=pi.trackedentityinstanceid  ";
-            sql += "INNER JOIN program pg on pg.programid=pi.programid  ";
-            sql += "INNER JOIN programstage pgs on pgs.programid=pg.programid  ";
-
-            if ( hasDataelementCriteria( caseExpression ) )
-            {
-                sql += " INNER JOIN programstageinstance psi on pi.programinstanceid=psi.programinstanceid ";
-                sql += " INNER JOIN organisationunit ou on ou.organisationunitid=psi.organisationunitid ";
-                sql += " INNER JOIN trackedentitydatavalue pdv on pdv.programstageinstanceid=psi.programstageinstanceid ";
-            }
-        }
-
-        sql += " WHERE " + createSQL( caseExpression, operator, orgunitIds );
-
-        sql = sql.replaceAll( "COMBINE", "" );
-
-        if ( nonRegistrationProgram )
-        {
-            sql += " ORDER BY pdv.programstageinstanceid";
-        }
-        else
-        {
-            sql += " ORDER BY  p.trackedentityinstanceid ";
-        }
-
-        sql = replacePeriodSql( sql, period );
-
-        return sql;
-    }
-
-    @Override
-    public List<Integer> executeSQL( String sql )
-    {
-        try
-        {
-            List<Integer> entityInstanceIds = jdbcTemplate.query( sql, new RowMapper<Integer>()
-            {
-                @Override
-                public Integer mapRow( ResultSet rs, int rowNum )
-                    throws SQLException
-                {
-                    return rs.getInt( 1 );
-                }
-            } );
-
-            return entityInstanceIds;
-        }
-        catch ( Exception ex )
-        {
-            ex.printStackTrace();
-            return null;
-        }
-    }
-
-    @Override
-    public Collection<Period> getPeriods( String periodTypeName, String taskStrategy )
-    {
-        Calendar calStartDate = Calendar.getInstance();
-
-        if ( TASK_AGGREGATE_QUERY_BUILDER_LAST_MONTH.equals( taskStrategy ) )
-        {
-            calStartDate.add( Calendar.MONTH, -1 );
-        }
-        else if ( TASK_AGGREGATE_QUERY_BUILDER_LAST_3_MONTH.equals( taskStrategy ) )
-        {
-            calStartDate.add( Calendar.MONTH, -3 );
-        }
-        else if ( TASK_AGGREGATE_QUERY_BUILDER_LAST_6_MONTH.equals( taskStrategy ) )
-        {
-            calStartDate.add( Calendar.MONTH, -6 );
-        }
-        else if ( TASK_AGGREGATE_QUERY_BUILDER_LAST_12_MONTH.equals( taskStrategy ) )
-        {
-            calStartDate.add( Calendar.MONTH, -12 );
-        }
-
-        Date startDate = calStartDate.getTime();
-
-        Calendar calEndDate = Calendar.getInstance();
-
-        Date endDate = calEndDate.getTime();
-
-        CalendarPeriodType periodType = (CalendarPeriodType) PeriodType.getPeriodTypeByName( periodTypeName );
-        List<Period> periods = new ArrayList<>( periodType.generatePeriods( startDate, endDate ) );
-        periods = periodService.reloadPeriods( periods );
-
-        return periods;
-    }
-
-    private boolean hasOrgunitProgramStageCompleted( String expresstion )
-    {
-        Pattern pattern = Pattern.compile( CaseAggregationCondition.regExp );
-        Matcher matcher = pattern.matcher( expresstion );
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            if ( info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean hasEntityInstanceCriteria( String expresstion )
-    {
-        Pattern pattern = Pattern.compile( CaseAggregationCondition.regExp );
-        Matcher matcher = pattern.matcher( expresstion );
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-
-            match = match.replaceAll( "[\\[\\]]", "" );
-
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            if ( info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE ) )
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean hasDataelementCriteria( String expression )
-    {
-        Pattern pattern = Pattern.compile( CaseAggregationCondition.regExp );
-        Matcher matcher = pattern.matcher( expression );
-        while ( matcher.find() )
-        {
-            String match = matcher.group();
-
-            match = match.replaceAll( "[\\[\\]]", "" );
-            String[] info = match.split( SEPARATOR_OBJECT );
-
-            if ( info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT )
-                || info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_PROGRAM_STAGE )
-                || info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_PROGRAM_STAGE_PROPERTY )
-                || info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_TRACKED_ENTITY_PROGRAM_STAGE_PROPERTY )
-                || info[0].equalsIgnoreCase( CaseAggregationCondition.OBJECT_ORGUNIT_COMPLETE_PROGRAM_STAGE ) )
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private String replacePeriodSql( String sql, Period period )
-    {
-        sql = sql.replaceAll( "COMBINE", "" );
-        sql = sql.replaceAll( PARAM_PERIOD_START_DATE, DateUtils.getMediumDateString( period.getStartDate() ) );
-        sql = sql.replaceAll( PARAM_PERIOD_END_DATE, DateUtils.getMediumDateString( period.getEndDate() ) );
-        sql = sql.replaceAll( PARAM_PERIOD_ID, period.getId() + "" );
-        sql = sql.replaceAll( PARAM_PERIOD_ISO_DATE, period.getIsoDate() );
-
-        return sql;
-    }
-}

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionSchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionSchedulingManager.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionSchedulingManager.java	1970-01-01 00:00:00 +0000
@@ -1,59 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Map;
-
-import org.hisp.dhis.system.scheduling.ScheduledTaskStatus;
-
-/**
- * @author Chau Thu Tran
- *
- * @version CaseAggregateConditionSchedulingManager.java 10:42:58 AM Oct 10, 2012 $
- */
-public interface CaseAggregateConditionSchedulingManager
-{
-    final String TASK_AGGREGATE_QUERY_BUILDER = "aggregateQueryBuilder";
-    final String TASK_AGGREGATE_QUERY_BUILDER_LAST_MONTH = "lastMonth";
-    final String TASK_AGGREGATE_QUERY_BUILDER_LAST_3_MONTH = "last3Month";
-    final String TASK_AGGREGATE_QUERY_BUILDER_LAST_6_MONTH = "last6Month";
-    final String TASK_AGGREGATE_QUERY_BUILDER_LAST_12_MONTH = "last12Month";
-    
-    void scheduleTasks();
-    
-    void scheduleTasks( Map<String, String> keyCronMap );
-    
-    void stopTasks();
-    
-    void executeTasks();
-    
-    Map<String, String> getScheduledTasks();
-    
-    ScheduledTaskStatus getTaskStatus();   
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionTask.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionTask.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/CaseAggregateConditionTask.java	1970-01-01 00:00:00 +0000
@@ -1,127 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.hisp.dhis.system.notification.NotificationLevel.INFO;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hisp.dhis.caseaggregation.CaseAggregateSchedule;
-import org.hisp.dhis.caseaggregation.CaseAggregationConditionService;
-import org.hisp.dhis.setting.SettingKey;
-import org.hisp.dhis.setting.SystemSettingManager;
-import org.hisp.dhis.system.notification.Notifier;
-import org.hisp.dhis.system.util.Clock;
-import org.hisp.dhis.system.util.SystemUtils;
-import org.hisp.dhis.user.CurrentUserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.support.rowset.SqlRowSet;
-
-/**
- * @author Chau Thu Tran
- * 
- * @version CaseAggregateConditionTask.java 9:52:10 AM Oct 10, 2012 $
- */
-public class CaseAggregateConditionTask
-    implements Runnable
-{
-    private CaseAggregationConditionService aggregationConditionService;
-
-    public void setAggregationConditionService( CaseAggregationConditionService aggregationConditionService )
-    {
-        this.aggregationConditionService = aggregationConditionService;
-    }
-
-    private SystemSettingManager systemSettingManager;
-
-    public void setSystemSettingManager( SystemSettingManager systemSettingManager )
-    {
-        this.systemSettingManager = systemSettingManager;
-    }
-
-    private JdbcTemplate jdbcTemplate;
-
-    public void setJdbcTemplate( JdbcTemplate jdbcTemplate )
-    {
-        this.jdbcTemplate = jdbcTemplate;
-    }
-
-    private Notifier notifier;
-
-    public void setNotifier( Notifier notifier )
-    {
-        this.notifier = notifier;
-    }
-    
-    @Autowired
-    private CurrentUserService currentUserService;
-
-   
-    // -------------------------------------------------------------------------
-    // Runnable implementation
-    // -------------------------------------------------------------------------
-
-    @Override
-    public void run()
-    {
-        final int cpuCores = SystemUtils.getCpuCores();        
-
-        TaskId taskId = new TaskId( TaskCategory.AGGREGATE_QUERY_BUILDER, currentUserService.getCurrentUser() );
-        notifier.clear( taskId );
-        
-        Clock clock = new Clock().startClock().logTime(
-            "Aggregate process started, number of CPU cores: " + cpuCores + ", " + SystemUtils.getMemoryString() );
-        notifier.clear( taskId ).notify( taskId, "Aggregate process started" );
-
-        String taskStrategy = (String) systemSettingManager.getSystemSetting( SettingKey.SCHEDULE_AGGREGATE_QUERY_BUILDER_TASK_STRATEGY );
-
-        String sql = "select cagg.caseaggregationconditionid as caseaggregationconditionid, cagg.name as caseaggregationconditionname, pt.name as periodtypename ";
-        sql += "from caseaggregationcondition cagg inner join datasetmembers dm  ";
-        sql += " on cagg.aggregationdataelementid=dm.dataelementid inner join dataset ds  ";
-        sql += " on ds.datasetid = dm.datasetid inner join periodtype pt  ";
-        sql += "  on pt.periodtypeid=ds.periodtypeid";
-
-        SqlRowSet rsCondition = jdbcTemplate.queryForRowSet( sql );
-        List<CaseAggregateSchedule> caseAggregateSchedule = new ArrayList<>();
-        while ( rsCondition.next() )
-        {
-            CaseAggregateSchedule condition = new CaseAggregateSchedule( rsCondition.getInt( "caseaggregationconditionid" ),
-                rsCondition.getString( "caseaggregationconditionname"), rsCondition.getString( "periodtypename" ) );
-          caseAggregateSchedule.add( condition );
-        }
-        
-        aggregationConditionService.aggregate( caseAggregateSchedule, taskStrategy, taskId );
-
-        clock.logTime( "Improrted aggregate data completed " );
-
-        notifier.notify( taskId, INFO, "Improrted aggregate data completed", true );
-    }    
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultCaseAggregateConditionSchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultCaseAggregateConditionSchedulingManager.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultCaseAggregateConditionSchedulingManager.java	1970-01-01 00:00:00 +0000
@@ -1,147 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hisp.dhis.setting.SettingKey;
-import org.hisp.dhis.setting.SystemSettingManager;
-import org.hisp.dhis.system.scheduling.ScheduledTaskStatus;
-import org.hisp.dhis.system.scheduling.Scheduler;
-
-/**
- * @author Chau Thu Tran
- * 
- * @version DefaultCaseAggregateConditionSchedulingManager.java 10:42:25 AM Oct
- *          10, 2012 $
- */
-public class DefaultCaseAggregateConditionSchedulingManager
-    implements CaseAggregateConditionSchedulingManager
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private SystemSettingManager systemSettingManager;
-
-    public void setSystemSettingManager( SystemSettingManager systemSettingManager )
-    {
-        this.systemSettingManager = systemSettingManager;
-    }
-
-    private Scheduler scheduler;
-
-    public void setScheduler( Scheduler scheduler )
-    {
-        this.scheduler = scheduler;
-    }
-
-    private Map<String, Runnable> tasks = new HashMap<>();
-
-    public void setTasks( Map<String, Runnable> tasks )
-    {
-        this.tasks = tasks;
-    }
-
-    // -------------------------------------------------------------------------
-    // SchedulingManager implementation
-    // -------------------------------------------------------------------------
-
-    @Override
-    public void scheduleTasks()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-
-        for ( String key : keyCronMap.keySet() )
-        {
-            String cron = keyCronMap.get( key );
-            Runnable task = tasks.get( key );
-
-            if ( cron != null && task != null )
-            {
-                scheduler.scheduleTask( key, task, cron );
-            }
-        }
-    }
-
-    @Override
-    public void scheduleTasks( Map<String, String> keyCronMap )
-    {
-        systemSettingManager.saveSystemSetting( SettingKey.SCHEDULE_AGGREGATE_QUERY_BUILDER_TASKS,
-            new HashMap<>( keyCronMap ) );
-
-        scheduleTasks();
-    }
-
-    @Override
-    public void stopTasks()
-    {
-        systemSettingManager.saveSystemSetting( SettingKey.SCHEDULE_AGGREGATE_QUERY_BUILDER_TASKS , null );
-
-        scheduler.stopAllTasks();
-    }
-
-    @Override
-    public void executeTasks()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-
-        for ( String key : keyCronMap.keySet() )
-        {
-            Runnable task = tasks.get( key );
-
-            if ( task != null )
-            {
-                scheduler.executeTask( task );
-            }
-        }
-    }
-
-    @Override
-    @SuppressWarnings( "unchecked" )
-    public Map<String, String> getScheduledTasks()
-    {
-        return (Map<String, String>) systemSettingManager.getSystemSetting( SettingKey.SCHEDULE_AGGREGATE_QUERY_BUILDER_TASKS,
-            new HashMap<String, String>() );
-    }
-
-    @Override
-    public ScheduledTaskStatus getTaskStatus()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-
-        if ( keyCronMap.size() == 0 )
-        {
-            return ScheduledTaskStatus.NOT_STARTED;
-        }
-
-        return scheduler.getTaskStatus( keyCronMap.keySet().iterator().next() );
-    }
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultProgramSchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultProgramSchedulingManager.java	2016-02-10 14:57:19 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/DefaultProgramSchedulingManager.java	1970-01-01 00:00:00 +0000
@@ -1,139 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hisp.dhis.setting.SettingKey;
-import org.hisp.dhis.setting.SystemSettingManager;
-import org.hisp.dhis.system.scheduling.ScheduledTaskStatus;
-import org.hisp.dhis.system.scheduling.Scheduler;
-
-/**
- * @author Chau Thu Tran
- *
- * @version DefaultProgramSchedulingManager.java 12:51:02 PM Sep 10, 2012 $
- */
-public class DefaultProgramSchedulingManager implements ProgramSchedulingManager
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private SystemSettingManager systemSettingManager;
-    
-    public void setSystemSettingManager( SystemSettingManager systemSettingManager )
-    {
-        this.systemSettingManager = systemSettingManager;
-    }
-
-    private Scheduler scheduler;
-
-    public void setScheduler( Scheduler scheduler )
-    {
-        this.scheduler = scheduler;
-    }
-
-    private Map<String, Runnable> tasks = new HashMap<>();
-
-    public void setTasks( Map<String, Runnable> tasks )
-    {
-        this.tasks = tasks;
-    }
-
-    // -------------------------------------------------------------------------
-    // SchedulingManager implementation
-    // -------------------------------------------------------------------------
-
-    @Override
-    public void scheduleTasks()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-        
-        for ( String key : keyCronMap.keySet() )
-        {
-            String cron = keyCronMap.get( key );
-            Runnable task = tasks.get( key );
-            
-            if ( cron != null && task != null )
-            {
-                scheduler.scheduleTask( key, task, cron );
-            }
-        }
-    }
-    
-    @Override
-    public void scheduleTasks( Map<String, String> keyCronMap )
-    {
-        systemSettingManager.saveSystemSetting( SettingKey.SEND_MESSAGE_SCHEDULED_TASKS, new HashMap<>( keyCronMap ) );
-        
-        scheduleTasks();
-    }
-    
-    @Override
-    public void stopTasks()
-    {
-        systemSettingManager.saveSystemSetting( SettingKey.SEND_MESSAGE_SCHEDULED_TASKS, null );
-        
-        scheduler.stopAllTasks();
-    }
-    
-    @Override
-    public void executeTasks() 
-    {
-          Runnable task = tasks.get( "sendMessageScheduledNow" );
-          
-          if ( task != null )
-          {
-              scheduler.executeTask( task );
-          }
-    }
-    
-    @Override
-    @SuppressWarnings("unchecked")
-    public Map<String, String> getScheduledTasks()
-    {
-        return (Map<String, String>) systemSettingManager.getSystemSetting( SettingKey.SEND_MESSAGE_SCHEDULED_TASKS, new HashMap<String, String>() );
-    }
-    
-    @Override
-    public ScheduledTaskStatus getTaskStatus()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-                
-        if ( keyCronMap.size() == 0 )
-        {
-            return ScheduledTaskStatus.NOT_STARTED;
-        }
-        
-        return scheduler.getTaskStatus( keyCronMap.keySet().iterator().next() );
-    }
-}
-

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/ProgramSchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/ProgramSchedulingManager.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/ProgramSchedulingManager.java	1970-01-01 00:00:00 +0000
@@ -1,55 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Map;
-
-import org.hisp.dhis.system.scheduling.ScheduledTaskStatus;
-
-/**
- * @author Chau Thu Tran
- *
- * @version ProgramSchedulingManager.java 12:47:57 PM Sep 10, 2012 $
- */
-public interface ProgramSchedulingManager
-{
-    final String TASK_SENDING_MESSAGE = "sendingMessageTask";
-
-    void scheduleTasks();
-    
-    void scheduleTasks( Map<String, String> keyCronMap );
-    
-    void stopTasks();
-    
-    void executeTasks();
-    
-    Map<String, String> getScheduledTasks();
-    
-    ScheduledTaskStatus getTaskStatus();   
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/SendScheduledMessageTask.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/SendScheduledMessageTask.java	2016-02-10 14:57:19 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/java/org/hisp/dhis/scheduling/SendScheduledMessageTask.java	1970-01-01 00:00:00 +0000
@@ -1,293 +0,0 @@
-package org.hisp.dhis.scheduling;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.hisp.dhis.sms.outbound.OutboundSms.DHIS_SYSTEM_SENDER;
-import static org.hisp.dhis.system.notification.NotificationLevel.INFO;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-import org.hisp.dhis.program.ProgramInstanceService;
-import org.hisp.dhis.program.ProgramStageInstanceService;
-import org.hisp.dhis.program.SchedulingProgramObject;
-import org.hisp.dhis.sms.SmsSender;
-import org.hisp.dhis.sms.SmsServiceException;
-import org.hisp.dhis.sms.outbound.OutboundSms;
-import org.hisp.dhis.sms.outbound.OutboundSmsService;
-import org.hisp.dhis.sms.outbound.OutboundSmsStatus;
-import org.hisp.dhis.system.notification.Notifier;
-import org.hisp.dhis.system.util.Clock;
-import org.hisp.dhis.system.util.SystemUtils;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-/**
- * @author Chau Thu Tran
- * 
- * @version SendScheduledMessageTask.java 12:57:53 PM Sep 10, 2012 $
- */
-public class SendScheduledMessageTask
-    implements Runnable
-{
-    private ProgramStageInstanceService programStageInstanceService;
-
-    public void setProgramStageInstanceService( ProgramStageInstanceService programStageInstanceService )
-    {
-        this.programStageInstanceService = programStageInstanceService;
-    }
-
-    private ProgramInstanceService programInstanceService;
-
-    public void setProgramInstanceService( ProgramInstanceService programInstanceService )
-    {
-        this.programInstanceService = programInstanceService;
-    }
-
-    private OutboundSmsService outboundSmsService;
-
-    public void setOutboundSmsService( OutboundSmsService outboundSmsService )
-    {
-        this.outboundSmsService = outboundSmsService;
-    }
-
-    private SmsSender smsSender;
-
-    public void setSmsSender( SmsSender smsSender )
-    {
-        this.smsSender = smsSender;
-    }
-
-    private JdbcTemplate jdbcTemplate;
-
-    public void setJdbcTemplate( JdbcTemplate jdbcTemplate )
-    {
-        this.jdbcTemplate = jdbcTemplate;
-    }
-
-    private Notifier notifier;
-
-    public void setNotifier( Notifier notifier )
-    {
-        this.notifier = notifier;
-    }
-
-    // -------------------------------------------------------------------------
-    // Params
-    // -------------------------------------------------------------------------
-
-    private Boolean sendingMessage;
-
-    public void setSendingMessage( Boolean sendingMessage )
-    {
-        this.sendingMessage = sendingMessage;
-    }
-
-    private Boolean sendNow;
-
-    public void setSendNow( Boolean sendNow )
-    {
-        this.sendNow = sendNow;
-    }
-
-    private TaskId taskId;
-
-    public void setTaskId( TaskId taskId )
-    {
-        this.taskId = taskId;
-    }
-
-    // -------------------------------------------------------------------------
-    // Runnable implementation
-    // -------------------------------------------------------------------------
-
-    @Override
-    public void run()
-    {
-        final int cpuCores = SystemUtils.getCpuCores();
-
-        Clock clock = new Clock().startClock().logTime(
-            "Aggregate process started, number of CPU cores: " + cpuCores + ", " + SystemUtils.getMemoryString() );
-
-        if ( sendNow )
-        {
-            clock.logTime( "Starting to prepare reminder messages" );
-            notifier.clear( taskId ).notify( taskId, "Start to prepare reminder messages" );
-
-            scheduleProgramStageInstanceMessage();
-            scheduleProgramInstanceMessage();
-
-            clock.logTime( "Preparing reminder messages completed" );
-            notifier.notify( taskId, INFO, "Preparing reminder messages completed", true );
-
-            clock.logTime( "Starting to send messages in outbound" );
-            notifier.notify( taskId, INFO, "Start to send messages in outbound", true );
-
-            sendMessage();
-
-            clock.logTime( "Sending messages in outbound completed" );
-            notifier.notify( taskId, INFO, "Sending messages in outbound completed", true );
-            
-            return;
-        }
-
-        if ( sendingMessage )
-        {
-            clock.logTime( "Starting to send messages in outbound" );
-            notifier.notify( taskId, INFO, "Start to send messages in outbound", true );
-
-            sendMessage();
-
-            clock.logTime( "Sending messages in outbound completed" );
-            notifier.notify( taskId, INFO, "Sending messages in outbound completed", true );
-        }
-        else
-        {
-            clock.logTime( "Starting to prepare reminder messages" );
-            notifier.clear( taskId ).notify( taskId, "Start to prepare reminder messages" );
-
-            scheduleProgramStageInstanceMessage();
-            scheduleProgramInstanceMessage();
-
-            clock.logTime( "Preparing reminder messages completed" );
-            notifier.notify( taskId, INFO, "Preparing reminder messages completed", true );
-        }
-
-    }
-
-    // -------------------------------------------------------------------------
-    // Supportive methods
-    // -------------------------------------------------------------------------
-
-    private void scheduleProgramStageInstanceMessage()
-    {
-        notifier.notify( taskId, "Start to prepare reminder messages for events" );
-
-        Collection<SchedulingProgramObject> schedulingProgramObjects = programStageInstanceService
-            .getSendMessageEvents();
-
-        for ( SchedulingProgramObject schedulingProgramObject : schedulingProgramObjects )
-        {
-            String message = schedulingProgramObject.getMessage();
-
-            try
-            {
-                OutboundSms outboundSms = new OutboundSms( message, schedulingProgramObject.getPhoneNumber() );
-                outboundSms.setSender( DHIS_SYSTEM_SENDER );
-                outboundSmsService.saveOutboundSms( outboundSms );
-
-                String sortOrderSql = "SELECT max(sort_order) "
-                    + "FROM programstageinstance_outboundsms where programstageinstanceid="
-                    + schedulingProgramObject.getProgramStageInstanceId();
-                Integer sortOrder = jdbcTemplate.queryForObject( sortOrderSql, Integer.class );
-                if ( sortOrder == null )
-                {
-                    sortOrder = 0;
-                }
-                sortOrder = sortOrder + 1;
-
-                String sql = "INSERT INTO programstageinstance_outboundsms"
-                    + "( programstageinstanceid, outboundsmsid, sort_order) VALUES " + "("
-                    + schedulingProgramObject.getProgramStageInstanceId() + ", " + outboundSms.getId() + "," + sortOrder
-                    + ") ";
-
-                jdbcTemplate.execute( sql );
-
-                notifier.notify( taskId,
-                    "Reminder messages for event of " + outboundSms.getRecipients() + " is created " );
-            }
-            catch ( SmsServiceException e )
-            {
-                message = e.getMessage();
-            }
-        }
-
-        notifier.notify( taskId, INFO, "Preparing reminder messages for events completed", true );
-    }
-
-    private void scheduleProgramInstanceMessage()
-    {
-        notifier.notify( taskId, "Start to prepare remigetScheduledTasksnder messages for enrollements" );
-
-        Collection<SchedulingProgramObject> schedulingProgramObjects = programInstanceService.getScheduledMessages();
-
-        for ( SchedulingProgramObject schedulingProgramObject : schedulingProgramObjects )
-        {
-            String message = schedulingProgramObject.getMessage();
-            try
-            {
-                OutboundSms outboundSms = new OutboundSms( message, schedulingProgramObject.getPhoneNumber() );
-                outboundSms.setSender( DHIS_SYSTEM_SENDER );
-                outboundSmsService.saveOutboundSms( outboundSms );
-
-                String sortOrderSql = "select max(sort_order) "
-                    + "from programinstance_outboundsms where programinstanceid="
-                    + schedulingProgramObject.getProgramInstanceId();
-                Integer sortOrder = jdbcTemplate.queryForObject( sortOrderSql, Integer.class );
-                if ( sortOrder == null )
-                {
-                    sortOrder = 0;
-                }
-                sortOrder = sortOrder + 1;
-
-                String sql = "INSERT INTO programinstance_outboundsms"
-                    + "( programinstanceid, outboundsmsid, sort_order) VALUES " + "("
-                    + schedulingProgramObject.getProgramInstanceId() + ", " + outboundSms.getId() + "," + sortOrder
-                    + ") ";
-
-                jdbcTemplate.execute( sql );
-
-                notifier.notify( taskId,
-                    "Reminder messages for enrollement of " + outboundSms.getRecipients() + " is created " );
-            }
-            catch ( SmsServiceException e )
-            {
-                message = e.getMessage();
-            }
-        }
-
-        notifier.notify( taskId, INFO, "Sending reminder messages for enrollement completed", true );
-
-    }
-
-    private void sendMessage()
-    {
-        List<OutboundSms> outboundSmsList = outboundSmsService.getOutboundSms( OutboundSmsStatus.OUTBOUND );
-
-        if ( outboundSmsList != null )
-        {
-            for ( OutboundSms outboundSms : outboundSmsList )
-            {
-                outboundSms.setDate( new Date() );
-                outboundSms.setStatus( OutboundSmsStatus.SENT );
-                smsSender.sendMessage( outboundSms, null );
-            }
-        }
-    }
-}

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis/beans.xml	2016-02-17 10:10:29 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/META-INF/dhis/beans.xml	1970-01-01 00:00:00 +0000
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans";
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:aop="http://www.springframework.org/schema/aop";
-	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
-    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd";>
-
-	<!-- Store definitions -->
-	
-	<bean id="org.hisp.dhis.caseaggregation.CaseAggregationConditionStore"
-		class="org.hisp.dhis.caseaggregation.hibernate.HibernateCaseAggregationConditionStore">
-		<property name="clazz"
-			value="org.hisp.dhis.caseaggregation.CaseAggregationCondition" />
-		<property name="sessionFactory" ref="sessionFactory" />
-		<property name="jdbcTemplate" ref="jdbcTemplate" />
-		<property name="statementBuilder" ref="statementBuilder" />
-		<property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
-	</bean>
-
-	<!-- Service definitions -->
-
-	<bean id="org.hisp.dhis.caseaggregation.CaseAggregationConditionService"
-		class="org.hisp.dhis.caseaggregation.DefaultCaseAggregationConditionService">
-		<property name="aggregationConditionStore"
-			ref="org.hisp.dhis.caseaggregation.CaseAggregationConditionStore" />
-		<property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
-		<property name="programStageService" ref="org.hisp.dhis.program.ProgramStageService" />
-		<property name="programService" ref="org.hisp.dhis.program.ProgramService" />
-		<property name="attributeService"
-			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeService" />
-		<property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
-		<property name="i18nService" ref="org.hisp.dhis.i18n.I18nService" />
-	</bean>
-
-	<!-- Scheduling -->
-
-	<bean
-		id="org.hisp.dhis.scheduling.CaseAggregateConditionSchedulingManager"
-		class="org.hisp.dhis.scheduling.DefaultCaseAggregateConditionSchedulingManager"
-		init-method="scheduleTasks">
-		<property name="systemSettingManager" ref="org.hisp.dhis.setting.SystemSettingManager" />
-		<property name="scheduler" ref="scheduler" />
-		<property name="tasks">
-			<map>
-				<entry key="aggregateQueryBuilder" value-ref="aggregateQueryBuilder" />
-			</map>
-		</property>
-	</bean>
-
-	<bean id="abstractRunCaseAggregateConditionTask"
-		class="org.hisp.dhis.scheduling.CaseAggregateConditionTask">
-		<property name="aggregationConditionService"
-			ref="org.hisp.dhis.caseaggregation.CaseAggregationConditionService" />
-		<property name="systemSettingManager" ref="org.hisp.dhis.setting.SystemSettingManager" />
-		<property name="jdbcTemplate" ref="jdbcTemplate" />
-		<property name="notifier" ref="notifier" />
-	</bean>
-
-	<bean id="aggregateQueryBuilder"
-		class="org.hisp.dhis.scheduling.CaseAggregateConditionTask"
-		parent="abstractRunCaseAggregateConditionTask" scope="prototype">
-	</bean>
-	
-	<bean id="org.hisp.dhis.scheduling.ProgramSchedulingManager"
-		class="org.hisp.dhis.scheduling.DefaultProgramSchedulingManager"
-		init-method="scheduleTasks">
-		<property name="systemSettingManager" ref="org.hisp.dhis.setting.SystemSettingManager" />
-		<property name="scheduler" ref="scheduler" />
-		<property name="tasks">
-			<map>
-				<entry key="scheduleMessage" value-ref="scheduleMessage" />
-				<entry key="sendMessageScheduled" value-ref="sendMessageScheduled" />
-				<entry key="sendMessageScheduledNow" value-ref="sendMessageScheduledNow" />
-			</map>
-		</property>
-	</bean>
-
-	<bean id="abstractScheduledMessageTask"
-		class="org.hisp.dhis.scheduling.SendScheduledMessageTask" scope="prototype">
-		<property name="programStageInstanceService"
-			ref="org.hisp.dhis.program.ProgramStageInstanceService" />
-		<property name="outboundSmsService"
-			ref="org.hisp.dhis.sms.outbound.OutboundSmsService" />
-		<property name="smsSender" ref="org.hisp.dhis.sms.SmsSender" />
-		<property name="programInstanceService" ref="org.hisp.dhis.program.ProgramInstanceService" />
-		<property name="notifier" ref="notifier" />
-		<property name="jdbcTemplate" ref="jdbcTemplate" />
-	</bean>
-
-	<bean id="sendMessageScheduled"
-		class="org.hisp.dhis.scheduling.SendScheduledMessageTask"
-		parent="abstractScheduledMessageTask" scope="prototype">
-		<property name="sendingMessage" value="true" />
-		<property name="sendNow" value="false"/>
-	</bean>
-
-	<bean id="scheduleMessage"
-		class="org.hisp.dhis.scheduling.SendScheduledMessageTask"
-		parent="abstractScheduledMessageTask" scope="prototype">
-		<property name="sendingMessage" value="false" />
-		<property name="sendNow" value="false"/>
-	</bean>
-	
-	<bean id="sendMessageScheduledNow"
-		class="org.hisp.dhis.scheduling.SendScheduledMessageTask"
-		parent="abstractScheduledMessageTask" scope="prototype">
-		<property name="sendingMessage" value="false" />
-		<property name="sendNow" value="true"/>
-	</bean>
-	
-	<!-- DeletionManager -->
-
-	<bean id="org.hisp.dhis.caseaggregation.CaseAggregationConditionDeletionHandler"
-		class="org.hisp.dhis.caseaggregation.CaseAggregationConditionDeletionHandler">
-		<property name="aggregationConditionService"
-			ref="org.hisp.dhis.caseaggregation.CaseAggregationConditionService" />
-	</bean>
-	
-</beans>

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate/CaseAggregationCondition.hbm.xml'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate/CaseAggregationCondition.hbm.xml	2013-08-21 12:29:12 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/main/resources/org/hisp/dhis/caseaggregation/hibernate/CaseAggregationCondition.hbm.xml	1970-01-01 00:00:00 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd";
-  [<!ENTITY identifiableProperties SYSTEM "classpath://org/hisp/dhis/common/identifiableProperties.hbm">]
-  >
-
-<hibernate-mapping>
-  <class name="org.hisp.dhis.caseaggregation.CaseAggregationCondition" table="caseaggregationcondition">
-
-    <id name="id" column="caseaggregationconditionid">
-      <generator class="native" />
-    </id>
-    &identifiableProperties;
-
-    <property name="name" column="name" not-null="true" unique="true" length="230" />
-
-    <property name="operator" not-null="true" />
-
-    <property name="aggregationExpression" not-null="true" />
-
-    <many-to-one name="aggregationDataElement" class="org.hisp.dhis.dataelement.DataElement" column="aggregationDataElementid"
-      foreign-key="fk_caseaggregationcondition_dataelement" />
-
-    <many-to-one name="optionCombo" class="org.hisp.dhis.dataelement.DataElementCategoryOptionCombo" column="optionComboid"
-      foreign-key="fk_caseaggregationcondition_categoryoptioncomboid" />
-
-    <many-to-one name="deSum" class="org.hisp.dhis.dataelement.DataElement" column="deSum"
-      foreign-key="fk_caseaggregationcondition_deSum" />
-
-  </class>
-</hibernate-mapping>

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis'
=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation'
=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionServiceTest.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionServiceTest.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionServiceTest.java	1970-01-01 00:00:00 +0000
@@ -1,449 +0,0 @@
-package org.hisp.dhis.caseaggregation;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import org.hisp.dhis.DhisSpringTest;
-import org.hisp.dhis.common.ValueType;
-import org.hisp.dhis.dataelement.DataElement;
-import org.hisp.dhis.dataelement.DataElementCategory;
-import org.hisp.dhis.dataelement.DataElementCategoryCombo;
-import org.hisp.dhis.dataelement.DataElementCategoryOption;
-import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
-import org.hisp.dhis.dataelement.DataElementCategoryService;
-import org.hisp.dhis.dataelement.DataElementDomain;
-import org.hisp.dhis.dataelement.DataElementService;
-import org.hisp.dhis.organisationunit.OrganisationUnit;
-import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.period.DailyPeriodType;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.period.PeriodType;
-import org.hisp.dhis.program.Program;
-import org.hisp.dhis.program.ProgramInstance;
-import org.hisp.dhis.program.ProgramInstanceService;
-import org.hisp.dhis.program.ProgramService;
-import org.hisp.dhis.program.ProgramStage;
-import org.hisp.dhis.program.ProgramStageInstance;
-import org.hisp.dhis.program.ProgramStageInstanceService;
-import org.hisp.dhis.program.ProgramStageService;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
-import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
-import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
-import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValue;
-import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueService;
-import org.joda.time.DateTime;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Chau Thu Tran
- */
-public class CaseAggregationConditionServiceTest
-    extends DhisSpringTest
-{
-    @Autowired
-    private CaseAggregationConditionService aggConditionServiceService;
-
-    @Autowired
-    private OrganisationUnitService organisationUnitService;
-
-    @Autowired
-    private ProgramService programService;
-
-    @Autowired
-    private ProgramStageService programStageService;
-
-    @Autowired
-    private TrackedEntityInstanceService entityInstanceService;
-
-    @Autowired
-    private DataElementService dataElementService;
-
-    @Autowired
-    private DataElementCategoryService categoryService;
-
-    @Autowired
-    private ProgramInstanceService programInstanceService;
-
-    @Autowired
-    private ProgramStageInstanceService programStageInstanceService;
-
-    @Autowired
-    private TrackedEntityDataValueService dataValueService;
-
-    @Autowired
-    private TrackedEntityAttributeService attributeService;
-
-    @Autowired
-    private PeriodService periodService;
-
-    private TrackedEntityAttribute attribute;
-
-    private DataElement dataElementA;
-
-    private DataElement dataElementB;
-
-    private DataElement dataElementC;
-
-    private DataElement dataElementD;
-
-    private DataElementCategoryOptionCombo categoryOptionCombo;
-
-    private Program program;
-
-    private CaseAggregationCondition conditionA;
-
-    private CaseAggregationCondition conditionB;
-
-    private OrganisationUnit organisationUnit;
-
-    private Period period;
-
-    private int stageBId;
-
-    @Override
-    public void setUpTest()
-    {
-        organisationUnit = createOrganisationUnit( 'A' );
-        organisationUnitService.addOrganisationUnit( organisationUnit );
-
-        // ---------------------------------------------------------------------
-        // Data elements && Category
-        // ---------------------------------------------------------------------
-
-        DataElementCategoryOption categoryOptionA = new DataElementCategoryOption( "Male" );
-        DataElementCategoryOption categoryOptionB = new DataElementCategoryOption( "Female" );
-        DataElementCategoryOption categoryOptionC = new DataElementCategoryOption( "0-20" );
-        DataElementCategoryOption categoryOptionD = new DataElementCategoryOption( "20-100" );
-
-        categoryService.addDataElementCategoryOption( categoryOptionA );
-        categoryService.addDataElementCategoryOption( categoryOptionB );
-        categoryService.addDataElementCategoryOption( categoryOptionC );
-        categoryService.addDataElementCategoryOption( categoryOptionD );
-
-        DataElementCategory categoryA = new DataElementCategory( "Gender" );
-        DataElementCategory categoryB = new DataElementCategory( "Agegroup" );
-
-        categoryA.getCategoryOptions().add( categoryOptionA );
-        categoryA.getCategoryOptions().add( categoryOptionB );
-        categoryB.getCategoryOptions().add( categoryOptionC );
-        categoryB.getCategoryOptions().add( categoryOptionD );
-
-        categoryService.addDataElementCategory( categoryA );
-        categoryService.addDataElementCategory( categoryB );
-
-        DataElementCategoryCombo categoryComboA = new DataElementCategoryCombo( "GenderAgegroup" );
-
-        categoryComboA.getCategories().add( categoryA );
-        categoryComboA.getCategories().add( categoryB );
-
-        categoryService.addDataElementCategoryCombo( categoryComboA );
-
-        categoryOptionCombo = new DataElementCategoryOptionCombo();
-        Set<DataElementCategoryOption> categoryOptions = new HashSet<>();
-        categoryOptions.add( categoryOptionA );
-        categoryOptions.add( categoryOptionB );
-        categoryOptionCombo.setCategoryCombo( categoryComboA );
-        categoryOptionCombo.setCategoryOptions( categoryOptions );
-        categoryService.addDataElementCategoryOptionCombo( categoryOptionCombo );
-
-        dataElementA = createDataElement( 'A' );
-        dataElementA.setValueType( ValueType.TEXT );
-        dataElementA.setDomainType( DataElementDomain.TRACKER );
-
-        dataElementB = createDataElement( 'B' );
-        dataElementB.setValueType( ValueType.TEXT );
-        dataElementB.setDomainType( DataElementDomain.TRACKER );
-
-        dataElementC = createDataElement( 'C' );
-        dataElementC.setDomainType( DataElementDomain.AGGREGATE );
-
-        dataElementD = createDataElement( 'D' );
-        dataElementD.setDomainType( DataElementDomain.AGGREGATE );
-
-        int deAId = dataElementService.addDataElement( dataElementA );
-        int deBId = dataElementService.addDataElement( dataElementB );
-        dataElementService.addDataElement( dataElementC );
-        dataElementService.addDataElement( dataElementD );
-
-        // ---------------------------------------------------------------------
-        // TrackedEntityInstance
-        // ---------------------------------------------------------------------
-
-        TrackedEntityInstance entityInstance = createTrackedEntityInstance( 'A', organisationUnit );
-        entityInstanceService.addTrackedEntityInstance( entityInstance );
-
-        // ---------------------------------------------------------------------
-        // Attribue value
-        // ---------------------------------------------------------------------
-
-        attribute = createTrackedEntityAttribute( 'A' );
-        int attributeId = attributeService.addTrackedEntityAttribute( attribute );
-
-        TrackedEntityAttributeValue attributeValue = createTrackedEntityAttributeValue( 'A', entityInstance, attribute );
-        Set<TrackedEntityAttributeValue> attributeValues = new HashSet<>();
-        attributeValues.add( attributeValue );
-
-        // ---------------------------------------------------------------------
-        // Program && Program stages
-        // ---------------------------------------------------------------------
-
-        program = createProgram( 'A', new HashSet<>(), organisationUnit );
-        int programId = programService.addProgram( program );
-
-        ProgramStage stageA = new ProgramStage( "Stage-A", program );
-        int stageAId = programStageService.saveProgramStage( stageA );
-
-        ProgramStage stageB = new ProgramStage( "Stage-B", program );
-        stageBId = programStageService.saveProgramStage( stageB );
-
-        Set<ProgramStage> programStages = new HashSet<>();
-        programStages.add( stageA );
-        programStages.add( stageB );
-        program.setProgramStages( programStages );
-        programService.updateProgram( program );
-
-        // ---------------------------------------------------------------------
-        // Program Instance && data values
-        // ---------------------------------------------------------------------
-
-        DateTime today = DateTime.now();
-        ProgramInstance programInstance = programInstanceService.enrollTrackedEntityInstance( entityInstance, program,
-            today.toDate(), today.toDate(), organisationUnit );
-
-        ProgramStageInstance stageInstanceA = programStageInstanceService.createProgramStageInstance( programInstance,
-            stageA, today.toDate(), today.toDate(), organisationUnit );
-        ProgramStageInstance stageInstanceB = programStageInstanceService.createProgramStageInstance( programInstance,
-            stageB, today.toDate(), today.toDate(), organisationUnit );
-
-        TrackedEntityDataValue dataValueA = new TrackedEntityDataValue( stageInstanceA, dataElementA, "A" );
-        TrackedEntityDataValue dataValueB = new TrackedEntityDataValue( stageInstanceA, dataElementB, "B" );
-        TrackedEntityDataValue dataValueC = new TrackedEntityDataValue( stageInstanceB, dataElementA, "C" );
-        TrackedEntityDataValue dataValueD = new TrackedEntityDataValue( stageInstanceB, dataElementB, "D" );
-
-        dataValueService.saveTrackedEntityDataValue( dataValueA );
-        dataValueService.saveTrackedEntityDataValue( dataValueB );
-        dataValueService.saveTrackedEntityDataValue( dataValueC );
-        dataValueService.saveTrackedEntityDataValue( dataValueD );
-
-        // ---------------------------------------------------------------------
-        // Period
-        // ---------------------------------------------------------------------
-
-        PeriodType periodType = periodService.getPeriodTypeByName( DailyPeriodType.NAME );
-        period = new Period();
-        period.setPeriodType( periodType );
-        period.setStartDate( today.toDate() );
-        period.setEndDate( today.toDate() );
-        periodService.addPeriod( period );
-
-        // ---------------------------------------------------------------------
-        // CaseAggregationCondition
-        // ---------------------------------------------------------------------
-
-        String expression = "[" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageAId + "." + deAId + "] is not null";
-        expression += " AND [" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageAId + "." + deBId + "] is not null";
-        expression += " AND [" + CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE
-            + CaseAggregationCondition.SEPARATOR_OBJECT + attributeId + "] is not null";
-        conditionA = new CaseAggregationCondition( "A", CaseAggregationCondition.AGGRERATION_COUNT, expression,
-            dataElementC, categoryOptionCombo );
-
-        expression = "[" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageBId + "." + deAId + "] is not null";
-        conditionB = new CaseAggregationCondition( "B", CaseAggregationCondition.AGGRERATION_COUNT, expression,
-            dataElementD, categoryOptionCombo );
-    }
-
-    @Test
-    public void testAddCaseAggregationCondition()
-    {
-        int idA = aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        int idB = aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idB ) );
-    }
-
-    @Test
-    public void testUpdateCaseAggregationCondition()
-    {
-        int idA = aggConditionServiceService.addCaseAggregationCondition( conditionA );
-
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-
-        conditionA.setName( "B" );
-        aggConditionServiceService.updateCaseAggregationCondition( conditionA );
-
-        assertEquals( "B", aggConditionServiceService.getCaseAggregationCondition( idA ).getName() );
-    }
-
-    @Test
-    public void testDeleteCaseAggregationCondition()
-    {
-        int idA = aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        int idB = aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idB ) );
-
-        aggConditionServiceService.deleteCaseAggregationCondition( conditionA );
-
-        assertNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idB ) );
-
-        aggConditionServiceService.deleteCaseAggregationCondition( conditionB );
-
-        assertNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertNull( aggConditionServiceService.getCaseAggregationCondition( idB ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionById()
-    {
-        int idA = aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        int idB = aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        assertEquals( conditionA, aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertEquals( conditionB, aggConditionServiceService.getCaseAggregationCondition( idB ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByName()
-    {
-        int idA = aggConditionServiceService.addCaseAggregationCondition( conditionA );
-
-        assertNotNull( aggConditionServiceService.getCaseAggregationCondition( idA ) );
-        assertEquals( conditionA, aggConditionServiceService.getCaseAggregationCondition( "A" ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByUid()
-    {
-        conditionA.setUid( "ABC" );
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-
-        assertEquals( conditionA, aggConditionServiceService.getCaseAggregationConditionByUid( "ABC" ) );
-    }
-
-    @Test
-    public void testGetAllCaseAggregationCondition()
-    {
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        assertTrue( equals( aggConditionServiceService.getAllCaseAggregationCondition(), conditionA, conditionB ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByDe()
-    {
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        assertTrue( equals( aggConditionServiceService.getCaseAggregationCondition( dataElementC ), conditionA ) );
-        assertTrue( equals( aggConditionServiceService.getCaseAggregationCondition( dataElementD ), conditionB ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByDeOptionCombo()
-    {
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        CaseAggregationCondition condition = aggConditionServiceService.getCaseAggregationCondition( dataElementC,
-            categoryOptionCombo );
-        assertEquals( conditionA, condition );
-
-        condition = aggConditionServiceService.getCaseAggregationCondition( dataElementD, categoryOptionCombo );
-        assertEquals( conditionB, condition );
-    }
-
-    @Test
-    public void testGetCaseAggregationCondition()
-    {
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        Collection<DataElement> dataElements = new HashSet<>();
-        dataElements.add( dataElementC );
-        dataElements.add( dataElementD );
-
-        assertTrue( equals( aggConditionServiceService.getCaseAggregationConditions( dataElements, null, null, null ),
-            conditionA, conditionB ) );
-    }
-
-    @Test
-    public void testGetDataElementsInCondition()
-    {
-        aggConditionServiceService.addCaseAggregationCondition( conditionA );
-        aggConditionServiceService.addCaseAggregationCondition( conditionB );
-
-        Collection<DataElement> dataElements = aggConditionServiceService.getDataElementsInCondition( conditionA
-            .getAggregationExpression() );
-        assertTrue( equals( dataElements, dataElementA, dataElementB ) );
-    }
-
-    @Test
-    public void testGetProgramsInCondition()
-    {
-        Collection<Program> programs = aggConditionServiceService.getProgramsInCondition( conditionA
-            .getAggregationExpression() );
-        assertTrue( equals( programs, program ) );
-    }
-
-    @Test
-    public void testGetTrackedEntityAttributesInCondition()
-    {
-        Collection<TrackedEntityAttribute> attributes = aggConditionServiceService
-            .getTrackedEntityAttributesInCondition( conditionA.getAggregationExpression() );
-        assertTrue( equals( attributes, attribute ) );
-    }
-
-    @Test
-    public void testGetConditionDescription()
-    {
-        String actual = aggConditionServiceService.getConditionDescription( conditionB.getAggregationExpression() );
-        String expected = "[ProgramA.Stage-B.DataElementA] is not null";
-        assertEquals( expected, actual );
-    }
-
-}

=== removed file 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStoreTest.java'
--- dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStoreTest.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-services/dhis-service-eventreporting/src/test/java/org/hisp/dhis/caseaggregation/CaseAggregationConditionStoreTest.java	1970-01-01 00:00:00 +0000
@@ -1,333 +0,0 @@
-package org.hisp.dhis.caseaggregation;
-
-/*
- * Copyright (c) 2004-2016, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.hisp.dhis.DhisSpringTest;
-import org.hisp.dhis.common.ValueType;
-import org.hisp.dhis.dataelement.DataElement;
-import org.hisp.dhis.dataelement.DataElementCategory;
-import org.hisp.dhis.dataelement.DataElementCategoryCombo;
-import org.hisp.dhis.dataelement.DataElementCategoryOption;
-import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
-import org.hisp.dhis.dataelement.DataElementCategoryService;
-import org.hisp.dhis.dataelement.DataElementDomain;
-import org.hisp.dhis.dataelement.DataElementService;
-import org.hisp.dhis.organisationunit.OrganisationUnit;
-import org.hisp.dhis.organisationunit.OrganisationUnitService;
-import org.hisp.dhis.period.DailyPeriodType;
-import org.hisp.dhis.period.Period;
-import org.hisp.dhis.period.PeriodService;
-import org.hisp.dhis.period.PeriodType;
-import org.hisp.dhis.program.Program;
-import org.hisp.dhis.program.ProgramInstance;
-import org.hisp.dhis.program.ProgramInstanceService;
-import org.hisp.dhis.program.ProgramService;
-import org.hisp.dhis.program.ProgramStage;
-import org.hisp.dhis.program.ProgramStageInstance;
-import org.hisp.dhis.program.ProgramStageInstanceService;
-import org.hisp.dhis.program.ProgramStageService;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
-import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
-import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
-import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValue;
-import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueService;
-import org.joda.time.DateTime;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author Chau Thu Tran
- * 
- * @version $ CaseAggregationConditionStoreTest.java Nov 29, 2013 10:01:48 AM $
- */
-public class CaseAggregationConditionStoreTest
-    extends DhisSpringTest
-{
-    @Autowired
-    private CaseAggregationConditionStore aggConditionServiceStore;
-
-    @Autowired
-    private OrganisationUnitService organisationUnitService;
-
-    @Autowired
-    private ProgramService programService;
-
-    @Autowired
-    private ProgramStageService programStageService;
-
-    @Autowired
-    private TrackedEntityInstanceService entityInstanceService;
-
-    @Autowired
-    private DataElementService dataElementService;
-
-    @Autowired
-    private DataElementCategoryService categoryService;
-
-    @Autowired
-    private ProgramInstanceService programInstanceService;
-
-    @Autowired
-    private ProgramStageInstanceService programStageInstanceService;
-
-    @Autowired
-    private TrackedEntityDataValueService dataValueService;
-
-    @Autowired
-    private TrackedEntityAttributeService attributeService;
-
-    @Autowired
-    private PeriodService periodService;
-
-    private TrackedEntityAttribute attribute;
-
-    private DataElement dataElementA;
-
-    private DataElement dataElementB;
-
-    private DataElement dataElementC;
-
-    private DataElement dataElementD;
-
-    private DataElementCategoryOptionCombo categoryOptionCombo;
-
-    private Program program;
-
-    private CaseAggregationCondition conditionA;
-
-    private CaseAggregationCondition conditionB;
-
-    private OrganisationUnit organisationUnit;
-
-    private Period period;
-
-    private int stageBId;
-
-    @Override
-    public void setUpTest()
-    {
-        organisationUnit = createOrganisationUnit( 'A' );
-        organisationUnitService.addOrganisationUnit( organisationUnit );
-
-        // ---------------------------------------------------------------------
-        // Data elements && Category
-        // ---------------------------------------------------------------------
-
-        DataElementCategoryOption categoryOptionA = new DataElementCategoryOption( "Male" );
-        DataElementCategoryOption categoryOptionB = new DataElementCategoryOption( "Female" );
-        DataElementCategoryOption categoryOptionC = new DataElementCategoryOption( "0-20" );
-        DataElementCategoryOption categoryOptionD = new DataElementCategoryOption( "20-100" );
-
-        categoryService.addDataElementCategoryOption( categoryOptionA );
-        categoryService.addDataElementCategoryOption( categoryOptionB );
-        categoryService.addDataElementCategoryOption( categoryOptionC );
-        categoryService.addDataElementCategoryOption( categoryOptionD );
-
-        DataElementCategory categoryA = new DataElementCategory( "Gender" );
-        DataElementCategory categoryB = new DataElementCategory( "Agegroup" );
-
-        categoryA.getCategoryOptions().add( categoryOptionA );
-        categoryA.getCategoryOptions().add( categoryOptionB );
-        categoryB.getCategoryOptions().add( categoryOptionC );
-        categoryB.getCategoryOptions().add( categoryOptionD );
-
-        categoryService.addDataElementCategory( categoryA );
-        categoryService.addDataElementCategory( categoryB );
-
-        DataElementCategoryCombo categoryComboA = new DataElementCategoryCombo( "GenderAgegroup" );
-
-        categoryComboA.getCategories().add( categoryA );
-        categoryComboA.getCategories().add( categoryB );
-
-        categoryService.addDataElementCategoryCombo( categoryComboA );
-
-        categoryOptionCombo = new DataElementCategoryOptionCombo();
-        Set<DataElementCategoryOption> categoryOptions = new HashSet<>();
-        categoryOptions.add( categoryOptionA );
-        categoryOptions.add( categoryOptionB );
-        categoryOptionCombo.setCategoryCombo( categoryComboA );
-        categoryOptionCombo.setCategoryOptions( categoryOptions );
-        categoryService.addDataElementCategoryOptionCombo( categoryOptionCombo );
-
-        dataElementA = createDataElement( 'A' );
-        dataElementA.setValueType( ValueType.TEXT );
-        dataElementA.setDomainType( DataElementDomain.TRACKER );
-
-        dataElementB = createDataElement( 'B' );
-        dataElementB.setValueType( ValueType.TEXT );
-        dataElementB.setDomainType( DataElementDomain.TRACKER );
-
-        dataElementC = createDataElement( 'C' );
-        dataElementC.setDomainType( DataElementDomain.AGGREGATE );
-
-        dataElementD = createDataElement( 'D' );
-        dataElementD.setDomainType( DataElementDomain.AGGREGATE );
-
-        int deAId = dataElementService.addDataElement( dataElementA );
-        int deBId = dataElementService.addDataElement( dataElementB );
-        dataElementService.addDataElement( dataElementC );
-        dataElementService.addDataElement( dataElementD );
-
-        // ---------------------------------------------------------------------
-        // TrackedEntityInstance
-        // ---------------------------------------------------------------------
-
-        TrackedEntityInstance entityInstance = createTrackedEntityInstance( 'A', organisationUnit );
-        entityInstanceService.addTrackedEntityInstance( entityInstance );
-
-        // ---------------------------------------------------------------------
-        // Attribue value
-        // ---------------------------------------------------------------------
-
-        attribute = createTrackedEntityAttribute( 'A' );
-        int attributeId = attributeService.addTrackedEntityAttribute( attribute );
-
-        TrackedEntityAttributeValue attributeValue = createTrackedEntityAttributeValue( 'A', entityInstance, attribute );
-        Set<TrackedEntityAttributeValue> attributeValues = new HashSet<>();
-        attributeValues.add( attributeValue );
-
-        // ---------------------------------------------------------------------
-        // Program && Program stages
-        // ---------------------------------------------------------------------
-
-        program = createProgram( 'A', new HashSet<>(), organisationUnit );
-        int programId = programService.addProgram( program );
-
-        ProgramStage stageA = new ProgramStage( "Stage-A", program );
-        int stageAId = programStageService.saveProgramStage( stageA );
-
-        ProgramStage stageB = new ProgramStage( "Stage-B", program );
-        stageBId = programStageService.saveProgramStage( stageB );
-
-        Set<ProgramStage> programStages = new HashSet<>();
-        programStages.add( stageA );
-        programStages.add( stageB );
-        program.setProgramStages( programStages );
-        programService.updateProgram( program );
-
-        // ---------------------------------------------------------------------
-        // Program Instance && data values
-        // ---------------------------------------------------------------------
-
-        DateTime today = DateTime.now();
-        today.withTimeAtStartOfDay();
-        ProgramInstance programInstance = programInstanceService.enrollTrackedEntityInstance( entityInstance, program,
-            today.toDate(), today.toDate(), organisationUnit );
-
-        ProgramStageInstance stageInstanceA = programStageInstanceService.createProgramStageInstance( programInstance,
-            stageA, today.toDate(), today.toDate(), organisationUnit );
-        ProgramStageInstance stageInstanceB = programStageInstanceService.createProgramStageInstance( programInstance,
-            stageB, today.toDate(), today.toDate(), organisationUnit );
-
-        TrackedEntityDataValue dataValueA = new TrackedEntityDataValue( stageInstanceA, dataElementA, "A" );
-        TrackedEntityDataValue dataValueB = new TrackedEntityDataValue( stageInstanceA, dataElementB, "B" );
-        TrackedEntityDataValue dataValueC = new TrackedEntityDataValue( stageInstanceB, dataElementA, "C" );
-        TrackedEntityDataValue dataValueD = new TrackedEntityDataValue( stageInstanceB, dataElementB, "D" );
-
-        dataValueService.saveTrackedEntityDataValue( dataValueA );
-        dataValueService.saveTrackedEntityDataValue( dataValueB );
-        dataValueService.saveTrackedEntityDataValue( dataValueC );
-        dataValueService.saveTrackedEntityDataValue( dataValueD );
-
-        // ---------------------------------------------------------------------
-        // Period
-        // ---------------------------------------------------------------------
-
-        PeriodType periodType = periodService.getPeriodTypeByName( DailyPeriodType.NAME );
-        period = new Period();
-        period.setPeriodType( periodType );
-        period.setStartDate( today.toDate() );
-        period.setEndDate( today.toDate() );
-        periodService.addPeriod( period );
-
-        // ---------------------------------------------------------------------
-        // CaseAggregationCondition
-        // ---------------------------------------------------------------------
-
-        String expression = "[" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageAId + "." + deAId + "] is not null";
-        expression += " AND [" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageAId + "." + deBId + "] is not null";
-        expression += " AND [" + CaseAggregationCondition.OBJECT_TRACKED_ENTITY_ATTRIBUTE
-            + CaseAggregationCondition.SEPARATOR_OBJECT + attributeId + "] is not null";
-        conditionA = new CaseAggregationCondition( "A", CaseAggregationCondition.AGGRERATION_COUNT, expression,
-            dataElementC, categoryOptionCombo );
-
-        expression = "[" + CaseAggregationCondition.OBJECT_PROGRAM_STAGE_DATAELEMENT
-            + CaseAggregationCondition.SEPARATOR_OBJECT + programId + "." + stageBId + "." + deAId + "] is not null";
-        conditionB = new CaseAggregationCondition( "B", CaseAggregationCondition.AGGRERATION_COUNT, expression,
-            dataElementD, categoryOptionCombo );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByDe()
-    {
-        aggConditionServiceStore.save( conditionA );
-        aggConditionServiceStore.save( conditionB );
-
-        assertTrue( equals( aggConditionServiceStore.get( dataElementC ), conditionA ) );
-        assertTrue( equals( aggConditionServiceStore.get( dataElementD ), conditionB ) );
-    }
-
-    @Test
-    public void testGetCaseAggregationConditionByDeOptionCombo()
-    {
-        aggConditionServiceStore.save( conditionA );
-        aggConditionServiceStore.save( conditionB );
-
-        CaseAggregationCondition condition = aggConditionServiceStore.get( dataElementC, categoryOptionCombo );
-        assertEquals( conditionA, condition );
-
-        condition = aggConditionServiceStore.get( dataElementD, categoryOptionCombo );
-        assertEquals( conditionB, condition );
-    }
-
-    @Test
-    public void testGetCaseAggregationCondition()
-    {
-        aggConditionServiceStore.save( conditionA );
-        aggConditionServiceStore.save( conditionB );
-
-        Collection<DataElement> dataElements = new HashSet<>();
-        dataElements.add( dataElementC );
-        dataElements.add( dataElementD );
-
-        assertTrue( equals( aggConditionServiceStore.get( dataElements, null, null, null ), conditionA, conditionB ) );
-    }
-
-}

=== removed directory 'dhis-2/dhis-services/dhis-service-eventreporting/src/test/resources'
=== modified file 'dhis-2/dhis-services/pom.xml'
--- dhis-2/dhis-services/pom.xml	2016-01-15 00:52:40 +0000
+++ dhis-2/dhis-services/pom.xml	2016-02-22 11:40:17 +0000
@@ -28,7 +28,6 @@
     <module>dhis-service-administration</module>
     <module>dhis-service-analytics</module>
     <!-- Level 4 -->
-    <module>dhis-service-eventreporting</module>
     <module>dhis-service-reporting</module>
   </modules>
   
@@ -48,4 +47,4 @@
   <properties>
     <rootDir>../</rootDir>
   </properties>
-</project>
\ No newline at end of file
+</project>