← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 18167: Utility class to lookup categorycombo from distict categoryoptions

 

------------------------------------------------------------
revno: 18167
committer: Bob Jolliffe <bobjolliffe@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2015-02-03 14:49:54 +0000
message:
  Utility class to lookup categorycombo from distict categoryoptions
added:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/CategoryComboMap.java
  dhis-2/dhis-api/src/test/java/org/hisp/dhis/dataelement/CategoryComboMapTest.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
=== added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/CategoryComboMap.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/CategoryComboMap.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/CategoryComboMap.java	2015-02-03 14:49:54 +0000
@@ -0,0 +1,151 @@
+package org.hisp.dhis.dataelement;
+
+/*
+ * 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.Collection;
+import java.util.HashMap;
+import java.util.List;
+import org.hisp.dhis.common.IdentifiableProperty;
+
+/**
+ * CategoryComboMap is used to lookup categoryoptioncombos
+ * by identifiers of the categoryoptions. Identifiers must be trimmed
+ * of whitespace and be concatenated in the order given by the categories
+ * property in object of this class.
+ * 
+ * @author bobj
+ */
+public class CategoryComboMap {
+    
+    private final IdentifiableProperty idScheme;
+
+    private final List<DataElementCategory> categories;
+
+    private DataElementCategoryCombo categoryCombo;
+
+    private HashMap ccMap;
+
+    public List<DataElementCategory> getCategories() {
+        return categories;
+    }
+
+    public IdentifiableProperty getIdScheme() {
+        return idScheme;
+    }
+
+    public DataElementCategoryCombo getCategoryCombo() {
+        return categoryCombo;
+    }
+
+    public class CategoryComboMapException extends Exception {
+      public CategoryComboMapException(String msg) { super (msg); } 
+    }
+
+    public CategoryComboMap(DataElementCategoryCombo cc, IdentifiableProperty idScheme) 
+            throws CategoryComboMapException 
+    {
+        this.categoryCombo = cc;
+        this.idScheme = idScheme;
+        ccMap = new HashMap<>();
+
+        categories = categoryCombo.getCategories();
+        
+        Collection<DataElementCategoryOptionCombo> optionCombos = categoryCombo.getOptionCombos();
+
+        for (DataElementCategoryOptionCombo optionCombo : optionCombos) 
+        {
+   
+            Collection<DataElementCategoryOption> catopts = optionCombo.getCategoryOptions();
+            
+            String compositeIdentifier ="";
+            
+            for (DataElementCategory category : categories) 
+            {
+                DataElementCategoryOption catopt = category.getCategoryOption(optionCombo);
+                if (catopt == null) {
+                    throw new CategoryComboMapException(
+                            "No categoryOption in " + category.getName() + " matching " + optionCombo.getName());
+                }  else
+                {
+                    String identifier;
+                    
+                    switch (idScheme) {
+                        case UID:
+                            identifier = catopt.getUid().trim();
+                            break;
+                        case CODE:
+                            identifier = catopt.getCode().trim();
+                            break;
+                        case NAME:
+                            identifier = catopt.getName().trim();
+                            break;
+                        default:
+                            throw new CategoryComboMapException("Unsupported ID Scheme: " + idScheme.toString());
+                    }
+                    
+                    if (identifier == null) 
+                        throw new CategoryComboMapException(
+                            "No " + idScheme.toString() + " identifier for CategoryOption: " + catopt.getName());
+                    
+                    compositeIdentifier += "\"" + identifier + "\"";
+                }
+            }
+            this.ccMap.put(compositeIdentifier, optionCombo);
+        }
+    }
+    
+    /**
+     * Look up the categoryoptioncombo based on a composite identifier
+     * 
+     * @param compositeIdentifier
+     * @return
+     */
+    public DataElementCategoryOptionCombo getCategoryOptionCombo(String compositeIdentifier)
+    {
+        return (DataElementCategoryOptionCombo) ccMap.get(compositeIdentifier);
+    }
+    
+    /**
+     * Create a composite identifier from a list of identifiers
+     * 
+     * Note: identifiers must be in same order as list of categories in the map
+     * 
+     * @param identifiers
+     * @return
+     */
+    public String getKey (List<String> identifiers)
+    {
+        String key = "";
+        for (String identifier : identifiers)
+        {
+           key += "\"" + identifier + "\"";
+        }
+        return key;
+    }
+}

=== added file 'dhis-2/dhis-api/src/test/java/org/hisp/dhis/dataelement/CategoryComboMapTest.java'
--- dhis-2/dhis-api/src/test/java/org/hisp/dhis/dataelement/CategoryComboMapTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-api/src/test/java/org/hisp/dhis/dataelement/CategoryComboMapTest.java	2015-02-03 14:49:54 +0000
@@ -0,0 +1,142 @@
+package org.hisp.dhis.dataelement;
+
+/*
+ * 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.LinkedList;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import org.hisp.dhis.common.IdentifiableProperty;
+import static org.hisp.dhis.common.IdentifiableProperty.NAME;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author bobj
+ */
+public class CategoryComboMapTest {
+    private DataElementCategoryOption categoryOptionA;
+    private DataElementCategoryOption categoryOptionB;
+    private DataElementCategoryOption categoryOptionC;
+    private DataElementCategoryOption categoryOptionD;
+    private DataElementCategoryOption categoryOptionE;
+    private DataElementCategoryOption categoryOptionF;
+    
+    private DataElementCategory categoryA;
+    private DataElementCategory categoryB;
+    private DataElementCategory categoryC;
+    
+    private DataElementCategoryCombo categoryCombo;
+    
+    // -------------------------------------------------------------------------
+    // Fixture
+    // -------------------------------------------------------------------------
+
+    @Before
+    public void before()
+    {
+        categoryOptionA = new DataElementCategoryOption( "OptionA" );
+        categoryOptionB = new DataElementCategoryOption( "OptionB" );
+        categoryOptionC = new DataElementCategoryOption( "OptionC" );
+        categoryOptionD = new DataElementCategoryOption( "OptionD" );
+        categoryOptionE = new DataElementCategoryOption( "OptionE" );
+        categoryOptionF = new DataElementCategoryOption( "OptionF" );
+        
+        categoryA = new DataElementCategory( "CategoryA" );
+        categoryB = new DataElementCategory( "CategoryB" );
+        categoryC = new DataElementCategory( "CategoryC" );
+        
+        categoryA.getCategoryOptions().add( categoryOptionA );
+        categoryA.getCategoryOptions().add( categoryOptionB );
+        categoryB.getCategoryOptions().add( categoryOptionC );
+        categoryB.getCategoryOptions().add( categoryOptionD );
+        categoryC.getCategoryOptions().add( categoryOptionE );
+        categoryC.getCategoryOptions().add( categoryOptionF );
+        
+        categoryCombo = new DataElementCategoryCombo( "CategoryCombo" );
+        
+        categoryCombo.addDataElementCategory(categoryA);
+        categoryCombo.addDataElementCategory(categoryB);
+        categoryCombo.addDataElementCategory(categoryC);
+        
+        categoryCombo.generateOptionCombos();
+    }
+
+    @Test
+    public void testMapRetrievalByName()
+    {
+        try {
+            CategoryComboMap map = new CategoryComboMap(categoryCombo, NAME);
+            
+            List<DataElementCategoryOption> catopts = new LinkedList<>();
+            catopts.add(categoryOptionA);
+            catopts.add(categoryOptionC);
+            catopts.add(categoryOptionE);
+            
+            String key = "\"" + categoryOptionA.getName() + "\"" 
+                    + "\"" + categoryOptionC.getName() + "\""
+                    + "\"" + categoryOptionE.getName() + "\"";
+            DataElementCategoryOptionCombo catoptcombo = map.getCategoryOptionCombo(key);
+            
+            assertNotNull( catoptcombo );
+            assertTrue(catoptcombo.getCategoryOptions().containsAll(catopts));
+        } catch (CategoryComboMap.CategoryComboMapException ex) {
+            System.out.println(ex.getMessage());
+            assertTrue(ex.getMessage(),false);
+        }
+    }
+
+    @Test
+    public void testMapRetrievalByUid()
+    {
+        try {
+            CategoryComboMap map = new CategoryComboMap(categoryCombo, IdentifiableProperty.UID);
+            
+            List<DataElementCategoryOption> catopts = new LinkedList<>();
+            catopts.add(categoryOptionA);
+            catopts.add(categoryOptionC);
+            catopts.add(categoryOptionE);
+            
+            String key = "\"" + categoryOptionA.getUid() + "\"" 
+                    + "\"" + categoryOptionC.getUid() + "\""
+                    + "\"" + categoryOptionE.getUid() + "\"";
+            
+            DataElementCategoryOptionCombo catoptcombo = map.getCategoryOptionCombo(key);
+            
+            assertNotNull( catoptcombo );
+            assertTrue(catoptcombo.getCategoryOptions().containsAll(catopts));
+        } catch (CategoryComboMap.CategoryComboMapException ex) {
+            System.out.println(ex.getMessage());
+            assertTrue(ex.getMessage(),false);
+        }
+    }
+}