OSDN Git Service

*修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / util / UserDataFactory.java
1 package charactermanaj.util;\r
2 \r
3 import java.io.File;\r
4 import java.net.URI;\r
5 import java.util.UUID;\r
6 \r
7 \r
8 /**\r
9  * ユーザーデータの保存先を生成するファクトリ\r
10  * @author seraphy\r
11  */\r
12 public class UserDataFactory {\r
13 \r
14         /**\r
15          * シングルトン\r
16          */\r
17         private static UserDataFactory inst = new UserDataFactory();\r
18         \r
19         /**\r
20          * インスタンスを取得する.\r
21          * @return インスタンス\r
22          */\r
23         public static UserDataFactory getInstance() {\r
24                 return inst;\r
25         }\r
26         \r
27         /**\r
28          * プライベートコンストラクタ\r
29          */\r
30         private UserDataFactory() {\r
31                 super();\r
32         }\r
33 \r
34         /**\r
35          * 拡張子を含むファイル名を指定し、そのファイルが保存されるべきユーザディレクトリを判定して返す.<br>\r
36          * nullまたは空の場合、もしくは拡張子がない場合はユーザディレクトリのルートを返します.<br>\r
37          * フォルダがなければ作成されます.<br>\r
38          * @param name ファイル名、もしくはnull\r
39          * @return ファィルの拡張子に対応したデータ保存先フォルダ\r
40          */\r
41         public File getSpecialDataDir(String name) {\r
42                 File userDataDir = ConfigurationDirUtilities.getUserDataDir();\r
43                 \r
44                 if (name != null && name.length() > 0) {\r
45                         int pos = name.lastIndexOf('.');\r
46                         if (pos >= 0) {\r
47                                 String ext = name.substring(pos + 1);\r
48                                 if (ext.length() > 0) {\r
49                                         if ("ser".equals(ext)) {\r
50                                                 userDataDir = new File(userDataDir, "caches");\r
51                                         } else {\r
52                                                 userDataDir = new File(userDataDir, ext + "s");\r
53                                         }\r
54                                 }\r
55                         }\r
56                 }\r
57 \r
58                 // フォルダがなければ作成する.\r
59                 if (!userDataDir.exists()) {\r
60                         userDataDir.mkdirs();\r
61                 }\r
62                 \r
63                 return userDataDir;\r
64         }\r
65         \r
66         /**\r
67          * 指定した名前のユーザーデータ保存先を作成する.\r
68          * @param name ファイル名\r
69          * @return 保存先\r
70          */\r
71         public UserData getUserData(String name) {\r
72                 if (name == null || name.trim().length() == 0) {\r
73                         throw new IllegalArgumentException();\r
74                 }\r
75                 return new FileUserData(new File(getSpecialDataDir(name), name));\r
76         }\r
77 \r
78         /**\r
79          * docBaseごとにのハッシュ値を文字列表現化したプレフィックスをもつユーザーデータ保存先を作成する.<br>\r
80          * docBaseのURIの圧縮を目的としており、等しいdocBaseは等しいプレフィックスによるようにしている.(暗号化が目的ではない).<br>\r
81          * ハッシュ値はmd5の5バイトで生成されるため、nameを工夫して衝突の確率を軽減するか衝突しても問題ないように考慮することが望ましい.<Br>\r
82          * @param docBase URI、null可\r
83          * @param name ファイル名\r
84          * @return 保存先\r
85          */\r
86         public UserData getMangledNamedUserData(URI docBase, String name) {\r
87                 String prefix = getMangledNamedPrefix(docBase);\r
88                 return getUserData(prefix + "-" + name);\r
89         }\r
90 \r
91         /**\r
92          * docBaseごとにのハッシュ値を文字列表現化したプレフィックスを返す.<br>\r
93          * docBaseがnullの場合は空文字とみなす.<br>\r
94          * @param docBase URI、null可\r
95          * @return ハッシュ値の文字列表現\r
96          */\r
97         public String getMangledNamedPrefix(URI docBase) {\r
98                 String docBaseStr;\r
99                 if (docBase == null) {\r
100                         docBaseStr = "";\r
101                 } else {\r
102                         docBaseStr = docBase.toString();\r
103                 }\r
104                 String prefix = UUID.nameUUIDFromBytes(docBaseStr.getBytes()).toString();\r
105                 return prefix;\r
106         }\r
107 }\r
108 \r