1 package jp.sourceforge.gokigen.memoma.io;
4 import java.io.FileWriter;
5 import java.util.Enumeration;
7 import org.xmlpull.v1.XmlSerializer;
9 import android.graphics.RectF;
10 import android.util.Log;
11 import android.util.Xml;
13 import jp.sourceforge.gokigen.memoma.Main;
14 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
15 import jp.sourceforge.gokigen.memoma.holders.ObjectConnector;
16 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
24 public class MeMoMaFileSavingEngine
26 private ExternalStorageFileUtility fileUtility = null;
27 private String backgroundUri = null;
28 private String userCheckboxString = null;
33 MeMoMaFileSavingEngine(ExternalStorageFileUtility utility, String bgUri, String checkBoxLabel)
36 fileUtility = utility;
38 // ファイルをバックアップするディレクトリを作成する
39 File dir = new File(fileUtility.getGokigenDirectory() + "/backup");
43 backgroundUri = bgUri;
44 userCheckboxString = checkBoxLabel;
51 private boolean renameFile(String targetFileName, String newFileName)
54 File targetFile = new File(targetFileName);
55 if (targetFile.exists())
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())
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");
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 PositionObject pos = objectHolder.getPosition(key);
152 RectF posRect = pos.getRect();
153 serializer.startTag(Main.APP_NAMESPACE, "object");
155 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
157 serializer.startTag(Main.APP_NAMESPACE, "rect");
158 serializer.startTag(Main.APP_NAMESPACE, "top");
159 serializer.text(Float.toString(posRect.top));
160 serializer. endTag(Main.APP_NAMESPACE, "top");
161 serializer.startTag(Main.APP_NAMESPACE, "left");
162 serializer.text(Float.toString(posRect.left));
163 serializer. endTag(Main.APP_NAMESPACE, "left");
164 serializer.startTag(Main.APP_NAMESPACE, "right");
165 serializer.text(Float.toString(posRect.right));
166 serializer. endTag(Main.APP_NAMESPACE, "right");
167 serializer.startTag(Main.APP_NAMESPACE, "bottom");
168 serializer.text(Float.toString(posRect.bottom));
169 serializer. endTag(Main.APP_NAMESPACE, "bottom");
170 serializer. endTag(Main.APP_NAMESPACE, "rect");
172 serializer.startTag(Main.APP_NAMESPACE, "drawStyle");
173 serializer.text(Integer.toString(pos.getDrawStyle()));
174 serializer. endTag(Main.APP_NAMESPACE, "drawStyle");
176 serializer.startTag(Main.APP_NAMESPACE, "icon");
177 serializer.text(Integer.toString(pos.getIcon()));
178 serializer. endTag(Main.APP_NAMESPACE, "icon");
180 serializer.startTag(Main.APP_NAMESPACE, "label");
181 serializer.text(pos.getLabel());
182 serializer. endTag(Main.APP_NAMESPACE, "label");
184 serializer.startTag(Main.APP_NAMESPACE, "detail");
185 serializer.text(pos.getDetail());
186 serializer. endTag(Main.APP_NAMESPACE, "detail");
188 serializer.startTag(Main.APP_NAMESPACE, "otherInfoUri");
189 serializer.text(pos.otherInfoUri);
190 serializer. endTag(Main.APP_NAMESPACE, "otherInfoUri");
192 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
193 serializer.text(pos.backgroundUri);
194 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
196 serializer.startTag(Main.APP_NAMESPACE, "objectStatus");
197 serializer.text(pos.objectStatus);
198 serializer. endTag(Main.APP_NAMESPACE, "objectStatus");
200 serializer.startTag(Main.APP_NAMESPACE, "userChecked");
201 serializer.text(Boolean.toString(pos.getUserChecked()));
202 serializer. endTag(Main.APP_NAMESPACE, "userChecked");
204 serializer.startTag(Main.APP_NAMESPACE, "labelColor");
205 serializer.text(Integer.toString(pos.getLabelColor()));
206 serializer. endTag(Main.APP_NAMESPACE, "labelColor");
208 serializer.startTag(Main.APP_NAMESPACE, "objectColor");
209 serializer.text(Integer.toString(pos.getObjectColor()));
210 serializer. endTag(Main.APP_NAMESPACE, "objectColor");
212 serializer.startTag(Main.APP_NAMESPACE, "paintStyle");
213 serializer.text(pos.getPaintStyle());
214 serializer. endTag(Main.APP_NAMESPACE, "paintStyle");
216 serializer.startTag(Main.APP_NAMESPACE, "strokeWidth");
217 serializer.text(Float.toString(pos.getstrokeWidth()));
218 serializer. endTag(Main.APP_NAMESPACE, "strokeWidth");
220 serializer.startTag(Main.APP_NAMESPACE, "fontSize");
221 serializer.text(Float.toString(pos.getFontSize()));
222 serializer. endTag(Main.APP_NAMESPACE, "fontSize");
224 serializer.endTag(Main.APP_NAMESPACE, "object");
227 // 接続線の出力 (保持しているものはすべて表示する)
228 Enumeration<Integer> lineKeys = objectHolder.getConnectLineHolder().getLineKeys();
229 while (lineKeys.hasMoreElements())
231 Integer key = lineKeys.nextElement();
232 ObjectConnector line = objectHolder.getConnectLineHolder().getLine(key);
233 serializer.startTag(Main.APP_NAMESPACE, "line");
234 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
236 serializer.startTag(Main.APP_NAMESPACE, "fromObjectKey");
237 serializer.text(Integer.toString(line.getFromObjectKey()));
238 serializer.endTag(Main.APP_NAMESPACE, "fromObjectKey");
240 serializer.startTag(Main.APP_NAMESPACE, "toObjectKey");
241 serializer.text(Integer.toString(line.getToObjectKey()));
242 serializer.endTag(Main.APP_NAMESPACE, "toObjectKey");
244 serializer.startTag(Main.APP_NAMESPACE, "lineStyle");
245 serializer.text(Integer.toString(line.getLineStyle()));
246 serializer.endTag(Main.APP_NAMESPACE, "lineStyle");
248 serializer.startTag(Main.APP_NAMESPACE, "lineShape");
249 serializer.text(Integer.toString(line.getLineShape()));
250 serializer.endTag(Main.APP_NAMESPACE, "lineShape");
252 serializer.startTag(Main.APP_NAMESPACE, "lineThickness");
253 serializer.text(Integer.toString(line.getLineThickness()));
254 serializer.endTag(Main.APP_NAMESPACE, "lineThickness");
256 serializer.startTag(Main.APP_NAMESPACE, "fromShape");
257 serializer.text(Integer.toString(line.fromShape));
258 serializer.endTag(Main.APP_NAMESPACE, "fromShape");
260 serializer.startTag(Main.APP_NAMESPACE, "toShape");
261 serializer.text(Integer.toString(line.toShape));
262 serializer.endTag(Main.APP_NAMESPACE, "toShape");
264 serializer.startTag(Main.APP_NAMESPACE, "fromString");
265 serializer.text(line.fromString);
266 serializer.endTag(Main.APP_NAMESPACE, "fromString");
268 serializer.startTag(Main.APP_NAMESPACE, "toString");
269 serializer.text(line.toString);
270 serializer.endTag(Main.APP_NAMESPACE, "toString");
272 serializer.endTag(Main.APP_NAMESPACE, "line");
275 serializer.endTag(Main.APP_NAMESPACE, "memoma");
276 serializer.endDocument();
282 resultMessage = " ERR>" + e.toString();
283 Log.v(Main.APP_IDENTIFIER, resultMessage);
286 return (resultMessage);
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 return (storeToXmlFile(fileName, objectHolder));