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 */ 016package org.ini4j.tutorial; 017 018import org.ini4j.Reg; 019 020import org.ini4j.sample.Dwarf; 021 022import org.ini4j.test.DwarfsData; 023import org.ini4j.test.Helper; 024 025import static org.junit.Assert.*; 026 027import java.io.File; 028import java.io.IOException; 029 030import 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> 047public 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}