1 package jp.sourceforge.gokigen.memoma.fileio;
4 import java.io.FileWriter;
5 import java.util.Enumeration;
7 import org.xmlpull.v1.XmlSerializer;
9 import android.util.Log;
10 import android.util.Xml;
12 import jp.sourceforge.gokigen.memoma.Main;
13 import jp.sourceforge.gokigen.memoma.holders.MeMoMaConnectLineHolder;
14 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
22 public class MeMoMaFileSavingEngine
24 private ExternalStorageFileUtility fileUtility = null;
25 private String backgroundUri = null;
26 private String userCheckboxString = null;
31 public MeMoMaFileSavingEngine(ExternalStorageFileUtility utility, String bgUri, String checkBoxLabel)
33 /** ファイルユーティリティを記憶する **/
34 fileUtility = utility;
36 /** ファイルをバックアップするディレクトリを作成する **/
37 File dir = new File(fileUtility.getGokigenDirectory() + "/backup");
41 backgroundUri = bgUri;
42 userCheckboxString = checkBoxLabel;
48 * @param targetFileName
51 private boolean renameFile(String targetFileName, String newFileName)
54 File targetFile = new File(targetFileName);
55 if (targetFile.exists() == true)
57 // ファイルが存在した、、、ファイル名を1世代古いものに変更する
58 ret = targetFile.renameTo(new File(newFileName));
68 private void backupFiles(String dirName, String backupFileName)
70 // データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
71 boolean result = true;
74 String fileName = dirName + "backup/" + backupFileName;
75 File backFile = new File(fileName + ".xml.bak5");
76 if (backFile.exists() == true)
82 renameFile((fileName + ".xml.bak4"), (fileName + ".xml.bak5"));
83 renameFile((fileName + ".xml.bak3"), (fileName + ".xml.bak4"));
84 renameFile((fileName + ".xml.bak2"), (fileName + ".xml.bak3"));
85 renameFile((fileName + ".xml.bak1"), (fileName + ".xml.bak2"));
86 renameFile((fileName + ".xml.bak"), (fileName + ".xml.bak1"));
87 renameFile((dirName + backupFileName + ".xml"), (fileName + ".xml.bak"));
91 // 何か例外が発生した場合にはエラーと認識する。
96 // バックアップファイルのコピー失敗をログに記述する
97 Log.v(Main.APP_IDENTIFIER, "rename failure : " + dirName + backupFileName + ".xml");
106 * @param objectHolder
109 private String storeToXmlFile(String fileName, MeMoMaObjectHolder objectHolder)
111 String resultMessage = "";
114 FileWriter writer = new FileWriter(new File(fileName + ".xml"));
115 XmlSerializer serializer = Xml.newSerializer();
117 serializer.setOutput(writer);
118 serializer.startDocument("UTF-8", true);
119 serializer.startTag(Main.APP_NAMESPACE, "memoma");
122 serializer.startTag(Main.APP_NAMESPACE, "title");
123 serializer.text(objectHolder.getDataTitle());
124 serializer. endTag(Main.APP_NAMESPACE, "title");
127 serializer.startTag(Main.APP_NAMESPACE, "background");
128 serializer.text(objectHolder.getBackground());
129 serializer. endTag(Main.APP_NAMESPACE, "background");
132 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
133 serializer.text(backgroundUri);
134 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
137 serializer.startTag(Main.APP_NAMESPACE, "userCheckboxString");
138 serializer.text(userCheckboxString);
139 serializer. endTag(Main.APP_NAMESPACE, "userCheckboxString");
141 serializer.startTag(Main.APP_NAMESPACE, "objserial");
142 serializer.text(Integer.toString(objectHolder.getSerialNumber()));
143 serializer.endTag(Main.APP_NAMESPACE, "objserial");
145 serializer.startTag(Main.APP_NAMESPACE, "lineserial");
146 serializer.text(Integer.toString(objectHolder.getConnectLineHolder().getSerialNumber()));
147 serializer.endTag(Main.APP_NAMESPACE, "lineserial");
150 // オブジェクトの出力 (保持しているものはすべて表示する)
151 Enumeration<Integer> keys = objectHolder.getObjectKeys();
152 while (keys.hasMoreElements())
154 Integer key = keys.nextElement();
155 MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
156 serializer.startTag(Main.APP_NAMESPACE, "object");
158 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
160 serializer.startTag(Main.APP_NAMESPACE, "rect");
161 serializer.startTag(Main.APP_NAMESPACE, "top");
162 serializer.text(Float.toString(pos.rect.top));
163 serializer. endTag(Main.APP_NAMESPACE, "top");
164 serializer.startTag(Main.APP_NAMESPACE, "left");
165 serializer.text(Float.toString(pos.rect.left));
166 serializer. endTag(Main.APP_NAMESPACE, "left");
167 serializer.startTag(Main.APP_NAMESPACE, "right");
168 serializer.text(Float.toString(pos.rect.right));
169 serializer. endTag(Main.APP_NAMESPACE, "right");
170 serializer.startTag(Main.APP_NAMESPACE, "bottom");
171 serializer.text(Float.toString(pos.rect.bottom));
172 serializer. endTag(Main.APP_NAMESPACE, "bottom");
173 serializer. endTag(Main.APP_NAMESPACE, "rect");
175 serializer.startTag(Main.APP_NAMESPACE, "drawStyle");
176 serializer.text(Integer.toString(pos.drawStyle));
177 serializer. endTag(Main.APP_NAMESPACE, "drawStyle");
179 serializer.startTag(Main.APP_NAMESPACE, "icon");
180 serializer.text(Integer.toString(pos.icon));
181 serializer. endTag(Main.APP_NAMESPACE, "icon");
183 serializer.startTag(Main.APP_NAMESPACE, "label");
184 serializer.text(pos.label);
185 serializer. endTag(Main.APP_NAMESPACE, "label");
187 serializer.startTag(Main.APP_NAMESPACE, "detail");
188 serializer.text(pos.detail);
189 serializer. endTag(Main.APP_NAMESPACE, "detail");
191 serializer.startTag(Main.APP_NAMESPACE, "otherInfoUri");
192 serializer.text(pos.otherInfoUri);
193 serializer. endTag(Main.APP_NAMESPACE, "otherInfoUri");
195 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
196 serializer.text(pos.backgroundUri);
197 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
199 serializer.startTag(Main.APP_NAMESPACE, "objectStatus");
200 serializer.text(pos.objectStatus);
201 serializer. endTag(Main.APP_NAMESPACE, "objectStatus");
203 serializer.startTag(Main.APP_NAMESPACE, "userChecked");
204 serializer.text(Boolean.toString(pos.userChecked));
205 serializer. endTag(Main.APP_NAMESPACE, "userChecked");
207 serializer.startTag(Main.APP_NAMESPACE, "labelColor");
208 serializer.text(Integer.toString(pos.labelColor));
209 serializer. endTag(Main.APP_NAMESPACE, "labelColor");
211 serializer.startTag(Main.APP_NAMESPACE, "objectColor");
212 serializer.text(Integer.toString(pos.objectColor));
213 serializer. endTag(Main.APP_NAMESPACE, "objectColor");
215 serializer.startTag(Main.APP_NAMESPACE, "paintStyle");
216 serializer.text(pos.paintStyle);
217 serializer. endTag(Main.APP_NAMESPACE, "paintStyle");
219 serializer.startTag(Main.APP_NAMESPACE, "strokeWidth");
220 serializer.text(Float.toString(pos.strokeWidth));
221 serializer. endTag(Main.APP_NAMESPACE, "strokeWidth");
223 serializer.startTag(Main.APP_NAMESPACE, "fontSize");
224 serializer.text(Float.toString(pos.fontSize));
225 serializer. endTag(Main.APP_NAMESPACE, "fontSize");
227 serializer.endTag(Main.APP_NAMESPACE, "object");
230 // 接続線の出力 (保持しているものはすべて表示する)
231 Enumeration<Integer> lineKeys = objectHolder.getConnectLineHolder().getLineKeys();
232 while (lineKeys.hasMoreElements())
234 Integer key = lineKeys.nextElement();
235 MeMoMaConnectLineHolder.ObjectConnector line = objectHolder.getConnectLineHolder().getLine(key);
236 serializer.startTag(Main.APP_NAMESPACE, "line");
237 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
239 serializer.startTag(Main.APP_NAMESPACE, "fromObjectKey");
240 serializer.text(Integer.toString(line.fromObjectKey));
241 serializer.endTag(Main.APP_NAMESPACE, "fromObjectKey");
243 serializer.startTag(Main.APP_NAMESPACE, "toObjectKey");
244 serializer.text(Integer.toString(line.toObjectKey));
245 serializer.endTag(Main.APP_NAMESPACE, "toObjectKey");
247 serializer.startTag(Main.APP_NAMESPACE, "lineStyle");
248 serializer.text(Integer.toString(line.lineStyle));
249 serializer.endTag(Main.APP_NAMESPACE, "lineStyle");
251 serializer.startTag(Main.APP_NAMESPACE, "lineShape");
252 serializer.text(Integer.toString(line.lineShape));
253 serializer.endTag(Main.APP_NAMESPACE, "lineShape");
255 serializer.startTag(Main.APP_NAMESPACE, "lineThickness");
256 serializer.text(Integer.toString(line.lineThickness));
257 serializer.endTag(Main.APP_NAMESPACE, "lineThickness");
259 serializer.startTag(Main.APP_NAMESPACE, "fromShape");
260 serializer.text(Integer.toString(line.fromShape));
261 serializer.endTag(Main.APP_NAMESPACE, "fromShape");
263 serializer.startTag(Main.APP_NAMESPACE, "toShape");
264 serializer.text(Integer.toString(line.toShape));
265 serializer.endTag(Main.APP_NAMESPACE, "toShape");
267 serializer.startTag(Main.APP_NAMESPACE, "fromString");
268 serializer.text(line.fromString);
269 serializer.endTag(Main.APP_NAMESPACE, "fromString");
271 serializer.startTag(Main.APP_NAMESPACE, "toString");
272 serializer.text(line.toString);
273 serializer.endTag(Main.APP_NAMESPACE, "toString");
275 serializer.endTag(Main.APP_NAMESPACE, "line");
278 serializer.endTag(Main.APP_NAMESPACE, "memoma");
279 serializer.endDocument();
285 resultMessage = " ERR>" + e.toString();
286 Log.v(Main.APP_IDENTIFIER, resultMessage);
289 return (resultMessage);
295 * @param objectHolder
298 public String saveObjects(MeMoMaObjectHolder objectHolder)
300 // データタイトルがない場合...保存処理は行わない。
301 if (objectHolder.getDataTitle().length() <= 0)
303 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
309 backupFiles(fileUtility.getGokigenDirectory() + "/" , objectHolder.getDataTitle());
311 // ファイル名の設定 ... (拡張子なし)
312 String fileName = fileUtility.getGokigenDirectory() + "/" + objectHolder.getDataTitle();
315 String result = storeToXmlFile(fileName, objectHolder);