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.Reg;
019    
020    import org.ini4j.sample.Dwarf;
021    
022    import org.ini4j.test.DwarfsData;
023    import org.ini4j.test.Helper;
024    
025    import static org.junit.Assert.*;
026    
027    import java.io.File;
028    import java.io.IOException;
029    
030    import java.net.URI;
031    
032    //<editor-fold defaultstate="collapsed" desc="apt documentation">
033    //|
034    //|                -------------
035    //|                Reg Tutorial
036    //|
037    //|Reg Tutorial - Windows .REG file handling
038    //|
039    //| Windows regedit commands .REG file format is very close to .ini format.
040    //| \[ini4j\] provides org.ini4j.Reg class to model .REG format. This tutorial
041    //| show the differences between Ini and Reg classes.
042    //|
043    //| Code sniplets in this tutorial tested with the following .reg file:
044    //| {{{../sample/dwarfs.reg.html}dwarfs.reg}}
045    //|
046    //</editor-fold>
047    public class RegTutorial extends AbstractTutorial
048    {
049        public static final String FILENAME = "../sample/dwarfs.reg";
050    
051        public static void main(String[] args) throws Exception
052        {
053            new RegTutorial().run(filearg(args));
054        }
055    
056        @Override protected void run(File arg) throws Exception
057        {
058            Reg reg = new Reg(arg.toURI().toURL());
059    
060            sample01(arg);
061            sample02();
062        }
063    
064    //|
065    //|* Loading and storing
066    //|
067    //| There is nothing special with loading and storing data, it works exactly same
068    //| as in Ini class. But while loading data, Reg class will strip .REG special
069    //| values (double qoute around strings, type data from option, etc). So after
070    //| loading a .REG file, you can use it exactly same way as Ini class. Ofcource
071    //| if you store Reg class, it will put all above meta information int file, so
072    //| the result will be a valid .REG file. You don't need to worry about file
073    //| encoding, version in first line, etc,etc.
074    //|
075    //| Assume you have a .REG file, with the following section/key:
076    //|
077    //|+---+
078    //|[HKEY_CURRENT_USER\Software\ini4j-test\dwarfs\bashful]
079    //|@="bashful"
080    //|"weight"=hex(2):34,00,35,00,2e,00,37,00,00,00
081    //|"height"="98.8"
082    //|"age"=dword:00000043
083    //|"homePage"="http://snowwhite.tale/~bashful"
084    //|"homeDir"="/home/bashful"
085    //|+---+
086    //|
087    //| As you see, "weight" and "age" is not simlpe strings. The "height" is a REG_DWORD
088    //| type while "weight" is REG_EXPAND_SZ. Don't worry, Reg class take care about
089    //| type conversion, you will access these as with regular .ini files:
090    //{
091        void sample01(File file) throws IOException
092        {
093            Reg reg = new Reg(file);
094            Reg.Key hive = reg.get(Reg.Hive.HKEY_CURRENT_USER.toString());
095            Reg.Key bashful;
096    
097            bashful = hive.lookup("Software", "ini4j-test", "dwarfs", "bashful");
098    
099            // or ...
100            bashful = hive.lookup("Software\\ini4j-test\\dwarfs\\bashful");
101    
102            // or even...
103            bashful = reg.get("HKEY_CURRENT_USER\\Software\\ini4j-test\\dwarfs\\bashful");
104    
105            // read some data
106            double weight = bashful.get("weight", double.class);  // = 45.7
107            double height = bashful.get("height", double.class);  // = 98.8
108            int age = bashful.get("age", int.class);  // = 67
109            URI homePage = bashful.get("homePage", URI.class);  // = new URI("http://snowwhite.tale/~bashful");
110            String homeDir = bashful.get("homeDir");  // = "/home/bashful"
111    
112    //}
113            assertNotNull(reg.get(Helper.DWARFS_REG_PATH + "\\dwarfs"));
114            Helper.assertEquals(DwarfsData.bashful, bashful.as(Dwarf.class));
115        }
116    
117    //|
118    //|* Types
119    //|
120    //| When you load data into Reg class, it will preserve meta informations, such as
121    //| type informations. If you create new values, by default these will have
122    //| tpye REG_SZ. Ofcource you may specify type information for values.
123    //{
124        void sample02()
125        {
126            Reg reg = new Reg();
127            Reg.Key key = reg.add("HKEY_CURRENT_USER\\Software\\ini4j-test\\dwarfs\\sleepy");
128    
129            key.put("fortuneNumber", 99);
130            key.putType("fortuneNumber", Reg.Type.REG_MULTI_SZ);
131    
132    //}
133    //|
134    //| If you store reg object above, it will contains a section similar to this:
135    //|
136    //|+---+
137    //|[HKEY_CURRENT_USER\Software\ini4j-test\dwarfs\sleepy]
138    //|"fortuneNumber"=hex(7):39,00,39,00,00,00,00,00
139    //|+---+
140    //|
141        }
142    }