OSDN Git Service

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