Coverage report

  %line %branch
ca.spaz.cron.datasource.www.AbstractWWWDatasource
0% 
0% 

 1  
 /*
 2  
  *******************************************************************************
 3  
  * Copyright (c) 2005 Chris Rose and AIMedia
 4  
  * All rights reserved. AbstractWWWDatasource and the accompanying materials
 5  
  * are made available under the terms of the Common Public License v1.0
 6  
  * which accompanies this distribution, and is available at
 7  
  * http://www.eclipse.org/legal/cpl-v10.html
 8  
  * 
 9  
  * Contributors:
 10  
  *     Chris Rose
 11  
  *******************************************************************************/
 12  
 package ca.spaz.cron.datasource.www;
 13  
 
 14  
 import java.io.*;
 15  
 import java.net.URL;
 16  
 import java.util.*;
 17  
 import java.util.regex.*;
 18  
 
 19  
 import org.apache.log4j.Logger;
 20  
 import org.htmlparser.util.Translate;
 21  
 
 22  
 import ca.spaz.cron.database.*;
 23  
 import ca.spaz.cron.datasource.AbstractFoodDataSource;
 24  
 
 25  
 /**
 26  
  * The base class of all WWW food datasources.  Provides convenience methods for
 27  
  * some general functions, as well as some assertions about capabilities.
 28  
  *  
 29  
  * @author Chris Rose
 30  
  */
 31  
 public abstract class AbstractWWWDatasource extends AbstractFoodDataSource {
 32  
    /**
 33  
     * Logger for this class
 34  
     */
 35  0
    private static final Logger logger = Logger
 36  0
          .getLogger(AbstractWWWDatasource.class);
 37  
 
 38  
    /**
 39  
     * @param name The unique ID of this data source.
 40  
     */
 41  
    protected AbstractWWWDatasource(String name) {
 42  0
       super(name);
 43  0
    }
 44  
 
 45  
    /* (non-Javadoc)
 46  
     * @see ca.spaz.cron.datasource.AbstractFoodDataSource#doFindAllFoods()
 47  
     */
 48  
    protected abstract List doFindAllFoods();
 49  
 
 50  
    /* (non-Javadoc)
 51  
     * @see ca.spaz.cron.datasource.IFoodDatasource#getSources()
 52  
     */
 53  
    public final List getSources() {
 54  0
       return Collections.unmodifiableList(doGetSources());
 55  
    }
 56  
 
 57  
    /**
 58  
     * Retrieve a list of Sources available from this data source.
 59  
     * 
 60  
     * @return a <code>List</code> of sources for this datasource. 
 61  
     */
 62  
    protected abstract List doGetSources();
 63  
 
 64  
    /* (non-Javadoc)
 65  
     * @see ca.spaz.cron.datasource.IFoodDatasource#getFoodGroups()
 66  
     */
 67  
    public final List getFoodGroups() {
 68  0
       return Collections.unmodifiableList(doGetFoodGroups());
 69  
    }
 70  
 
 71  
    /**
 72  
     * Retrieve a list of food groups for this data source.
 73  
     * 
 74  
     * @return a <code>List</code> of <code>FoodGroup</code> implementations
 75  
     * containing all of the food groups in this data source.
 76  
     */
 77  
    protected abstract List doGetFoodGroups();
 78  
 
 79  
    /* (non-Javadoc)
 80  
     * @see ca.spaz.cron.datasource.IFoodDatasource#isSearchable()
 81  
     */
 82  
    public boolean isSearchable() {
 83  0
       return true;
 84  
    }
 85  
 
 86  
    /* (non-Javadoc)
 87  
     * @see ca.spaz.cron.datasource.IFoodDatasource#isListable()
 88  
     */
 89  
    public boolean isListable() {
 90  0
       return false;
 91  
    }
 92  
 
 93  
    /* (non-Javadoc)
 94  
     * @see ca.spaz.cron.datasource.IFoodDatasource#close()
 95  
     */
 96  
    public final void close() {
 97  0
       doClose();
 98  0
    }
 99  
 
 100  
    /**
 101  
     * 
 102  
     */
 103  
    protected abstract void doClose();
 104  
 
 105  
    /**
 106  
     * Utility method to retrieve food groups from a URL's data, using regular expressions
 107  
     * to mark the beginning and end of the list, as well as a regex to get the food group itself.
 108  
     * 
 109  
     * @param sourceUrl This is the URL whose data will be read.
 110  
     * @param startGroups This pattern should mark the beginning of the list of food groups.
 111  
     * @param endGroups This pattern should mark the end of the list of food groups.
 112  
     * @param groupID This pattern should mark an individual food group.  More specifically, 
 113  
     * it <em>must</em> provide at least two groupings, one of which will be the group key for
 114  
     * searching, and the other of which will be the group name for display.
 115  
     * @param keyGroup This is the group number in the groupID pattern that marks the search
 116  
     * key for the food group.
 117  
     * @param nameGroup This is the group number in the groupID pattern that marks the name
 118  
     * of the food group. 
 119  
     * @return A <code>List</code> of FoodGroup implementations that contains all food groups
 120  
     * available at the URL.
 121  
     * @throws IOException if there is an error reading from the URL.
 122  
     */
 123  
    protected List getFoodGroups(URL sourceUrl, Pattern startGroups,
 124  
          Pattern endGroups, Pattern groupID, int keyGroup, class="keyword">int nameGroup)
 125  
          throws IOException {
 126  
       
 127  0
       String grps = readURLAsString(sourceUrl);
 128  
       
 129  0
       List ret = new ArrayList();
 130  
    
 131  0
       Matcher matchFunction = startGroups.matcher(grps);
 132  0
       Matcher matchGroup = groupID.matcher(grps);
 133  0
       Matcher matchEnd = endGroups.matcher(grps);
 134  0
       if (matchFunction.find()) {
 135  0
          if (logger.isDebugEnabled()) {
 136  0
             logger.debug("getFoodGroups() - Found function start");
 137  
          }
 138  0
          int sidx = matchFunction.end();
 139  0
          int eidx = -1;
 140  0
          if (matchEnd.find(sidx)) {
 141  0
             eidx = matchEnd.start();
 142  
          }
 143  0
          if (eidx < 0) {
 144  0
             logger.error("getFoodGroups() - No end to function", null);
 145  0
             ret = Collections.EMPTY_LIST;
 146  0
             return ret;
 147  
          }
 148  0
          while (sidx < eidx && sidx > 0) {
 149  0
             if (matchGroup.find(sidx)) {
 150  0
                sidx = matchGroup.end();
 151  0
                WWWFoodGroup fg = new WWWFoodGroupImpl(matchGroup.group(keyGroup),
 152  
                      Translate.decode(matchGroup.group(nameGroup)));
 153  0
                ret.add(fg);
 154  0
             } else {
 155  0
                sidx = -1;
 156  
             }
 157  0
          }
 158  
       }
 159  0
       return ret;
 160  
    }
 161  
    
 162  
    protected static String readURLAsString(URL source) {
 163  0
       StringBuffer out = new StringBuffer();
 164  
       
 165  
       try {
 166  0
          BufferedReader br = new BufferedReader(class="keyword">new InputStreamReader(source.openStream()));
 167  0
          String line = br.readLine();
 168  0
          while (line != null) {
 169  0
             out.append(line);
 170  0
             line = br.readLine();
 171  0
          }
 172  0
          br.close();
 173  0
       } catch (IOException e) {
 174  0
          logger.error("readURLAsString(URL)", e);
 175  0
       }
 176  
       
 177  0
       return out.toString();
 178  
    }
 179  
 
 180  
    /* (non-Javadoc)
 181  
     * @see ca.spaz.cron.datasource.AbstractFoodDataSource#doFindFoods(java.lang.String[], java.lang.String, java.lang.String)
 182  
     */
 183  
    protected List doFindFoods(String[] keys, String foodGroup, String source) {
 184  
       // TODO Auto-generated method stub
 185  0
       return null;
 186  
    }
 187  
 
 188  
    /* (non-Javadoc)
 189  
     * @see ca.spaz.cron.datasource.AbstractFoodDataSource#doFindFoods(java.lang.String[])
 190  
     */
 191  
    protected List doFindFoods(String[] keys) {
 192  
       // TODO Auto-generated method stub
 193  0
       return null;
 194  
    }
 195  
 
 196  
    /* (non-Javadoc)
 197  
     * @see ca.spaz.cron.datasource.AbstractFoodDataSource#doGetMeasuresFor(ca.spaz.cron.database.Food)
 198  
     */
 199  
    protected List doGetMeasuresFor(Food food) {
 200  
       // TODO Auto-generated method stub
 201  0
       return null;
 202  
    }
 203  
 
 204  
    /* (non-Javadoc)
 205  
     * @see ca.spaz.cron.datasource.AbstractFoodDataSource#doGetNutrientsFor(ca.spaz.cron.database.Food, ca.spaz.cron.database.NutrientTable)
 206  
     */
 207  
    protected void doGetNutrientsFor(Food food, NutrientTable nutrients) {
 208  
       // TODO Auto-generated method stub
 209  
       
 210  0
    }
 211  
 
 212  
    public void initialize() {
 213  
       //No-op
 214  0
    }
 215  
    
 216  
 }

This report is generated by jcoverage, Maven and Maven JCoverage Plugin.