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.demo;
017
018 import bsh.ConsoleInterface;
019 import bsh.EvalError;
020 import bsh.Interpreter;
021 import bsh.NameSpace;
022
023 import org.ini4j.Config;
024 import org.ini4j.Ini;
025 import org.ini4j.Options;
026 import org.ini4j.Persistable;
027 import org.ini4j.Reg;
028
029 import java.io.IOException;
030 import java.io.InputStream;
031 import java.io.InputStreamReader;
032 import java.io.Reader;
033 import java.io.StringReader;
034
035 public class DemoModel implements Runnable
036 {
037 public static enum Mode
038 {
039 INI,
040 REG,
041 OPTIONS;
042 }
043
044 private Persistable _data;
045 private Interpreter _interpreter;
046 private Mode _mode = Mode.INI;
047
048 public DemoModel(ConsoleInterface console)
049 {
050 _interpreter = new Interpreter(console);
051 NameSpace namespace = _interpreter.getNameSpace();
052
053 namespace.importPackage("org.ini4j.spi");
054 namespace.importPackage("org.ini4j");
055 namespace.importPackage("org.ini4j.sample");
056 }
057
058 public Object getData()
059 {
060 return _data;
061 }
062
063 public Mode getMode()
064 {
065 return _mode;
066 }
067
068 public void setMode(Mode mode)
069 {
070 _mode = mode;
071 }
072
073 public void clear() throws EvalError
074 {
075 _interpreter.unset("data");
076 }
077
078 public String help() throws IOException
079 {
080 return readResource("help.txt");
081 }
082
083 public String load() throws IOException
084 {
085 return readResource(_mode.name().toLowerCase() + "-data.txt");
086 }
087
088 public void parse(String text) throws IOException, EvalError
089 {
090 Persistable data = newData();
091
092 data.load(new StringReader(text));
093 _interpreter.set("data", data);
094 _data = data;
095 }
096
097 @Override public void run()
098 {
099 _interpreter.setExitOnEOF(false);
100 _interpreter.run();
101 }
102
103 public String tip() throws IOException
104 {
105 return readResource(_mode.name().toLowerCase() + "-tip.txt");
106 }
107
108 private Persistable newData()
109 {
110 Persistable ret = null;
111
112 switch (_mode)
113 {
114
115 case INI:
116 ret = new Ini();
117 break;
118
119 case REG:
120 ret = new Reg();
121 break;
122
123 case OPTIONS:
124 ret = new Options();
125 break;
126 }
127
128 return ret;
129 }
130
131 private String readResource(String path) throws IOException
132 {
133 InputStream in = getClass().getResourceAsStream(path);
134 Reader reader = new InputStreamReader(in, Config.DEFAULT_FILE_ENCODING);
135 StringBuilder str = new StringBuilder();
136 char[] buff = new char[8192];
137 int n;
138
139 while ((n = reader.read(buff)) >= 0)
140 {
141 str.append(buff, 0, n);
142 }
143
144 return str.toString();
145 }
146 }