001 /* 002 * Copyright 2005,2009 Ivan SZKIBA 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.ini4j.tutorial; 017 018 import org.ini4j.Ini; 019 020 import org.ini4j.sample.Dwarfs; 021 022 import org.ini4j.test.DwarfsData; 023 024 import static org.junit.Assert.*; 025 026 import java.io.File; 027 028 import java.util.Set; 029 030 //<editor-fold defaultstate="collapsed" desc="apt documentation"> 031 //| 032 //| ------------- 033 //| OptionMap Tutorial 034 //| 035 //|OptionMap Tutorial - more than just String,String map 036 //| 037 //| Option is a name/value pair stored in OptionMap. But OptionMap adds a lot of 038 //| usefull data access methods than simple get. OptionMap is base interface for 039 //| both Ini.Section, Registry.Key and Options classes, so this tutorial will 040 //| usefull for all of these. 041 //| 042 //| So in samples bellow you can use either Ini.Section, Registry.Key or Options 043 //| classes instead of OptionMap interface, because these classes implements 044 //| OptionMap. 045 //| 046 //| Code sniplets in this tutorial tested with the following files: 047 //| {{{../sample/dwarfs.ini.html}dwarfs.ini}} 048 //| {{{../sample/dwarfs.opt.html}dwarfs.opt}} 049 //| 050 //</editor-fold> 051 public class OptionMapTutorial extends AbstractTutorial 052 { 053 public static void main(String[] args) throws Exception 054 { 055 new OptionMapTutorial().run(filearg(args)); 056 } 057 058 @Override protected void run(File arg) throws Exception 059 { 060 Ini ini = new Ini(arg.toURI().toURL()); 061 062 sample01(ini.get(Dwarfs.PROP_HAPPY)); 063 sample03(ini); 064 sample04(ini); 065 } 066 067 //|* Data model 068 //| 069 //| OptionMap implements Map\<String,String\>, so you can access options using 070 //| standard collection api. 071 //{ 072 void sample01(Ini.Section section) 073 { 074 075 // 076 // read some values 077 // 078 String age = section.get("age"); 079 String weight = section.get("weight"); 080 String homeDir = section.get("homeDir"); 081 082 // get all option names 083 Set<String> optionNames = section.keySet(); 084 085 //} 086 assertEquals(String.valueOf(DwarfsData.happy.age), age); 087 assertEquals(String.valueOf(DwarfsData.happy.weight), weight); 088 assertEquals(String.valueOf(DwarfsData.happy.homeDir), homeDir); 089 } 090 091 //| 092 //|* Macro/variable substitution 093 //| 094 //| To get a value, besides <<<get()>>> you can also 095 //| use <<<fetch()>>> which resolves any occurrent $\{section/option\} format 096 //| variable references in the needed value. 097 //| 098 //{ 099 void sample03(Ini ini) 100 { 101 Ini.Section dopey = ini.get("dopey"); 102 103 // get method doesn't resolve variable references 104 String weightRaw = dopey.get("weight"); // = ${bashful/weight} 105 String heightRaw = dopey.get("height"); // = ${doc/height} 106 107 // to resolve references, you should use fetch method 108 String weight = dopey.fetch("weight"); // = 45.7 109 String height = dopey.fetch("height"); // = 87.7 110 111 //} 112 //| Assuming we have an .ini file with the following sections: 113 //| 114 //|+--------------+ 115 //| [dopey] 116 //| weight = ${bashful/weight} 117 //| height = ${doc/height} 118 //| 119 //|[bashful] 120 //| weight = 45.7 121 //| height = 98.8 122 //| 123 //| [doc] 124 //| weight = 49.5 125 //| height = 87.7 126 //|+--------------+ 127 //| 128 assertEquals(DwarfsData.INI_DOPEY_WEIGHT, weightRaw); 129 assertEquals(DwarfsData.INI_DOPEY_HEIGHT, heightRaw); 130 assertEquals(String.valueOf(DwarfsData.dopey.weight), weight); 131 assertEquals(String.valueOf(DwarfsData.dopey.height), height); 132 } 133 134 //| 135 //|* Multi values 136 //| 137 //| \[ini4j\] library introduces MultiMap interface, which is extends normal 138 //| Map, but allows multiply values per keys. You can simply index values for 139 //| a given key, similar to indexed properties in JavaBeans api. 140 //| 141 //{ 142 void sample04(Ini ini) 143 { 144 Ini.Section sneezy = ini.get("sneezy"); 145 String n1 = sneezy.get("fortuneNumber", 0); // = 11 146 String n2 = sneezy.get("fortuneNumber", 1); // = 22 147 String n3 = sneezy.get("fortuneNumber", 2); // = 33 148 String n4 = sneezy.get("fortuneNumber", 3); // = 44 149 150 // ok, lets do in it easier... 151 int[] n = sneezy.get("fortuneNumber", int[].class); 152 //} 153 } 154 }