OSDN Git Service

284d3fad711d0d73d1e3e12f86d1d808dbfa8d5c
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / MeMoMaFileSavingEngine.java
1 package jp.sourceforge.gokigen.memoma;
2
3 import java.io.File;
4 import java.io.FileWriter;
5 import java.util.Enumeration;
6
7 import org.xmlpull.v1.XmlSerializer;
8
9 import android.util.Log;
10 import android.util.Xml;
11
12 /**
13  *  データをファイルに保存するエンジン部分
14  *  
15  * @author MRSa
16  *
17  */
18 public class MeMoMaFileSavingEngine
19 {       
20         private ExternalStorageFileUtility fileUtility = null;
21         private String backgroundUri = null;
22         private String userCheckboxString = null;    
23         
24         /**
25          *   コンストラクタ
26          */
27     public MeMoMaFileSavingEngine(ExternalStorageFileUtility utility, String bgUri, String checkBoxLabel)
28     {
29         /** ファイルユーティリティを記憶する **/
30         fileUtility = utility;
31         
32         /** ファイルをバックアップするディレクトリを作成する **/
33         File dir = new File(fileUtility.getGokigenDirectory() + "/backup");
34         dir.mkdir();
35
36         //  設定データ読み出し用...。
37         backgroundUri = bgUri;
38         userCheckboxString = checkBoxLabel;
39     }
40
41     /**
42      *   ファイルが存在したとき、リネームする
43      * 
44      * @param targetFileName
45      * @param newFileName
46      */
47     private boolean renameFile(String targetFileName, String newFileName)
48     {
49         boolean ret = true;
50                 File targetFile = new File(targetFileName);
51                 if (targetFile.exists() == true)
52                 {
53                         // ファイルが存在した、、、ファイル名を1世代古いものに変更する
54                         ret = targetFile.renameTo(new File(newFileName));
55                 }
56                 return (ret);
57     }
58     
59     /**
60      *    保管データを複数世代保管する。
61      * 
62      * @param fileName
63      */
64     private void backupFiles(String dirName, String backupFileName)
65     {
66         //  データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
67         boolean result = true;
68         try
69         {
70                 String  fileName = dirName +  "backup/" + backupFileName;
71                 File backFile = new File(fileName + ".xml.bak5");
72                 if (backFile.exists() == true)
73                 {
74                         // ファイルが存在した、、、削除する
75                         backFile.delete();
76                 }
77                 backFile = null;
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"));
84         }
85         catch (Exception ex)
86         {
87                 // 何か例外が発生した場合にはエラーと認識する。
88                 result = false;
89         }
90                 if (result == false)
91                 {
92             // バックアップファイルのコピー失敗をログに記述する
93             Log.v(Main.APP_IDENTIFIER, "rename failure : " + dirName +  backupFileName + ".xml");
94                 }
95                 return;
96     }
97     
98     /**
99      *    データを(XML形式で)保管する。
100      * 
101      * @param fileName
102      * @param objectHolder
103      * @return
104      */
105     private String storeToXmlFile(String fileName, MeMoMaObjectHolder objectHolder)
106     {
107         String resultMessage = "";
108         try
109         {
110             FileWriter writer = new FileWriter(new File(fileName + ".xml"));            
111             XmlSerializer serializer = Xml.newSerializer();
112
113             serializer.setOutput(writer);
114             serializer.startDocument("UTF-8", true);
115             serializer.startTag(Main.APP_NAMESPACE, "memoma");
116             
117             // タイトルの出力
118             serializer.startTag(Main.APP_NAMESPACE, "title");
119             serializer.text(objectHolder.getDataTitle());
120             serializer. endTag(Main.APP_NAMESPACE, "title");
121
122             // 背景情報の出力
123             serializer.startTag(Main.APP_NAMESPACE, "background");
124             serializer.text(objectHolder.getBackground());
125             serializer. endTag(Main.APP_NAMESPACE, "background");
126
127             // 背景画像URIの出力
128             serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
129             serializer.text(backgroundUri);
130             serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
131             
132             // ユーザチェックボックス名の出力
133             serializer.startTag(Main.APP_NAMESPACE, "userCheckboxString");
134             serializer.text(userCheckboxString);
135             serializer. endTag(Main.APP_NAMESPACE, "userCheckboxString");
136             
137             serializer.startTag(Main.APP_NAMESPACE, "objserial");
138             serializer.text(Integer.toString(objectHolder.getSerialNumber()));
139             serializer.endTag(Main.APP_NAMESPACE, "objserial");
140
141             serializer.startTag(Main.APP_NAMESPACE, "lineserial");
142             serializer.text(Integer.toString(objectHolder.getConnectLineHolder().getSerialNumber()));
143             serializer.endTag(Main.APP_NAMESPACE, "lineserial");
144             
145             
146                 // オブジェクトの出力 (保持しているものはすべて表示する)
147                 Enumeration<Integer> keys = objectHolder.getObjectKeys();
148             while (keys.hasMoreElements())
149             {
150                 Integer key = keys.nextElement();
151                 MeMoMaObjectHolder.PositionObject pos = objectHolder.getPosition(key);
152                 serializer.startTag(Main.APP_NAMESPACE, "object");
153
154                 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
155
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");
170
171                 serializer.startTag(Main.APP_NAMESPACE, "drawStyle");
172                 serializer.text(Integer.toString(pos.drawStyle));
173                 serializer. endTag(Main.APP_NAMESPACE, "drawStyle");
174
175                 serializer.startTag(Main.APP_NAMESPACE, "icon");
176                 serializer.text(Integer.toString(pos.icon));
177                 serializer. endTag(Main.APP_NAMESPACE, "icon");
178
179                 serializer.startTag(Main.APP_NAMESPACE, "label");
180                 serializer.text(pos.label);
181                 serializer. endTag(Main.APP_NAMESPACE, "label");
182
183                 serializer.startTag(Main.APP_NAMESPACE, "detail");
184                 serializer.text(pos.detail);
185                 serializer. endTag(Main.APP_NAMESPACE, "detail");
186 /**
187                 serializer.startTag(Main.APP_NAMESPACE, "otherInfoUri");
188                 serializer.text(pos.otherInfoUri);
189                 serializer. endTag(Main.APP_NAMESPACE, "otherInfoUri");
190
191                 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
192                 serializer.text(pos.backgroundUri);
193                 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
194
195                 serializer.startTag(Main.APP_NAMESPACE, "objectStatus");
196                 serializer.text(pos.objectStatus);
197                 serializer. endTag(Main.APP_NAMESPACE, "objectStatus");
198 **/
199                 serializer.startTag(Main.APP_NAMESPACE, "userChecked");
200                 serializer.text(Boolean.toString(pos.userChecked));
201                 serializer. endTag(Main.APP_NAMESPACE, "userChecked");
202                 
203                 serializer.startTag(Main.APP_NAMESPACE, "labelColor");
204                 serializer.text(Integer.toString(pos.labelColor));
205                 serializer. endTag(Main.APP_NAMESPACE, "labelColor");
206
207                 serializer.startTag(Main.APP_NAMESPACE, "objectColor");
208                 serializer.text(Integer.toString(pos.objectColor));
209                 serializer. endTag(Main.APP_NAMESPACE, "objectColor");
210
211                 serializer.startTag(Main.APP_NAMESPACE, "paintStyle");
212                 serializer.text(pos.paintStyle);
213                 serializer. endTag(Main.APP_NAMESPACE, "paintStyle");
214                
215                 serializer.startTag(Main.APP_NAMESPACE, "strokeWidth");
216                 serializer.text(Float.toString(pos.strokeWidth));
217                 serializer. endTag(Main.APP_NAMESPACE, "strokeWidth");
218
219                 serializer.startTag(Main.APP_NAMESPACE, "fontSize");
220                 serializer.text(Float.toString(pos.fontSize));
221                 serializer. endTag(Main.APP_NAMESPACE, "fontSize");
222
223                 serializer.endTag(Main.APP_NAMESPACE, "object");
224             }
225
226             // 接続線の出力 (保持しているものはすべて表示する)
227                 Enumeration<Integer> lineKeys = objectHolder.getConnectLineHolder().getLineKeys();
228             while (lineKeys.hasMoreElements())
229             {
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));
234
235                 serializer.startTag(Main.APP_NAMESPACE, "fromObjectKey");
236                 serializer.text(Integer.toString(line.fromObjectKey));
237                 serializer.endTag(Main.APP_NAMESPACE, "fromObjectKey");
238
239                 serializer.startTag(Main.APP_NAMESPACE, "toObjectKey");
240                 serializer.text(Integer.toString(line.toObjectKey));
241                 serializer.endTag(Main.APP_NAMESPACE, "toObjectKey");
242
243                 serializer.startTag(Main.APP_NAMESPACE, "lineStyle");
244                 serializer.text(Integer.toString(line.lineStyle));
245                 serializer.endTag(Main.APP_NAMESPACE, "lineStyle");
246
247                 serializer.startTag(Main.APP_NAMESPACE, "lineShape");
248                 serializer.text(Integer.toString(line.lineShape));
249                 serializer.endTag(Main.APP_NAMESPACE, "lineShape");
250
251                 serializer.startTag(Main.APP_NAMESPACE, "lineThickness");
252                 serializer.text(Integer.toString(line.lineThickness));
253                 serializer.endTag(Main.APP_NAMESPACE, "lineThickness");
254 /**
255                 serializer.startTag(Main.APP_NAMESPACE, "fromShape");
256                 serializer.text(Integer.toString(line.fromShape));
257                 serializer.endTag(Main.APP_NAMESPACE, "fromShape");
258
259                 serializer.startTag(Main.APP_NAMESPACE, "toShape");
260                 serializer.text(Integer.toString(line.toShape));
261                 serializer.endTag(Main.APP_NAMESPACE, "toShape");
262                 
263                 serializer.startTag(Main.APP_NAMESPACE, "fromString");
264                 serializer.text(line.fromString);
265                 serializer.endTag(Main.APP_NAMESPACE, "fromString");
266
267                 serializer.startTag(Main.APP_NAMESPACE, "toString");
268                 serializer.text(line.toString);
269                 serializer.endTag(Main.APP_NAMESPACE, "toString");
270 **/
271                 serializer.endTag(Main.APP_NAMESPACE, "line");
272             }
273
274             serializer.endTag(Main.APP_NAMESPACE, "memoma");
275             serializer.endDocument();
276             serializer.flush();
277             writer.close();
278         }
279         catch (Exception e)
280         {
281                 resultMessage = " ERR>" + e.toString();
282             Log.v(Main.APP_IDENTIFIER, resultMessage);
283             e.printStackTrace();
284         } 
285         return (resultMessage);
286     }
287
288     /**
289      *    オブジェクトを保存する
290      * 
291      * @param objectHolder
292      * @return
293      */
294     public String saveObjects(MeMoMaObjectHolder objectHolder)
295     {
296                 // データタイトルがない場合...保存処理は行わない。
297         if (objectHolder.getDataTitle().length() <= 0)
298         {
299                 Log.v(Main.APP_IDENTIFIER, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
300
301                 return ("");
302         }
303
304         // バックアップを保存する
305         backupFiles(fileUtility.getGokigenDirectory() + "/" , objectHolder.getDataTitle());
306         
307         // ファイル名の設定 ... (拡張子なし)
308         String fileName = fileUtility.getGokigenDirectory() + "/" + objectHolder.getDataTitle();
309
310         // データを保管する
311         String result = storeToXmlFile(fileName, objectHolder);
312
313         return (result);
314     }
315 }