dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #35572
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 18206: Validation, impl basic support for validation rule analysis in Web API
------------------------------------------------------------
revno: 18206
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2015-02-09 17:30:46 +0100
message:
Validation, impl basic support for validation rule analysis in Web API
added:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationSummary.java
dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/validation/ValidationController.java
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationResult.java
--
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/validation/ValidationResult.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationResult.java 2015-02-09 14:52:38 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationResult.java 2015-02-09 16:30:46 +0000
@@ -28,15 +28,23 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+import java.io.Serializable;
+
+import org.hisp.dhis.common.BaseIdentifiableObject;
+import org.hisp.dhis.common.DxfNamespaces;
import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.period.Period;
-import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
/**
* @author Margrethe Store
*/
+@JacksonXmlRootElement( localName = "validationResult", namespace = DxfNamespaces.DXF_2_0 )
public class ValidationResult
implements Serializable, Comparable<ValidationResult>
{
@@ -303,6 +311,9 @@
// Set and get methods
// -------------------------------------------------------------------------
+ @JsonProperty
+ @JsonSerialize( as = BaseIdentifiableObject.class )
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public OrganisationUnit getOrgUnit()
{
return orgUnit;
@@ -313,6 +324,9 @@
this.orgUnit = orgUnit;
}
+ @JsonProperty
+ @JsonSerialize( as = BaseIdentifiableObject.class )
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public Period getPeriod()
{
return period;
@@ -323,6 +337,9 @@
this.period = period;
}
+ @JsonProperty
+ @JsonSerialize( as = BaseIdentifiableObject.class )
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public DataElementCategoryOptionCombo getAttributeOptionCombo()
{
return attributeOptionCombo;
@@ -333,6 +350,9 @@
this.attributeOptionCombo = attributeOptionCombo;
}
+ @JsonProperty
+ @JsonSerialize( as = BaseIdentifiableObject.class )
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public ValidationRule getValidationRule()
{
return validationRule;
@@ -343,6 +363,8 @@
this.validationRule = validationRule;
}
+ @JsonProperty
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public Double getLeftsideValue()
{
return leftsideValue;
@@ -353,6 +375,8 @@
this.leftsideValue = leftsideValue;
}
+ @JsonProperty
+ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
public Double getRightsideValue()
{
return rightsideValue;
=== added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationSummary.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationSummary.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/validation/ValidationSummary.java 2015-02-09 16:30:46 +0000
@@ -0,0 +1,81 @@
+package org.hisp.dhis.validation;
+
+/*
+ * Copyright (c) 2004-2015, 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.ArrayList;
+import java.util.List;
+
+import org.hisp.dhis.common.DxfNamespaces;
+import org.hisp.dhis.dataelement.DataElementOperand;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+/**
+ * @author Lars Helge Overland
+ */
+@JacksonXmlRootElement( localName = "validationSummary", namespace = DxfNamespaces.DXF_2_0 )
+public class ValidationSummary
+{
+ private List<ValidationResult> validationRuleViolations = new ArrayList<>();
+
+ private List<DataElementOperand> outlierViolations = new ArrayList<>();
+
+ public ValidationSummary()
+ {
+ }
+
+ @JsonProperty
+ @JacksonXmlElementWrapper( localName = "validationRuleViolations", namespace = DxfNamespaces.DXF_2_0 )
+ @JacksonXmlProperty( localName = "validationRuleViolation", namespace = DxfNamespaces.DXF_2_0 )
+ public List<ValidationResult> getValidationRuleViolations()
+ {
+ return validationRuleViolations;
+ }
+
+ public void setValidationRuleViolations( List<ValidationResult> validationRuleViolations )
+ {
+ this.validationRuleViolations = validationRuleViolations;
+ }
+
+ @JsonProperty
+ @JacksonXmlElementWrapper( localName = "outlierViolations", namespace = DxfNamespaces.DXF_2_0 )
+ @JacksonXmlProperty( localName = "outlierViolation", namespace = DxfNamespaces.DXF_2_0 )
+ public List<DataElementOperand> getOutlierViolations()
+ {
+ return outlierViolations;
+ }
+
+ public void setOutlierViolations( List<DataElementOperand> outlierViolations )
+ {
+ this.outlierViolations = outlierViolations;
+ }
+}
=== added file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/validation/ValidationController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/validation/ValidationController.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/validation/ValidationController.java 2015-02-09 16:30:46 +0000
@@ -0,0 +1,121 @@
+package org.hisp.dhis.webapi.controller.validation;
+
+/*
+ * Copyright (c) 2004-2015, 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.ArrayList;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
+import org.hisp.dhis.dataelement.DataElementCategoryService;
+import org.hisp.dhis.dataset.DataSet;
+import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.organisationunit.OrganisationUnitService;
+import org.hisp.dhis.period.Period;
+import org.hisp.dhis.period.PeriodService;
+import org.hisp.dhis.period.PeriodType;
+import org.hisp.dhis.validation.ValidationResult;
+import org.hisp.dhis.validation.ValidationRuleService;
+import org.hisp.dhis.validation.ValidationSummary;
+import org.hisp.dhis.webapi.utils.ContextUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author Lars Helge Overland
+ */
+@Controller
+@RequestMapping( value = "/validation" )
+public class ValidationController
+{
+ @Autowired
+ private ValidationRuleService validationRuleService;
+
+ @Autowired
+ private DataSetService dataSetService;
+
+ @Autowired
+ private PeriodService periodService;
+
+ @Autowired
+ private OrganisationUnitService organisationUnitService;
+
+ @Autowired
+ private DataElementCategoryService categoryService;
+
+ @RequestMapping( value = "/dataSet/{ds}", method = RequestMethod.GET )
+ public String validate( @PathVariable String ds, @RequestParam String pe,
+ @RequestParam String ou, @RequestParam( required = false ) String aoc,
+ HttpServletResponse response, Model model )
+ {
+ DataSet dataSet = dataSetService.getDataSet( ds );
+
+ if ( dataSet == null )
+ {
+ ContextUtils.conflictResponse( response, "Data set does not exist: " + ds );
+ return null;
+ }
+
+ Period period = PeriodType.getPeriodFromIsoString( pe );
+
+ if ( period == null )
+ {
+ ContextUtils.conflictResponse( response, "Period does not exist: " + pe );
+ return null;
+ }
+
+ OrganisationUnit orgUnit = organisationUnitService.getOrganisationUnit( ou );
+
+ if ( orgUnit == null )
+ {
+ ContextUtils.conflictResponse( response, "Organisation unit does not exist: " + pe );
+ return null;
+ }
+
+ DataElementCategoryOptionCombo attributeOptionCombo = categoryService.getDataElementCategoryOptionCombo( aoc );
+
+ if ( attributeOptionCombo == null )
+ {
+ attributeOptionCombo = categoryService.getDefaultDataElementCategoryOptionCombo();
+ }
+
+ ValidationSummary summary = new ValidationSummary();
+
+ summary.setValidationRuleViolations( new ArrayList<ValidationResult>( validationRuleService.validate( dataSet, period, orgUnit, attributeOptionCombo ) ) );
+
+ model.addAttribute( "model", summary );
+ return "summary";
+ }
+}