src/core/net/sf/basedb/util/bfs/MetadataModel.java

Code
Comments
Other
Rev Date Author Line
5193 27 Nov 09 nicklas 1 /**
5193 27 Nov 09 nicklas 2   $Id$
5193 27 Nov 09 nicklas 3
5193 27 Nov 09 nicklas 4   Copyright (C) 2009 Nicklas Nordborg
5193 27 Nov 09 nicklas 5
5193 27 Nov 09 nicklas 6   This file is part of BASE - BioArray Software Environment.
5193 27 Nov 09 nicklas 7   Available at http://base.thep.lu.se/
5193 27 Nov 09 nicklas 8
5193 27 Nov 09 nicklas 9   BASE is free software; you can redistribute it and/or
5193 27 Nov 09 nicklas 10   modify it under the terms of the GNU General Public License
5193 27 Nov 09 nicklas 11   as published by the Free Software Foundation; either version 3
5193 27 Nov 09 nicklas 12   of the License, or (at your option) any later version.
5193 27 Nov 09 nicklas 13
5193 27 Nov 09 nicklas 14   BASE is distributed in the hope that it will be useful,
5193 27 Nov 09 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5193 27 Nov 09 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5193 27 Nov 09 nicklas 17   GNU General Public License for more details.
5193 27 Nov 09 nicklas 18
5193 27 Nov 09 nicklas 19   You should have received a copy of the GNU General Public License
5193 27 Nov 09 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5193 27 Nov 09 nicklas 21 */
5193 27 Nov 09 nicklas 22 package net.sf.basedb.util.bfs;
5193 27 Nov 09 nicklas 23
5194 04 Dec 09 nicklas 24 import java.io.Writer;
5193 27 Nov 09 nicklas 25 import java.util.ArrayList;
5193 27 Nov 09 nicklas 26 import java.util.List;
5193 27 Nov 09 nicklas 27
5193 27 Nov 09 nicklas 28 /**
5193 27 Nov 09 nicklas 29   A model container of the contents of a BFS metadata file. This class
5193 27 Nov 09 nicklas 30   is primarily intended to be used when parsing a BFS metadata file 
5221 22 Jan 10 nicklas 31   (see {@link MetadataParser#parse(EventHandler)}), 
5194 04 Dec 09 nicklas 32   but it can be used to programmatically create a BFS metadata file and 
5194 04 Dec 09 nicklas 33   then write it out to a file (see {@link #print(Writer)}).
5193 27 Nov 09 nicklas 34   <p>
5193 27 Nov 09 nicklas 35   
5193 27 Nov 09 nicklas 36   The model can contain multiple sections, each one with multiple
5193 27 Nov 09 nicklas 37   entries. A section has a name, but it doesn't have to be unique.
5193 27 Nov 09 nicklas 38   An entry is either a key/value pair or a key/array of values.
5193 27 Nov 09 nicklas 39   There may be multiple entries with the same key in a section.
5193 27 Nov 09 nicklas 40   
5193 27 Nov 09 nicklas 41   @author Nicklas
5193 27 Nov 09 nicklas 42   @version 2.15
5193 27 Nov 09 nicklas 43   @base.modified $Date$
5193 27 Nov 09 nicklas 44 */
5193 27 Nov 09 nicklas 45 public class MetadataModel
5194 04 Dec 09 nicklas 46   implements EventHandler
5193 27 Nov 09 nicklas 47 {
5193 27 Nov 09 nicklas 48
5193 27 Nov 09 nicklas 49   private String subtype;
5193 27 Nov 09 nicklas 50   private List<Section> sections;
5193 27 Nov 09 nicklas 51   private Section files;
5194 04 Dec 09 nicklas 52   private Section currentSection;
5193 27 Nov 09 nicklas 53   
5193 27 Nov 09 nicklas 54   /**
5193 27 Nov 09 nicklas 55     Create a new metadata model.
5193 27 Nov 09 nicklas 56   */
5193 27 Nov 09 nicklas 57   public MetadataModel()
5193 27 Nov 09 nicklas 58   {
5193 27 Nov 09 nicklas 59     this.sections = new ArrayList<Section>();
5193 27 Nov 09 nicklas 60   }
5193 27 Nov 09 nicklas 61
5194 04 Dec 09 nicklas 62   /*
5194 04 Dec 09 nicklas 63     From the EventHandler interface
5194 04 Dec 09 nicklas 64     -------------------------------
5194 04 Dec 09 nicklas 65   */
6875 20 Apr 15 nicklas 66   @SuppressWarnings("rawtypes")
5194 04 Dec 09 nicklas 67   @Override
5224 27 Jan 10 nicklas 68   public void handleEvent(EventType eventType, Object eventData, BfsParser parser)
5194 04 Dec 09 nicklas 69   {
5194 04 Dec 09 nicklas 70     if (eventType == MetadataParser.BOF_EVENT)
5194 04 Dec 09 nicklas 71     {
5194 04 Dec 09 nicklas 72       setSubtype((String)eventData);
5194 04 Dec 09 nicklas 73     }
5194 04 Dec 09 nicklas 74     else if (eventType == MetadataParser.SECTION_EVENT)
5194 04 Dec 09 nicklas 75     {
5194 04 Dec 09 nicklas 76       currentSection = addSection((String)eventData);
5194 04 Dec 09 nicklas 77     }
5194 04 Dec 09 nicklas 78     else if (eventType == MetadataParser.ENTRY_EVENT)
5194 04 Dec 09 nicklas 79     {
5194 04 Dec 09 nicklas 80       currentSection.addEntry((SectionEntry)eventData);
5194 04 Dec 09 nicklas 81     }
5194 04 Dec 09 nicklas 82   }
5194 04 Dec 09 nicklas 83   // ------------------------------------
5194 04 Dec 09 nicklas 84
5193 27 Nov 09 nicklas 85   /**
5194 04 Dec 09 nicklas 86     Utility method for printing the contents of this model object
5194 04 Dec 09 nicklas 87     to a stream.
5194 04 Dec 09 nicklas 88     @param out The output stream to write to
5194 04 Dec 09 nicklas 89   */
5194 04 Dec 09 nicklas 90   public void print(Writer out)
5194 04 Dec 09 nicklas 91   {
5194 04 Dec 09 nicklas 92     MetadataWriter bfs = new MetadataWriter(out);
5194 04 Dec 09 nicklas 93     bfs.setSubtype(getSubtype());
5194 04 Dec 09 nicklas 94     for (int i = 0; i < getSectionCount(); ++i)
5194 04 Dec 09 nicklas 95     {
5194 04 Dec 09 nicklas 96       Section s = getSection(i);
5194 04 Dec 09 nicklas 97       bfs.bfsPrintSection(s.getName(), false, false);
5194 04 Dec 09 nicklas 98       for (int j = 0; j < s.getEntryCount(); ++j)
5194 04 Dec 09 nicklas 99       {
5194 04 Dec 09 nicklas 100         SectionEntry e = s.getEntry(j);
5194 04 Dec 09 nicklas 101         bfs.bfsPrintValue(e.getKey(), e.getValues());
5194 04 Dec 09 nicklas 102       }
5194 04 Dec 09 nicklas 103     }
5194 04 Dec 09 nicklas 104     bfs.flush();
5194 04 Dec 09 nicklas 105   }
5194 04 Dec 09 nicklas 106   
5194 04 Dec 09 nicklas 107   /**
5193 27 Nov 09 nicklas 108     Set the subtype of the BFS.
5193 27 Nov 09 nicklas 109   */
5193 27 Nov 09 nicklas 110   public void setSubtype(String subtype)
5193 27 Nov 09 nicklas 111   {
5193 27 Nov 09 nicklas 112     this.subtype = subtype;
5193 27 Nov 09 nicklas 113   }
5193 27 Nov 09 nicklas 114   
5193 27 Nov 09 nicklas 115   /**
5193 27 Nov 09 nicklas 116     Get the BFS subtype.
5193 27 Nov 09 nicklas 117   */
5193 27 Nov 09 nicklas 118   public String getSubtype()
5193 27 Nov 09 nicklas 119   {
5193 27 Nov 09 nicklas 120     return subtype;
5193 27 Nov 09 nicklas 121   }
5193 27 Nov 09 nicklas 122   
5193 27 Nov 09 nicklas 123   /**
5193 27 Nov 09 nicklas 124     Get the number of sections.
5193 27 Nov 09 nicklas 125   */
5193 27 Nov 09 nicklas 126   public int getSectionCount()
5193 27 Nov 09 nicklas 127   {
5193 27 Nov 09 nicklas 128     return sections.size();
5193 27 Nov 09 nicklas 129   }
5193 27 Nov 09 nicklas 130   
5193 27 Nov 09 nicklas 131   /**
5193 27 Nov 09 nicklas 132     Adds a new section to the model.
5193 27 Nov 09 nicklas 133
5193 27 Nov 09 nicklas 134     @param name The name of the section
5193 27 Nov 09 nicklas 135     @return The new section
5193 27 Nov 09 nicklas 136   */
5193 27 Nov 09 nicklas 137   public Section addSection(String name)
5193 27 Nov 09 nicklas 138   {
5193 27 Nov 09 nicklas 139     Section s = new Section(name);
5193 27 Nov 09 nicklas 140     sections.add(s);
5193 27 Nov 09 nicklas 141     if ("files".equals(name) && files == null) files = s;
5193 27 Nov 09 nicklas 142     return s;
5193 27 Nov 09 nicklas 143   }
5193 27 Nov 09 nicklas 144   
5193 27 Nov 09 nicklas 145   /**
5193 27 Nov 09 nicklas 146     Get the section at a given index.
5193 27 Nov 09 nicklas 147     @param index The index, a value between 0 and {@link #getSectionCount()}-1
5193 27 Nov 09 nicklas 148     @return Information about the section
5193 27 Nov 09 nicklas 149     @throws ArrayIndexOutOfBoundsException If the index is outside the 
5193 27 Nov 09 nicklas 150       allowed range
5193 27 Nov 09 nicklas 151   */
5193 27 Nov 09 nicklas 152   public Section getSection(int index)
5193 27 Nov 09 nicklas 153   {
5193 27 Nov 09 nicklas 154     return sections.get(index);
5193 27 Nov 09 nicklas 155   }
5193 27 Nov 09 nicklas 156   
5193 27 Nov 09 nicklas 157   /**
5193 27 Nov 09 nicklas 158     Get the first section with a given name. If there are multiple
5193 27 Nov 09 nicklas 159     sections with the same name, only the first is returned.
5193 27 Nov 09 nicklas 160     
5193 27 Nov 09 nicklas 161     @param name The name of the section to find
5193 27 Nov 09 nicklas 162     @return A section or null if no section exists
5193 27 Nov 09 nicklas 163   */
5193 27 Nov 09 nicklas 164   public Section getSection(String name)
5193 27 Nov 09 nicklas 165   {
5193 27 Nov 09 nicklas 166     for (Section s : sections)
5193 27 Nov 09 nicklas 167     {
5193 27 Nov 09 nicklas 168       if (s.getName().equals(name)) return s;
5193 27 Nov 09 nicklas 169     }
5193 27 Nov 09 nicklas 170     return null;
5193 27 Nov 09 nicklas 171   }
5193 27 Nov 09 nicklas 172   
5193 27 Nov 09 nicklas 173   /**
5193 27 Nov 09 nicklas 174     Add an entry to the 'files' section.
5193 27 Nov 09 nicklas 175     @param key The entry key
5193 27 Nov 09 nicklas 176     @param name The filename (not verified)
5193 27 Nov 09 nicklas 177   */
5193 27 Nov 09 nicklas 178   public void addFile(String key, String name)
5193 27 Nov 09 nicklas 179   {
5193 27 Nov 09 nicklas 180     if (files == null) addSection("files");
5193 27 Nov 09 nicklas 181     files.addEntry(key, name);
5193 27 Nov 09 nicklas 182   }
5193 27 Nov 09 nicklas 183   
5193 27 Nov 09 nicklas 184   /**
5193 27 Nov 09 nicklas 185     Get the number of entries in the 'files' section.
5193 27 Nov 09 nicklas 186   */
5193 27 Nov 09 nicklas 187   public int getFileCount()
5193 27 Nov 09 nicklas 188   {
5193 27 Nov 09 nicklas 189     if (files == null) return 0;
5193 27 Nov 09 nicklas 190     return files.getEntryCount();
5193 27 Nov 09 nicklas 191   }
5193 27 Nov 09 nicklas 192   
5193 27 Nov 09 nicklas 193   /**
5193 27 Nov 09 nicklas 194     Get the file entry with a given index.
5193 27 Nov 09 nicklas 195     @param index The index, a value between 0 and {@link #getFileCount()} - 1
5193 27 Nov 09 nicklas 196     @return The file name
5193 27 Nov 09 nicklas 197   */
5193 27 Nov 09 nicklas 198   public String getFile(int index)
5193 27 Nov 09 nicklas 199   {
5193 27 Nov 09 nicklas 200     if (files == null) return null;
5193 27 Nov 09 nicklas 201     return files.getValue(index);
5193 27 Nov 09 nicklas 202   }
5193 27 Nov 09 nicklas 203   
5193 27 Nov 09 nicklas 204   /**
5193 27 Nov 09 nicklas 205     Get the file entry for a given key. If multiple entries with
5193 27 Nov 09 nicklas 206     the same key exists, only the first is returned.
5193 27 Nov 09 nicklas 207     @param key The key to look for
5193 27 Nov 09 nicklas 208     @return The file name of null if no entry exists for the given key
5193 27 Nov 09 nicklas 209   */
5193 27 Nov 09 nicklas 210   public String getFile(String key)
5193 27 Nov 09 nicklas 211   {
5193 27 Nov 09 nicklas 212     if (files == null) return null;
5193 27 Nov 09 nicklas 213     return files.getValue(key);
5193 27 Nov 09 nicklas 214   }
5193 27 Nov 09 nicklas 215   
5193 27 Nov 09 nicklas 216   /**
5193 27 Nov 09 nicklas 217     Utility method for getting the value of the first entry
5193 27 Nov 09 nicklas 218     in the first section that matches the given section and
5193 27 Nov 09 nicklas 219     key name.
5193 27 Nov 09 nicklas 220     @param section The name of the section
5193 27 Nov 09 nicklas 221     @param key The key of the entry
5193 27 Nov 09 nicklas 222     @return The value, or null if no section or entry is found
5193 27 Nov 09 nicklas 223   */
5193 27 Nov 09 nicklas 224   public String getValue(String section, String key)
5193 27 Nov 09 nicklas 225   {
5193 27 Nov 09 nicklas 226     Section s = getSection(section);
5193 27 Nov 09 nicklas 227     return s == null ? null : s.getValue(key);
5193 27 Nov 09 nicklas 228   }
5193 27 Nov 09 nicklas 229
5193 27 Nov 09 nicklas 230   /**
5193 27 Nov 09 nicklas 231     Utility method for getting the values of the first entry
5193 27 Nov 09 nicklas 232     in the first section that matches the given section and
5193 27 Nov 09 nicklas 233     key name.
5193 27 Nov 09 nicklas 234     @param section The name of the section
5193 27 Nov 09 nicklas 235     @param key The key of the entry
5193 27 Nov 09 nicklas 236     @return The values, or null if no section or entry is found
5193 27 Nov 09 nicklas 237   */
5193 27 Nov 09 nicklas 238   public String[] getValues(String section, String key)
5193 27 Nov 09 nicklas 239   {
5193 27 Nov 09 nicklas 240     Section s = getSection(section);
5193 27 Nov 09 nicklas 241     return s == null ? null : s.getValues(key);
5193 27 Nov 09 nicklas 242   }
5193 27 Nov 09 nicklas 243
5193 27 Nov 09 nicklas 244   
5193 27 Nov 09 nicklas 245   /**
5193 27 Nov 09 nicklas 246     Holds information about a section.
5193 27 Nov 09 nicklas 247   */
5193 27 Nov 09 nicklas 248   public static class Section
5193 27 Nov 09 nicklas 249   {
5193 27 Nov 09 nicklas 250     private String name;
5193 27 Nov 09 nicklas 251     private List<SectionEntry> entries;
5193 27 Nov 09 nicklas 252     
5193 27 Nov 09 nicklas 253     /**
5193 27 Nov 09 nicklas 254       Create a new section.
5193 27 Nov 09 nicklas 255       @param name The name of the section
5193 27 Nov 09 nicklas 256     */
5193 27 Nov 09 nicklas 257     public Section(String name)
5193 27 Nov 09 nicklas 258     {
5193 27 Nov 09 nicklas 259       this.name = name;
5193 27 Nov 09 nicklas 260       this.entries = new ArrayList<SectionEntry>();
5193 27 Nov 09 nicklas 261     }
5193 27 Nov 09 nicklas 262     
5193 27 Nov 09 nicklas 263     /**
5193 27 Nov 09 nicklas 264       Get the name of the section.
5193 27 Nov 09 nicklas 265     */
5193 27 Nov 09 nicklas 266     public String getName()
5193 27 Nov 09 nicklas 267     {
5193 27 Nov 09 nicklas 268       return name;
5193 27 Nov 09 nicklas 269     }
5193 27 Nov 09 nicklas 270     
5193 27 Nov 09 nicklas 271     /**
5193 27 Nov 09 nicklas 272       Get the number of entries in this section.
5193 27 Nov 09 nicklas 273     */
5193 27 Nov 09 nicklas 274     public int getEntryCount()
5193 27 Nov 09 nicklas 275     {
5193 27 Nov 09 nicklas 276       return entries.size();
5193 27 Nov 09 nicklas 277     }
5193 27 Nov 09 nicklas 278     
5193 27 Nov 09 nicklas 279     /**
5193 27 Nov 09 nicklas 280       Add a new entry to this section.
5193 27 Nov 09 nicklas 281     */
5193 27 Nov 09 nicklas 282     public void addEntry(SectionEntry entry)
5193 27 Nov 09 nicklas 283     {
5193 27 Nov 09 nicklas 284       entries.add(entry);
5193 27 Nov 09 nicklas 285     }
5193 27 Nov 09 nicklas 286     
5193 27 Nov 09 nicklas 287     /**
5193 27 Nov 09 nicklas 288       Add a new entry to this section.
5193 27 Nov 09 nicklas 289       @param key The key of the entry
5193 27 Nov 09 nicklas 290       @param values The values
5193 27 Nov 09 nicklas 291     */
5193 27 Nov 09 nicklas 292     public SectionEntry addEntry(String key, String... values)
5193 27 Nov 09 nicklas 293     {
5193 27 Nov 09 nicklas 294       SectionEntry e = new SectionEntry(key, values);
5193 27 Nov 09 nicklas 295       addEntry(e);
5193 27 Nov 09 nicklas 296       return e;
5193 27 Nov 09 nicklas 297     }
5193 27 Nov 09 nicklas 298     
5193 27 Nov 09 nicklas 299     /**
5193 27 Nov 09 nicklas 300       Get the entry in this section with the given index.
5193 27 Nov 09 nicklas 301       @param index The index of the entry, a value between 0 and
5193 27 Nov 09 nicklas 302         {@link #getEntryCount()} - 1
5193 27 Nov 09 nicklas 303       @return A section entry
5193 27 Nov 09 nicklas 304     */
5193 27 Nov 09 nicklas 305     public SectionEntry getEntry(int index)
5193 27 Nov 09 nicklas 306     {
5193 27 Nov 09 nicklas 307       return entries.get(index);
5193 27 Nov 09 nicklas 308     }
5193 27 Nov 09 nicklas 309     
5193 27 Nov 09 nicklas 310     /**
5193 27 Nov 09 nicklas 311       Get the first entry in this section with a given key. 
5193 27 Nov 09 nicklas 312       @param key The key to look for
5193 27 Nov 09 nicklas 313       @return A section entry, or null if no entry with the 
5193 27 Nov 09 nicklas 314         given key exists
5193 27 Nov 09 nicklas 315     */
5193 27 Nov 09 nicklas 316     public SectionEntry getEntry(String key)
5193 27 Nov 09 nicklas 317     {
5193 27 Nov 09 nicklas 318       for (SectionEntry e: entries)
5193 27 Nov 09 nicklas 319       {
5193 27 Nov 09 nicklas 320         if (e.getKey().equals(key)) return e;
5193 27 Nov 09 nicklas 321       }
5193 27 Nov 09 nicklas 322       return null;
5193 27 Nov 09 nicklas 323     }
5193 27 Nov 09 nicklas 324     
5193 27 Nov 09 nicklas 325     /**
5193 27 Nov 09 nicklas 326       Get the key of the entry at the given index.
5193 27 Nov 09 nicklas 327       @param index The index of the entry, a value between 0 and
5193 27 Nov 09 nicklas 328         {@link #getEntryCount()} - 1
5193 27 Nov 09 nicklas 329       @return The key of the entry
5193 27 Nov 09 nicklas 330     */
5193 27 Nov 09 nicklas 331     public String getKey(int index)
5193 27 Nov 09 nicklas 332     {
5193 27 Nov 09 nicklas 333       return getEntry(index).getKey();
5193 27 Nov 09 nicklas 334     }
5193 27 Nov 09 nicklas 335     
5193 27 Nov 09 nicklas 336     /**
5224 27 Jan 10 nicklas 337       Get the index of the first entry with the given key. 
5224 27 Jan 10 nicklas 338       @param key The key to look for
5224 27 Jan 10 nicklas 339       @return The index of the entry, or -1 if the key is not found
5224 27 Jan 10 nicklas 340     */
5224 27 Jan 10 nicklas 341     public int getIndex(String key)
5224 27 Jan 10 nicklas 342     {
5224 27 Jan 10 nicklas 343       for (int i = 0; i < entries.size(); ++i)
5224 27 Jan 10 nicklas 344       {
5224 27 Jan 10 nicklas 345         if (entries.get(i).getKey().equals(key)) return i;
5224 27 Jan 10 nicklas 346       }
5224 27 Jan 10 nicklas 347       return -1;
5224 27 Jan 10 nicklas 348     }
5224 27 Jan 10 nicklas 349     
5224 27 Jan 10 nicklas 350     /**
5193 27 Nov 09 nicklas 351       Get the value of the entry at the given index.
5193 27 Nov 09 nicklas 352       @param index The index of the entry, a value between 0 and
5193 27 Nov 09 nicklas 353         {@link #getEntryCount()} - 1
5193 27 Nov 09 nicklas 354       @return The value of the entry
5193 27 Nov 09 nicklas 355     */
5193 27 Nov 09 nicklas 356     public String getValue(int index)
5193 27 Nov 09 nicklas 357     {
5193 27 Nov 09 nicklas 358       return getEntry(index).getValue();
5193 27 Nov 09 nicklas 359     }
5193 27 Nov 09 nicklas 360
5193 27 Nov 09 nicklas 361     /**
5193 27 Nov 09 nicklas 362       Get the values of the entry at the given index.
5193 27 Nov 09 nicklas 363       @param index The index of the entry, a value between 0 and
5193 27 Nov 09 nicklas 364         {@link #getEntryCount()} - 1
5193 27 Nov 09 nicklas 365       @return The value of the entry
5193 27 Nov 09 nicklas 366     */
5193 27 Nov 09 nicklas 367     public String[] getValues(int index)
5193 27 Nov 09 nicklas 368     {
5193 27 Nov 09 nicklas 369       return getEntry(index).getValues();
5193 27 Nov 09 nicklas 370     }
5193 27 Nov 09 nicklas 371     
5193 27 Nov 09 nicklas 372     /**
5193 27 Nov 09 nicklas 373       Get the value of the first entry with a given key.
5193 27 Nov 09 nicklas 374       @param key The key of the entry
5193 27 Nov 09 nicklas 375       @return The value, or null if no entry for the given key exists
5193 27 Nov 09 nicklas 376     */
5193 27 Nov 09 nicklas 377     public String getValue(String key)
5193 27 Nov 09 nicklas 378     {
5193 27 Nov 09 nicklas 379       SectionEntry e = getEntry(key);
5193 27 Nov 09 nicklas 380       return e == null ? null : e.getValue();
5193 27 Nov 09 nicklas 381     }
5193 27 Nov 09 nicklas 382
5193 27 Nov 09 nicklas 383     /**
5193 27 Nov 09 nicklas 384       Get the values of the first entry with a given key.
5193 27 Nov 09 nicklas 385       @param key The key of the entry
5193 27 Nov 09 nicklas 386       @return The value, or null if no entry for the given key exists
5193 27 Nov 09 nicklas 387     */
5193 27 Nov 09 nicklas 388     public String[] getValues(String key)
5193 27 Nov 09 nicklas 389     {
5193 27 Nov 09 nicklas 390       SectionEntry e = getEntry(key);
5193 27 Nov 09 nicklas 391       return e == null ? null : e.getValues();
5193 27 Nov 09 nicklas 392     }
5193 27 Nov 09 nicklas 393
5193 27 Nov 09 nicklas 394   }
5193 27 Nov 09 nicklas 395
5193 27 Nov 09 nicklas 396   /**
5193 27 Nov 09 nicklas 397     Holds information about a section entry.
5193 27 Nov 09 nicklas 398   */
5193 27 Nov 09 nicklas 399   public static class SectionEntry
5193 27 Nov 09 nicklas 400   {
5193 27 Nov 09 nicklas 401     private String key;
5193 27 Nov 09 nicklas 402     private String[] values;
5193 27 Nov 09 nicklas 403     private String value;
5193 27 Nov 09 nicklas 404     
5193 27 Nov 09 nicklas 405     /**
5193 27 Nov 09 nicklas 406       Create a new single-valued section entry.
5193 27 Nov 09 nicklas 407       @param key The key of the entry
5193 27 Nov 09 nicklas 408       @param value The value of the entry
5193 27 Nov 09 nicklas 409     */
5193 27 Nov 09 nicklas 410     public SectionEntry(String key, String value)
5193 27 Nov 09 nicklas 411     {
5193 27 Nov 09 nicklas 412       this.key = key;
5193 27 Nov 09 nicklas 413       this.value = value;
5193 27 Nov 09 nicklas 414       this.values = new String[] { value };
5193 27 Nov 09 nicklas 415     }
5193 27 Nov 09 nicklas 416     
5193 27 Nov 09 nicklas 417     /**
5193 27 Nov 09 nicklas 418       Create a new section entry with an array of values.
5193 27 Nov 09 nicklas 419       @param key The key of the entry
5193 27 Nov 09 nicklas 420       @param values An array with the values
5193 27 Nov 09 nicklas 421     */
5193 27 Nov 09 nicklas 422     public SectionEntry(String key, String... values)
5193 27 Nov 09 nicklas 423     {
5193 27 Nov 09 nicklas 424       this.key = key;
5193 27 Nov 09 nicklas 425       this.values = values;
5193 27 Nov 09 nicklas 426     }
5193 27 Nov 09 nicklas 427     
5193 27 Nov 09 nicklas 428     /**
5193 27 Nov 09 nicklas 429       Get the key of the entry.
5193 27 Nov 09 nicklas 430     */
5193 27 Nov 09 nicklas 431     public String getKey()
5193 27 Nov 09 nicklas 432     {
5193 27 Nov 09 nicklas 433       return key;
5193 27 Nov 09 nicklas 434     }
5193 27 Nov 09 nicklas 435     
5193 27 Nov 09 nicklas 436     /**
5193 27 Nov 09 nicklas 437       Get the number of values in the entry.
5193 27 Nov 09 nicklas 438     */
5193 27 Nov 09 nicklas 439     public int getValueCount()
5193 27 Nov 09 nicklas 440     {
5193 27 Nov 09 nicklas 441       return values.length;
5193 27 Nov 09 nicklas 442     }
5193 27 Nov 09 nicklas 443     
5193 27 Nov 09 nicklas 444     /**
5193 27 Nov 09 nicklas 445       Get the value of the entry. If the entry is a
5193 27 Nov 09 nicklas 446       multi-value entry, a single-value is created by concatenating
5193 27 Nov 09 nicklas 447       the array of values using tab as a separator.
5193 27 Nov 09 nicklas 448       @return The value of the entry
5193 27 Nov 09 nicklas 449     */
5193 27 Nov 09 nicklas 450     public String getValue()
5193 27 Nov 09 nicklas 451     {
5193 27 Nov 09 nicklas 452       if (value == null)
5193 27 Nov 09 nicklas 453       {
5193 27 Nov 09 nicklas 454         String sep = "";
5193 27 Nov 09 nicklas 455         StringBuilder sb = new StringBuilder();
5193 27 Nov 09 nicklas 456         for (String s : values)
5193 27 Nov 09 nicklas 457         {
5193 27 Nov 09 nicklas 458           sb.append(sep);
5193 27 Nov 09 nicklas 459           sb.append(s);
5193 27 Nov 09 nicklas 460           sep = "\t";
5193 27 Nov 09 nicklas 461         }
5193 27 Nov 09 nicklas 462         value = sb.toString();
5193 27 Nov 09 nicklas 463       }
5193 27 Nov 09 nicklas 464       return value;
5193 27 Nov 09 nicklas 465     }
5193 27 Nov 09 nicklas 466     
5193 27 Nov 09 nicklas 467     /**
5193 27 Nov 09 nicklas 468       Get all values.
5193 27 Nov 09 nicklas 469     */
5193 27 Nov 09 nicklas 470     public String[] getValues()
5193 27 Nov 09 nicklas 471     {
5193 27 Nov 09 nicklas 472       return values;
5193 27 Nov 09 nicklas 473     }
5193 27 Nov 09 nicklas 474     
5193 27 Nov 09 nicklas 475   }
5193 27 Nov 09 nicklas 476   
5193 27 Nov 09 nicklas 477 }