OSDN Git Service

一部のワーニングを修正。
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / io / MeMoMaFileSavingEngine.java
1 package jp.sourceforge.gokigen.memoma.io;
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.graphics.RectF;
10 import android.util.Log;
11 import android.util.Xml;
12
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;
17
18 /**
19  *  データをファイルに保存するエンジン部分
20  *  
21  * @author MRSa
22  *
23  */
24 public class MeMoMaFileSavingEngine
25 {       
26         private ExternalStorageFileUtility fileUtility = null;
27         private String backgroundUri = null;
28         private String userCheckboxString = null;    
29         
30         /**
31          *   コンストラクタ
32          */
33         MeMoMaFileSavingEngine(ExternalStorageFileUtility utility, String bgUri, String checkBoxLabel)
34     {
35         // ファイルユーティリティを記憶する
36         fileUtility = utility;
37         
38         // ファイルをバックアップするディレクトリを作成する
39         File dir = new File(fileUtility.getGokigenDirectory() + "/backup");
40         dir.mkdir();
41
42         //  設定データ読み出し用...。
43         backgroundUri = bgUri;
44         userCheckboxString = checkBoxLabel;
45     }
46
47     /**
48      *   ファイルが存在したとき、リネームする
49      *
50      */
51     private boolean renameFile(String targetFileName, String newFileName)
52     {
53         boolean ret = true;
54                 File targetFile = new File(targetFileName);
55                 if (targetFile.exists())
56                 {
57                         // ファイルが存在した、、、ファイル名を1世代古いものに変更する
58                         ret = targetFile.renameTo(new File(newFileName));
59                 }
60                 return (ret);
61     }
62     
63     /**
64      *    保管データを複数世代保管する。
65      * 
66      *
67      */
68     private void backupFiles(String dirName, String backupFileName)
69     {
70         //  データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
71         boolean result = true;
72         try
73         {
74                 String  fileName = dirName +  "backup/" + backupFileName;
75                 File backFile = new File(fileName + ".xml.bak5");
76                 if (backFile.exists())
77                 {
78                         // ファイルが存在した、、、削除する
79                         backFile.delete();
80                 }
81                 backFile = null;
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"));
88         }
89         catch (Exception ex)
90         {
91                 // 何か例外が発生した場合にはエラーと認識する。
92                 result = false;
93         }
94                 if (!result)
95                 {
96             // バックアップファイルのコピー失敗をログに記述する
97             Log.v(Main.APP_IDENTIFIER, "rename failure : " + dirName +  backupFileName + ".xml");
98                 }
99     }
100     
101     /**
102      *    データを(XML形式で)保管する。
103      *
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                 PositionObject pos = objectHolder.getPosition(key);
152                 RectF posRect = pos.getRect();
153                 serializer.startTag(Main.APP_NAMESPACE, "object");
154
155                 serializer.attribute(Main.APP_NAMESPACE, "key", Integer.toString(key));
156
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");
171
172                 serializer.startTag(Main.APP_NAMESPACE, "drawStyle");
173                 serializer.text(Integer.toString(pos.getDrawStyle()));
174                 serializer. endTag(Main.APP_NAMESPACE, "drawStyle");
175
176                 serializer.startTag(Main.APP_NAMESPACE, "icon");
177                 serializer.text(Integer.toString(pos.getIcon()));
178                 serializer. endTag(Main.APP_NAMESPACE, "icon");
179
180                 serializer.startTag(Main.APP_NAMESPACE, "label");
181                 serializer.text(pos.getLabel());
182                 serializer. endTag(Main.APP_NAMESPACE, "label");
183
184                 serializer.startTag(Main.APP_NAMESPACE, "detail");
185                 serializer.text(pos.getDetail());
186                 serializer. endTag(Main.APP_NAMESPACE, "detail");
187 /*
188                 serializer.startTag(Main.APP_NAMESPACE, "otherInfoUri");
189                 serializer.text(pos.otherInfoUri);
190                 serializer. endTag(Main.APP_NAMESPACE, "otherInfoUri");
191
192                 serializer.startTag(Main.APP_NAMESPACE, "backgroundUri");
193                 serializer.text(pos.backgroundUri);
194                 serializer. endTag(Main.APP_NAMESPACE, "backgroundUri");
195
196                 serializer.startTag(Main.APP_NAMESPACE, "objectStatus");
197                 serializer.text(pos.objectStatus);
198                 serializer. endTag(Main.APP_NAMESPACE, "objectStatus");
199 */
200                 serializer.startTag(Main.APP_NAMESPACE, "userChecked");
201                 serializer.text(Boolean.toString(pos.getUserChecked()));
202                 serializer. endTag(Main.APP_NAMESPACE, "userChecked");
203                 
204                 serializer.startTag(Main.APP_NAMESPACE, "labelColor");
205                 serializer.text(Integer.toString(pos.getLabelColor()));
206                 serializer. endTag(Main.APP_NAMESPACE, "labelColor");
207
208                 serializer.startTag(Main.APP_NAMESPACE, "objectColor");
209                 serializer.text(Integer.toString(pos.getObjectColor()));
210                 serializer. endTag(Main.APP_NAMESPACE, "objectColor");
211
212                 serializer.startTag(Main.APP_NAMESPACE, "paintStyle");
213                 serializer.text(pos.getPaintStyle());
214                 serializer. endTag(Main.APP_NAMESPACE, "paintStyle");
215                
216                 serializer.startTag(Main.APP_NAMESPACE, "strokeWidth");
217                 serializer.text(Float.toString(pos.getstrokeWidth()));
218                 serializer. endTag(Main.APP_NAMESPACE, "strokeWidth");
219
220                 serializer.startTag(Main.APP_NAMESPACE, "fontSize");
221                 serializer.text(Float.toString(pos.getFontSize()));
222                 serializer. endTag(Main.APP_NAMESPACE, "fontSize");
223
224                 serializer.endTag(Main.APP_NAMESPACE, "object");
225             }
226
227             // 接続線の出力 (保持しているものはすべて表示する)
228                 Enumeration<Integer> lineKeys = objectHolder.getConnectLineHolder().getLineKeys();
229             while (lineKeys.hasMoreElements())
230             {
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));
235
236                 serializer.startTag(Main.APP_NAMESPACE, "fromObjectKey");
237                 serializer.text(Integer.toString(line.getFromObjectKey()));
238                 serializer.endTag(Main.APP_NAMESPACE, "fromObjectKey");
239
240                 serializer.startTag(Main.APP_NAMESPACE, "toObjectKey");
241                 serializer.text(Integer.toString(line.getToObjectKey()));
242                 serializer.endTag(Main.APP_NAMESPACE, "toObjectKey");
243
244                 serializer.startTag(Main.APP_NAMESPACE, "lineStyle");
245                 serializer.text(Integer.toString(line.getLineStyle()));
246                 serializer.endTag(Main.APP_NAMESPACE, "lineStyle");
247
248                 serializer.startTag(Main.APP_NAMESPACE, "lineShape");
249                 serializer.text(Integer.toString(line.getLineShape()));
250                 serializer.endTag(Main.APP_NAMESPACE, "lineShape");
251
252                 serializer.startTag(Main.APP_NAMESPACE, "lineThickness");
253                 serializer.text(Integer.toString(line.getLineThickness()));
254                 serializer.endTag(Main.APP_NAMESPACE, "lineThickness");
255 /*
256                 serializer.startTag(Main.APP_NAMESPACE, "fromShape");
257                 serializer.text(Integer.toString(line.fromShape));
258                 serializer.endTag(Main.APP_NAMESPACE, "fromShape");
259
260                 serializer.startTag(Main.APP_NAMESPACE, "toShape");
261                 serializer.text(Integer.toString(line.toShape));
262                 serializer.endTag(Main.APP_NAMESPACE, "toShape");
263                 
264                 serializer.startTag(Main.APP_NAMESPACE, "fromString");
265                 serializer.text(line.fromString);
266                 serializer.endTag(Main.APP_NAMESPACE, "fromString");
267
268                 serializer.startTag(Main.APP_NAMESPACE, "toString");
269                 serializer.text(line.toString);
270                 serializer.endTag(Main.APP_NAMESPACE, "toString");
271 */
272                 serializer.endTag(Main.APP_NAMESPACE, "line");
273             }
274
275             serializer.endTag(Main.APP_NAMESPACE, "memoma");
276             serializer.endDocument();
277             serializer.flush();
278             writer.close();
279         }
280         catch (Exception e)
281         {
282                 resultMessage = " ERR>" + e.toString();
283             Log.v(Main.APP_IDENTIFIER, resultMessage);
284             e.printStackTrace();
285         } 
286         return (resultMessage);
287     }
288
289     /**
290      *    オブジェクトを保存する
291      * 
292      *
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         return (storeToXmlFile(fileName, objectHolder));
312     }
313 }