1 package jp.sourceforge.gokigen.memoma;
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;
18 public class MeMoMaFileSavingEngine
20 private ExternalStorageFileUtility fileUtility = null;
21 private String backgroundUri = null;
22 private String userCheckboxString = null;
27 public MeMoMaFileSavingEngine(ExternalStorageFileUtility utility, String bgUri, String checkBoxLabel)
29 /** ファイルユーティリティを記憶する **/
30 fileUtility = utility;
32 /** ファイルをバックアップするディレクトリを作成する **/
33 File dir = new File(fileUtility.getGokigenDirectory() + "/backup");
37 backgroundUri = bgUri;
38 userCheckboxString = checkBoxLabel;
44 * @param targetFileName
47 private boolean renameFile(String targetFileName, String newFileName)
50 File targetFile = new File(targetFileName);
51 if (targetFile.exists() == true)
53 // ファイルが存在した、、、ファイル名を1世代古いものに変更する
54 ret = targetFile.renameTo(new File(newFileName));
64 private void backupFiles(String dirName, String backupFileName)
66 // データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
67 boolean result = true;
70 String fileName = dirName + "backup/" + backupFileName;
71 File backFile = new File(fileName + ".xml.bak5");
72 if (backFile.exists() == true)
78 renameFile((fileName + ".xml.bak4"), (fileName + ".xml.bak5"));
79 renameFile((fileName + ".xml.bak3"), (fileName + ".xml.bak4"));
80 renameFile((fileName + ".xml.bak2"), (fileName + ".xml.bak3"));
81 renameFile((fileName + ".xml.bak1"), (fileName + ".xml.bak2"));
82 renameFile((fileName + ".xml.bak"), (fileName + ".xml.bak1"));
83 renameFile((dirName + backupFileName + ".xml"), (fileName + ".xml.bak"));
87 // 何か例外が発生した場合にはエラーと認識する。
92 // バックアップファイルのコピー失敗をログに記述する
93 Log.v(Main.APP_IDENTIFIER, "rename failure : " + dirName + backupFileName + ".xml");
102 * @param objectHolder
105 private String storeToXmlFile(String fileName, MeMoMaObjectHolder objectHolder)
107 String resultMessage = "";
110 FileWriter writer = new FileWriter(new File(fileName + ".xml"));
111 XmlSerializer serializer = Xml.newSerializer();
113 serializer.setOutput(writer);
114 serializer.startDocument("UTF-8", true);
115 serializer.startTag(Main.APP_NAMESPACE, "memoma");
118 serializer.startTag(Main.APP_NAMESPACE, "title");
119 serializer.text(objectHolder.getDataTitle());
120 serializer. endTag(Main.APP_NAMESPACE, "title");
123 serializer.startTag(Main.APP_NAMESPACE, "background");
124 serializer.text(objectHolder.getBackground());
125 serializer. endTag(Main.APP_NAMESPACE, "background");
128 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
129 serializer.text(backgroundUri);
130 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
133 serializer.startTag(Main.APP_NAMESPACE, "userCheckboxString");
134 serializer.text(userCheckboxString);
135 serializer. endTag(Main.APP_NAMESPACE, "userCheckboxString");
137 serializer.startTag(Main.APP_NAMESPACE, "objserial");
138 serializer.text(Integer.toString(objectHolder.getSerialNumber()));
139 serializer.endTag(Main.APP_NAMESPACE, "objserial");
141 serializer.startTag(Main.APP_NAMESPACE, "lineserial");
142 serializer.text(Integer.toString(objectHolder.getConnectLineHolder().getSerialNumber()));
143 serializer.endTag(Main.APP_NAMESPACE, "lineserial");
146 // オブジェクトの出力 (保持しているものはすべて表示する)
147 Enumeration<Integer> keys = objectHolder.getObjectKeys();
148 while (keys.hasMoreElements())
150 Integer key = keys.nextElement();
151 MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
152 serializer.startTag(Main.APP_NAMESPACE, "object");
154 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
156 serializer.startTag(Main.APP_NAMESPACE, "rect");
157 serializer.startTag(Main.APP_NAMESPACE, "top");
158 serializer.text(Float.toString(pos.rect.top));
159 serializer. endTag(Main.APP_NAMESPACE, "top");
160 serializer.startTag(Main.APP_NAMESPACE, "left");
161 serializer.text(Float.toString(pos.rect.left));
162 serializer. endTag(Main.APP_NAMESPACE, "left");
163 serializer.startTag(Main.APP_NAMESPACE, "right");
164 serializer.text(Float.toString(pos.rect.right));
165 serializer. endTag(Main.APP_NAMESPACE, "right");
166 serializer.startTag(Main.APP_NAMESPACE, "bottom");
167 serializer.text(Float.toString(pos.rect.bottom));
168 serializer. endTag(Main.APP_NAMESPACE, "bottom");
169 serializer. endTag(Main.APP_NAMESPACE, "rect");
171 serializer.startTag(Main.APP_NAMESPACE, "drawStyle");
172 serializer.text(Integer.toString(pos.drawStyle));
173 serializer. endTag(Main.APP_NAMESPACE, "drawStyle");
175 serializer.startTag(Main.APP_NAMESPACE, "icon");
176 serializer.text(Integer.toString(pos.icon));
177 serializer. endTag(Main.APP_NAMESPACE, "icon");
179 serializer.startTag(Main.APP_NAMESPACE, "label");
180 serializer.text(pos.label);
181 serializer. endTag(Main.APP_NAMESPACE, "label");
183 serializer.startTag(Main.APP_NAMESPACE, "detail");
184 serializer.text(pos.detail);
185 serializer. endTag(Main.APP_NAMESPACE, "detail");
187 serializer.startTag(Main.APP_NAMESPACE, "otherInfoUri");
188 serializer.text(pos.otherInfoUri);
189 serializer. endTag(Main.APP_NAMESPACE, "otherInfoUri");
191 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
192 serializer.text(pos.backgroundUri);
193 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
195 serializer.startTag(Main.APP_NAMESPACE, "objectStatus");
196 serializer.text(pos.objectStatus);
197 serializer. endTag(Main.APP_NAMESPACE, "objectStatus");
199 serializer.startTag(Main.APP_NAMESPACE, "userChecked");
200 serializer.text(Boolean.toString(pos.userChecked));
201 serializer. endTag(Main.APP_NAMESPACE, "userChecked");
203 serializer.startTag(Main.APP_NAMESPACE, "labelColor");
204 serializer.text(Integer.toString(pos.labelColor));
205 serializer. endTag(Main.APP_NAMESPACE, "labelColor");
207 serializer.startTag(Main.APP_NAMESPACE, "objectColor");
208 serializer.text(Integer.toString(pos.objectColor));
209 serializer. endTag(Main.APP_NAMESPACE, "objectColor");
211 serializer.startTag(Main.APP_NAMESPACE, "paintStyle");
212 serializer.text(pos.paintStyle);
213 serializer. endTag(Main.APP_NAMESPACE, "paintStyle");
215 serializer.startTag(Main.APP_NAMESPACE, "strokeWidth");
216 serializer.text(Float.toString(pos.strokeWidth));
217 serializer. endTag(Main.APP_NAMESPACE, "strokeWidth");
219 serializer.startTag(Main.APP_NAMESPACE, "fontSize");
220 serializer.text(Float.toString(pos.fontSize));
221 serializer. endTag(Main.APP_NAMESPACE, "fontSize");
223 serializer.endTag(Main.APP_NAMESPACE, "object");
226 // 接続線の出力 (保持しているものはすべて表示する)
227 Enumeration<Integer> lineKeys = objectHolder.getConnectLineHolder().getLineKeys();
228 while (lineKeys.hasMoreElements())
230 Integer key = lineKeys.nextElement();
231 MeMoMaConnectLineHolder.ObjectConnector line = objectHolder.getConnectLineHolder().getLine(key);
232 serializer.startTag(Main.APP_NAMESPACE, "line");
233 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
235 serializer.startTag(Main.APP_NAMESPACE, "fromObjectKey");
236 serializer.text(Integer.toString(line.fromObjectKey));
237 serializer.endTag(Main.APP_NAMESPACE, "fromObjectKey");
239 serializer.startTag(Main.APP_NAMESPACE, "toObjectKey");
240 serializer.text(Integer.toString(line.toObjectKey));
241 serializer.endTag(Main.APP_NAMESPACE, "toObjectKey");
243 serializer.startTag(Main.APP_NAMESPACE, "lineStyle");
244 serializer.text(Integer.toString(line.lineStyle));
245 serializer.endTag(Main.APP_NAMESPACE, "lineStyle");
247 serializer.startTag(Main.APP_NAMESPACE, "lineShape");
248 serializer.text(Integer.toString(line.lineShape));
249 serializer.endTag(Main.APP_NAMESPACE, "lineShape");
251 serializer.startTag(Main.APP_NAMESPACE, "lineThickness");
252 serializer.text(Integer.toString(line.lineThickness));
253 serializer.endTag(Main.APP_NAMESPACE, "lineThickness");
255 serializer.startTag(Main.APP_NAMESPACE, "fromShape");
256 serializer.text(Integer.toString(line.fromShape));
257 serializer.endTag(Main.APP_NAMESPACE, "fromShape");
259 serializer.startTag(Main.APP_NAMESPACE, "toShape");
260 serializer.text(Integer.toString(line.toShape));
261 serializer.endTag(Main.APP_NAMESPACE, "toShape");
263 serializer.startTag(Main.APP_NAMESPACE, "fromString");
264 serializer.text(line.fromString);
265 serializer.endTag(Main.APP_NAMESPACE, "fromString");
267 serializer.startTag(Main.APP_NAMESPACE, "toString");
268 serializer.text(line.toString);
269 serializer.endTag(Main.APP_NAMESPACE, "toString");
271 serializer.endTag(Main.APP_NAMESPACE, "line");
274 serializer.endTag(Main.APP_NAMESPACE, "memoma");
275 serializer.endDocument();
281 resultMessage = " ERR>" + e.toString();
282 Log.v(Main.APP_IDENTIFIER, resultMessage);
285 return (resultMessage);
291 * @param objectHolder
294 public String saveObjects(MeMoMaObjectHolder objectHolder)
296 // データタイトルがない場合...保存処理は行わない。
297 if (objectHolder.getDataTitle().length() <= 0)
299 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
305 backupFiles(fileUtility.getGokigenDirectory() + "/" , objectHolder.getDataTitle());
307 // ファイル名の設定 ... (拡張子なし)
308 String fileName = fileUtility.getGokigenDirectory() + "/" + objectHolder.getDataTitle();
311 String result = storeToXmlFile(fileName, objectHolder);