← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 8750: Removed old FormDefinitionController.

 

------------------------------------------------------------
revno: 8750
committer: Bob Jolliffe <bobjolliffe@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2012-10-29 13:52:55 +0000
message:
  Removed old FormDefinitionController.  
  Implemented a data structure definition endpoint on DataSet controller.
removed:
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/FormDefinitionController.java
added:
  dhis-2/dhis-web/dhis-web-api/src/main/resources/templates/metadata2dsd.xsl
modified:
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataSetController.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-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataSetController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataSetController.java	2012-10-17 17:04:50 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataSetController.java	2012-10-29 13:52:55 +0000
@@ -27,23 +27,38 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
 
 import org.hisp.dhis.api.utils.ContextUtils;
 import org.hisp.dhis.api.utils.FormUtils;
+import org.hisp.dhis.api.view.ClassPathUriResolver;
 import org.hisp.dhis.api.webdomain.form.Form;
+import org.hisp.dhis.common.view.ExportView;
 import org.hisp.dhis.dataset.DataSet;
 import org.hisp.dhis.datavalue.DataValue;
 import org.hisp.dhis.datavalue.DataValueService;
+import org.hisp.dhis.dxf2.metadata.ExportService;
+import org.hisp.dhis.dxf2.metadata.MetaData;
 import org.hisp.dhis.dxf2.utils.JacksonUtils;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodType;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -59,18 +74,40 @@
     extends AbstractCrudController<DataSet>
 {
     public static final String RESOURCE_PATH = "/dataSets";
-
+    public static final String DSD_TRANSFORM = "/templates/metadata2dsd.xsl";
+    
     // -------------------------------------------------------------------------
     // Dependencies
     // -------------------------------------------------------------------------
 
     @Autowired
+    private ExportService exportService;
+
+    @Autowired
     private DataValueService dataValueService;
 
     // -------------------------------------------------------------------------
     // Controller
     // -------------------------------------------------------------------------
 
+    @RequestMapping( produces = "application/dsd+xml" )
+    public void getStructureDefinition( @RequestParam Map<String, String> parameters, HttpServletResponse response ) 
+        throws IOException, TransformerConfigurationException, TransformerException
+    {
+        WebOptions options = filterMetadataOptions();
+        
+        MetaData metaData = exportService.getMetaData( options );
+
+        InputStream input = new ByteArrayInputStream(JacksonUtils.toXmlWithViewAsString(  metaData, ExportView.class ).getBytes("UTF-8"));
+        
+        TransformerFactory tf = TransformerFactory.newInstance();
+        tf.setURIResolver( new ClassPathUriResolver());
+
+        Transformer transformer = tf.newTransformer( new StreamSource( new ClassPathResource(DSD_TRANSFORM).getInputStream()) );
+        
+        transformer.transform( new StreamSource(input), new StreamResult( response.getOutputStream() ) );
+    }
+
     @RequestMapping( value = "/{uid}/form", method = RequestMethod.GET, produces = "application/json" )
     public void getFormJson( @PathVariable( "uid" ) String uid, @RequestParam( value = "ou", required = false ) String orgUnit,
         @RequestParam( value = "pe", required = false ) String period, HttpServletResponse response ) throws IOException
@@ -134,4 +171,20 @@
     public void postFormXml( @PathVariable( "uid" ) String uid, HttpServletRequest request, HttpServletResponse response )
     {
     }
+
+    /**
+     * select only the metadata required to describe form definitions
+     * 
+     * @return the filtered options 
+     */
+    private WebOptions filterMetadataOptions()
+    {      
+        WebOptions options = new WebOptions(new HashMap<String,String>());
+        options.setAssumeTrue( false);
+        options.addOption( "categoryOptionCombos", "true" );
+        options.addOption( "dataElements","true" );
+        options.addOption( "dataSets", "true" );   
+        return options;
+    }
+
 }

=== removed file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/FormDefinitionController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/FormDefinitionController.java	2012-09-15 21:52:33 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/FormDefinitionController.java	1970-01-01 00:00:00 +0000
@@ -1,112 +0,0 @@
-package org.hisp.dhis.api.controller;
-
-/*
- * Copyright (c) 2004-2012, 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.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.hisp.dhis.api.utils.ContextUtils;
-import org.hisp.dhis.common.view.ExportView;
-import org.hisp.dhis.dxf2.metadata.ExportService;
-import org.hisp.dhis.dxf2.metadata.MetaData;
-import org.hisp.dhis.dxf2.utils.JacksonUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- *  Exports a filtered view of the metadata sufficient for defining dataset reports
- *  Caveats: 
- *      - there is still much too much data.  
- *      - duplicated code
- *      - It would be better to render this as more form oriented view
- *      - It would be good to select individual forms based on dataset identifier
- * 
- *  @author Bob Jolliffe <bobjolliffe@xxxxxxxxx>
- */
-@Controller
-@RequestMapping( value = FormDefinitionController.RESOURCE_PATH )
-public class FormDefinitionController
-{
-    public static final String RESOURCE_PATH = "/forms";
-
-    @Autowired
-    private ExportService exportService;
-
-    @Autowired
-    private ContextUtils contextUtils;
-
-    @RequestMapping( value = FormDefinitionController.RESOURCE_PATH )
-    public String export( @RequestParam Map<String, String> parameters, Model model )
-    {
-        // Ignore web options to avoid security exploit
-        // WebOptions options = new WebOptions( parameters );
-        WebOptions options = setOptions();
-        
-        MetaData metaData = exportService.getMetaData( options );
-
-        model.addAttribute( "model", metaData );
-        model.addAttribute( "viewClass", "export" );
-
-        return "export";
-    }
-
-    @RequestMapping( value = FormDefinitionController.RESOURCE_PATH + ".xml", produces = "*/*" )
-    public void exportXml( @RequestParam Map<String, String> parameters, HttpServletResponse response ) throws IOException
-    {
-        WebOptions options = setOptions();
-        
-        MetaData metaData = exportService.getMetaData( options );
-
-        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_XML, ContextUtils.CacheStrategy.NO_CACHE, "metaData.xml", true );
-
-        JacksonUtils.toXmlWithView( response.getOutputStream(), metaData, ExportView.class );
-    }
-    
-    /**
-     * select only the metadata required to describe form definitions
-     * 
-     * @return the filtered options 
-     */
-    protected WebOptions setOptions()
-    {      
-        WebOptions options = new WebOptions(new HashMap<String,String>());
-        options.setAssumeTrue( false);
-        options.addOption( "categoryOptionCombos", "true" );
-        options.addOption( "dataElements","true" );
-        options.addOption( "dataSets", "true" );   
-        return options;
-    }
-}
-                                                
\ No newline at end of file

=== added file 'dhis-2/dhis-web/dhis-web-api/src/main/resources/templates/metadata2dsd.xsl'
--- dhis-2/dhis-web/dhis-web-api/src/main/resources/templates/metadata2dsd.xsl	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/resources/templates/metadata2dsd.xsl	2012-10-29 13:52:55 +0000
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet 
+    xmlns:d2="http://dhis2.org/schema/dxf/2.0";
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
+    version="1.0">
+    
+    <xsl:output method="xml" indent="yes"/>
+    
+    <xsl:key name="disaggs_per_categorycombo" 
+             match="/d2:metaData/d2:categoryOptionCombos/d2:categoryOptionCombo" 
+             use="d2:categoryCombo/@id"/>
+
+    <xsl:template match="/">
+        <reportTemplates>
+            <dataElements>
+                <xsl:apply-templates select="/d2:metaData/d2:dataElements"/>
+            </dataElements>
+            <disaggregations>
+                <xsl:apply-templates select="/d2:metaData/d2:categoryOptionCombos"/>
+            </disaggregations>
+            <xsl:apply-templates select="/d2:metaData/d2:dataSets"/>
+        </reportTemplates>
+    </xsl:template>
+    
+    <xsl:template match="d2:dataElement">
+        <dataElement uid="{@id}" code="{@code}" name="{@name}" type="{d2:type}"/>
+    </xsl:template>
+    
+    <xsl:template match="d2:categoryOptionCombo">
+        <!-- catoptcombos have no code :-(
+          <disaggregation uid="{@id}" code="{@code}" name="{@name}" />
+        -->
+        <disaggregation uid="{@id}" code="{@id}" name="{@name}" />
+    </xsl:template>
+    
+    <xsl:template match="d2:dataSet">
+        <reportTemplate>
+            <name>
+                <xsl:value-of select="@name"/>
+            </name>
+            <uid>
+                <xsl:value-of select="@id"/>
+            </uid>
+            <code>
+                <xsl:value-of select="@code"/>
+            </code>
+            <periodType>
+                <xsl:value-of select="d2:periodType"/>
+            </periodType>
+            <dataValueTemplates>
+                <xsl:apply-templates select="d2:dataElements" mode="dataset"/>
+            </dataValueTemplates>
+        </reportTemplate>
+    </xsl:template>
+    
+    <xsl:template match="d2:dataElement" mode="dataset">
+        <xsl:variable name="de_id" select="@id"/>
+        <xsl:variable name="de_code" select="@code"/>
+        <xsl:variable name="catcombo"
+                      select="/d2:metaData/d2:dataElements/d2:dataElement[@id=$de_id]/d2:categoryCombo/@id"/>
+        <xsl:for-each select="key('disaggs_per_categorycombo',$catcombo)">
+            <xsl:element name="dataValueTemplate">
+                <xsl:attribute name="dataElement">
+                    <xsl:value-of select="$de_code"/>
+                </xsl:attribute>
+                <xsl:attribute name="disaggregation">
+                    <xsl:value-of select="@id"/>
+                </xsl:attribute>        
+            </xsl:element>
+        </xsl:for-each>
+    </xsl:template>
+    
+</xsl:stylesheet>
\ No newline at end of file