dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #04092
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 1353: Improved performance of integriy checks by using queries.
Merge authors:
Lars Helge Øverland (larshelge)
------------------------------------------------------------
revno: 1353 [merge]
committer: Lars Helge Oeverland <larshelge@xxxxxxxxx>
branch nick: trunk
timestamp: Wed 2010-01-27 21:55:17 +0100
message:
Improved performance of integriy checks by using queries.
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorService.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorStore.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitStore.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java
dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/dataintegrity/DefaultDataIntegrityService.java
dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/DefaultIndicatorService.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/hibernate/HibernateIndicatorStore.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java
dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/hibernate/HibernateOrganisationUnitStore.java
dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml
dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/about/changeLog.vm
--
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.
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java 2010-01-25 15:21:02 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java 2010-01-27 11:51:54 +0000
@@ -267,6 +267,36 @@
*/
Collection<DataElement> getDataElementsByGroupSets( Set<DataElementGroupSet> groupSets );
+ /**
+ * Returns all DataElements which are not member of any DataElementGroups.
+ *
+ * @return all DataElements which are not member of any DataElementGroups.
+ */
+ Collection<DataElement> getDataElementsWithoutGroups();
+
+ /**
+ * Returns all DataElements which are not assigned to any DataSets.
+ *
+ * @return all DataElements which are not assigned to any DataSets.
+ */
+ Collection<DataElement> getDataElementsWithoutDataSets();
+
+ /**
+ * Checks whether a DataElement with the given identifier exists.
+ *
+ * @param id the DataElement identifier.
+ * @return true or false.
+ */
+ boolean dataElementExists( int id );
+
+ /**
+ * Checks whether a DataElementCategoryOptionCombo with the given identifier exists.
+ *
+ * @param id the DataElementCategoryOptionCombo identifier.
+ * @return true or false.
+ */
+ boolean dataElementCategoryOptionComboExists( int id );
+
// -------------------------------------------------------------------------
// Calculated Data Elements
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java 2010-01-25 07:24:27 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java 2010-01-27 11:51:54 +0000
@@ -204,6 +204,36 @@
* @return a collection of all DataElement
*/
Collection<DataElement> getDataElementsByZeroIsSignificant( boolean zeroIsSignificant );
+
+ /**
+ * Returns all DataElements which are not member of any DataElementGroups.
+ *
+ * @return all DataElements which are not member of any DataElementGroups.
+ */
+ Collection<DataElement> getDataElementsWithoutGroups();
+
+ /**
+ * Returns all DataElements which are not assigned to any DataSets.
+ *
+ * @return all DataElements which are not assigned to any DataSets.
+ */
+ Collection<DataElement> getDataElementsWithoutDataSets();
+
+ /**
+ * Checks whether a DataElement with the given identifier exists.
+ *
+ * @param id the DataElement identifier.
+ * @return true or false.
+ */
+ boolean dataElementExists( int id );
+
+ /**
+ * Checks whether a DataElementCategoryOptionCombo with the given identifier exists.
+ *
+ * @param id the DataElementCategoryOptionCombo identifier.
+ * @return true or false.
+ */
+ boolean dataElementCategoryOptionComboExists( int id );
// -------------------------------------------------------------------------
// Calculated Data Elements
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorService.java 2009-11-07 13:03:26 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorService.java 2010-01-27 11:51:54 +0000
@@ -64,6 +64,8 @@
Indicator getIndicatorByCode( String code );
Collection<Indicator> getIndicatorsWithGroupSets();
+
+ Collection<Indicator> getIndicatorsWithoutGroups();
// -------------------------------------------------------------------------
// IndicatorType
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorStore.java 2009-11-07 13:03:26 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorStore.java 2010-01-27 11:51:54 +0000
@@ -58,4 +58,6 @@
Indicator getIndicatorByCode( String code );
Collection<Indicator> getIndicatorsWithGroupSets();
+
+ Collection<Indicator> getIndicatorsWithoutGroups();
}
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java 2009-11-24 14:30:46 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitService.java 2010-01-27 11:51:54 +0000
@@ -224,6 +224,13 @@
* @param parentId the identifier of the parent OrganisationUnit.
*/
void updateOrganisationUnitParent( int organisationUnitId, int parentId );
+
+ /**
+ * Returns all OrganisationUnits which are not a member of any OrganisationUnitGroups.
+ *
+ * @return all OrganisationUnits which are not a member of any OrganisationUnitGroups.
+ */
+ Collection<OrganisationUnit> getOrganisationUnitsWithoutGroups();
// -------------------------------------------------------------------------
// OrganisationUnitHierarchy
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitStore.java 2010-01-19 21:48:28 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitStore.java 2010-01-27 11:51:54 +0000
@@ -94,6 +94,13 @@
*/
void updateOrganisationUnitParent( int organisationUnitId, int parentId );
+ /**
+ * Returns all OrganisationUnits which are not a member of any OrganisationUnitGroups.
+ *
+ * @return all OrganisationUnits which are not a member of any OrganisationUnitGroups.
+ */
+ Collection<OrganisationUnit> getOrganisationUnitsWithoutGroups();
+
// -------------------------------------------------------------------------
// OrganisationUnitHierarchy
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2010-01-20 11:47:21 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2010-01-27 20:55:17 +0000
@@ -86,7 +86,8 @@
public static final String REGRESSION_COLUMN_PREFIX = "regression_";
- private static final String EMPTY_REPLACEMENT = "_";
+ private static final String EMPTY_REPLACEMENT = "_";
+ private static final String EMPTY = "";
private static final String TABLE_PREFIX = "_report_";
private static final String REGEX_NUMERIC = "([0-9]*)";
@@ -958,7 +959,7 @@
string = string.toLowerCase();
string = string.replaceAll( " ", EMPTY_REPLACEMENT );
- string = string.replaceAll( "-", EMPTY_REPLACEMENT );
+ string = string.replaceAll( "-", EMPTY );
string = string.replaceAll( "<", EMPTY_REPLACEMENT + "lt" + EMPTY_REPLACEMENT );
string = string.replaceAll( ">", EMPTY_REPLACEMENT + "gt" + EMPTY_REPLACEMENT );
=== modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/dataintegrity/DefaultDataIntegrityService.java'
--- dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/dataintegrity/DefaultDataIntegrityService.java 2010-01-20 10:06:43 +0000
+++ dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/dataintegrity/DefaultDataIntegrityService.java 2010-01-27 11:51:54 +0000
@@ -132,28 +132,12 @@
public Collection<DataElement> getDataElementsWithoutDataSet()
{
- Collection<DataElement> dataElements = dataElementService.getAllDataElements();
-
- return FilterUtils.filter( dataElements, new Filter<DataElement>()
- {
- public boolean retain( DataElement object )
- {
- return object.getDataSets() == null || object.getDataSets().size() == 0;
- }
- } );
+ return dataElementService.getDataElementsWithoutDataSets();
}
public Collection<DataElement> getDataElementsWithoutGroups()
{
- Collection<DataElement> dataElements = dataElementService.getAllDataElements();
-
- return FilterUtils.filter( dataElements, new Filter<DataElement>()
- {
- public boolean retain( DataElement object )
- {
- return object.getGroups() == null || object.getGroups().size() == 0;
- }
- } );
+ return dataElementService.getDataElementsWithoutGroups();
}
public Map<DataElement, Collection<DataSet>> getDataElementsAssignedToDataSetsWithDifferentPeriodTypes()
@@ -235,15 +219,7 @@
public Collection<Indicator> getIndicatorsWithoutGroups()
{
- Collection<Indicator> indicators = indicatorService.getAllIndicators();
-
- return FilterUtils.filter( indicators, new Filter<Indicator>()
- {
- public boolean retain( Indicator object )
- {
- return object.getGroups() == null || object.getGroups().size() == 0;
- }
- } );
+ return indicatorService.getIndicatorsWithoutGroups();
}
public Map<Indicator, String> getInvalidIndicatorNumerators()
@@ -337,15 +313,7 @@
public Collection<OrganisationUnit> getOrganisationUnitsWithoutGroups()
{
- Collection<OrganisationUnit> organisationUnits = organisationUnitService.getAllOrganisationUnits();
-
- return FilterUtils.filter( organisationUnits, new Filter<OrganisationUnit>()
- {
- public boolean retain( OrganisationUnit object )
- {
- return object.getGroups() == null || object.getGroups().size() == 0;
- }
- } );
+ return organisationUnitService.getOrganisationUnitsWithoutGroups();
}
public Collection<OrganisationUnit> getOrganisationUnitsViolatingCompulsoryGroupSets()
=== modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml 2010-01-12 08:12:04 +0000
+++ dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml 2010-01-27 11:51:54 +0000
@@ -119,4 +119,15 @@
ref="org.hisp.dhis.organisationunit.OrganisationUnitService"/>
</bean>
+ <aop:config>
+
+ <aop:aspect ref="statementInterceptor">
+ <aop:around pointcut="execution( * org.hisp.dhis.dataintegrity.DataIntegrityService.getInvalidIndicatorNumerators() )" method="intercept"/>
+ <aop:around pointcut="execution( * org.hisp.dhis.dataintegrity.DataIntegrityService.getInvalidIndicatorDenominators() )" method="intercept"/>
+ <aop:around pointcut="execution( * org.hisp.dhis.dataintegrity.DataIntegrityService.getInvalidValidationRuleLeftSideExpressions() )" method="intercept"/>
+ <aop:around pointcut="execution( * org.hisp.dhis.dataintegrity.DataIntegrityService.getInvalidValidationRuleRightSideExpressions() )" method="intercept"/>
+ </aop:aspect>
+
+ </aop:config>
+
</beans>
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java 2010-01-25 15:21:02 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java 2010-01-27 11:51:54 +0000
@@ -330,7 +330,27 @@
return dataElements;
}
+
+ public Collection<DataElement> getDataElementsWithoutGroups()
+ {
+ return i18n( i18nService, dataElementStore.getDataElementsWithoutGroups() );
+ }
+
+ public Collection<DataElement> getDataElementsWithoutDataSets()
+ {
+ return i18n( i18nService, dataElementStore.getDataElementsWithoutDataSets() );
+ }
+ public boolean dataElementExists( int id )
+ {
+ return dataElementStore.dataElementExists( id );
+ }
+
+ public boolean dataElementCategoryOptionComboExists( int id )
+ {
+ return dataElementStore.dataElementCategoryOptionComboExists( id );
+ }
+
// -------------------------------------------------------------------------
// CalculatedDataElement
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java 2010-01-25 14:08:24 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java 2010-01-27 11:51:54 +0000
@@ -31,6 +31,7 @@
import java.util.HashSet;
import java.util.Set;
+import org.amplecode.quick.StatementManager;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
@@ -62,6 +63,13 @@
this.sessionFactory = sessionFactory;
}
+ private StatementManager statementManager;
+
+ public void setStatementManager( StatementManager statementManager )
+ {
+ this.statementManager = statementManager;
+ }
+
// -------------------------------------------------------------------------
// DataElement
// -------------------------------------------------------------------------
@@ -261,6 +269,36 @@
return criteria.list();
}
+ @SuppressWarnings( "unchecked" )
+ public Collection<DataElement> getDataElementsWithoutGroups()
+ {
+ String hql = "from DataElement d where d.groups.size = 0";
+
+ return sessionFactory.getCurrentSession().createQuery( hql ).list();
+ }
+
+ @SuppressWarnings( "unchecked" )
+ public Collection<DataElement> getDataElementsWithoutDataSets()
+ {
+ String hql = "from DataElement d where d.dataSets.size = 0";
+
+ return sessionFactory.getCurrentSession().createQuery( hql ).list();
+ }
+
+ public boolean dataElementExists( int id )
+ {
+ final String sql = "select count(*) from dataelement where dataelementid=" + id;
+
+ return statementManager.getHolder().queryForInteger( sql ) > 0;
+ }
+
+ public boolean dataElementCategoryOptionComboExists( int id )
+ {
+ final String sql = "select count(*) from categoryoptioncombo where categoryoptioncomboid=" + id;
+
+ return statementManager.getHolder().queryForInteger( sql ) > 0;
+ }
+
// -------------------------------------------------------------------------
// CalculatedDataElement
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java 2009-12-02 15:08:11 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java 2010-01-27 11:51:54 +0000
@@ -282,12 +282,12 @@
return CATEGORYOPTIONCOMBO_ID_NOT_NUMERIC;
}
- if ( dataElementService.getDataElement( dataElementId ) == null )
+ if ( !dataElementService.dataElementExists( dataElementId ) )
{
return DATAELEMENT_DOES_NOT_EXIST;
}
- if ( categoryService.getDataElementCategoryOptionCombo( categoryOptionComboId ) == null )
+ if ( !dataElementService.dataElementCategoryOptionComboExists( categoryOptionComboId ) )
{
return CATEGORYOPTIONCOMBO_DOES_NOT_EXIST;
}
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/DefaultIndicatorService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/DefaultIndicatorService.java 2009-11-26 14:02:44 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/DefaultIndicatorService.java 2010-01-27 11:51:54 +0000
@@ -176,6 +176,11 @@
return i18n( i18nService, indicatorStore.getIndicatorsWithGroupSets() );
}
+ public Collection<Indicator> getIndicatorsWithoutGroups()
+ {
+ return i18n( i18nService, indicatorStore.getIndicatorsWithoutGroups() );
+ }
+
// -------------------------------------------------------------------------
// IndicatorType
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/hibernate/HibernateIndicatorStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/hibernate/HibernateIndicatorStore.java 2009-11-07 13:03:26 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/indicator/hibernate/HibernateIndicatorStore.java 2010-01-27 11:51:54 +0000
@@ -156,10 +156,16 @@
@SuppressWarnings( "unchecked" )
public Collection<Indicator> getIndicatorsWithGroupSets()
{
- final String sql = "from Indicator d where d.groupSets.size > 0";
-
- Query query = sessionFactory.getCurrentSession().createQuery( sql );
-
- return query.list();
+ final String hql = "from Indicator d where d.groupSets.size > 0";
+
+ return sessionFactory.getCurrentSession().createQuery( hql ).list();
}
+
+ @SuppressWarnings( "unchecked" )
+ public Collection<Indicator> getIndicatorsWithoutGroups()
+ {
+ final String hql = "from Indicator d where d.groups.size = 0";
+
+ return sessionFactory.getCurrentSession().createQuery( hql ).list();
+ }
}
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java 2009-11-26 14:02:44 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/DefaultOrganisationUnitService.java 2010-01-27 11:51:54 +0000
@@ -391,6 +391,11 @@
organisationUnitStore.updateOrganisationUnitParent( organisationUnitId, parentId );
}
+ public Collection<OrganisationUnit> getOrganisationUnitsWithoutGroups()
+ {
+ return organisationUnitStore.getOrganisationUnitsWithoutGroups();
+ }
+
// -------------------------------------------------------------------------
// OrganisationUnitHierarchy
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/hibernate/HibernateOrganisationUnitStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/hibernate/HibernateOrganisationUnitStore.java 2009-11-03 18:32:48 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/organisationunit/hibernate/HibernateOrganisationUnitStore.java 2010-01-27 11:51:54 +0000
@@ -137,6 +137,14 @@
return session.createQuery( "from OrganisationUnit o where o.parent is null" ).list();
}
+ @SuppressWarnings( "unchecked" )
+ public Collection<OrganisationUnit> getOrganisationUnitsWithoutGroups()
+ {
+ String hql = "from OrganisationUnit o where o.groups.size = 0";
+
+ return sessionFactory.getCurrentSession().createQuery( hql ).list();
+ }
+
// -------------------------------------------------------------------------
// OrganisationUnitHierarchy
// -------------------------------------------------------------------------
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2009-12-24 14:47:25 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2010-01-27 11:51:54 +0000
@@ -17,6 +17,7 @@
<bean id="org.hisp.dhis.dataelement.DataElementStore"
class="org.hisp.dhis.dataelement.hibernate.HibernateDataElementStore">
<property name="sessionFactory" ref="sessionFactory"/>
+ <property name="statementManager" ref="statementManager"/>
</bean>
<bean id="org.hisp.dhis.dataelement.DataElementGroupStore"
=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/about/changeLog.vm'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/about/changeLog.vm 2009-09-07 14:32:45 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/about/changeLog.vm 2010-01-27 20:55:17 +0000
@@ -2,6 +2,8 @@
<h3>$i18n.getString( "change_log" )</h3>
<dl>
+ <dt>$i18n.getString( "release" ) 2.0.3:</dt>
+ <dd><a href="https://blueprints.launchpad.net/dhis2/+milestone/2.0.3" target="_blank">Launchpad $i18n.getString( "online_release_page" )</a></dd>
<dt>$i18n.getString( "release" ) 2.0.2:</dt>
<dd><a href="https://blueprints.launchpad.net/dhis2/+milestone/2.0.2" target="_blank">Launchpad $i18n.getString( "online_release_page" )</a></dd>
<dt>$i18n.getString( "release" ) 2.0.1:</dt>