root/as3/Utils/src/org/libspark/utils/VersionUtil.as

リビジョン 4480, 5.8 kB (コミッタ: clockmaker, コミット時期: 1 年 前)

Utils : バージョンチェックが可能なVersionUtil?クラスをコミット。

Line 
1 /*
2  * Licensed under the MIT License
3  *
4  * Copyright (c) 2010 clockmaker.jp
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  */
25
26 package org.libspark.utils
27 {
28         import flash.system.Capabilities;
29        
30         /**
31         * バージョンチェックのためのユーティリティクラスです。
32         * @author clockmaker
33         * @since 2011/02/14
34         * @version 1.0.0
35         * @see http://utils.libspark.org/
36         * @see http://www.libspark.org/
37         */
38         public class VersionUtil
39         {
40                 private static const SPECIALS:Array = ["alpha", "beta", "rc", "rtm"];
41                
42                 /**
43                  * ランタイムが要求するバージョンを満たしているかチェックします。
44                  * @param 要求するバージョン番号. 例:9.0.115
45                  * @return 満たしている場合は true
46                  * @author clockmaker
47                  * @since 2011/02/14
48                  */
49                 public static function isRuntimeRequired(targetVersion:String):Boolean
50                 {
51                         return compareVersion(getRuntimeVersion(), targetVersion, true);
52                 }
53                
54                 /**
55                  * 新しいバージョンかどうかを比較します。
56                  * バージョンの区切り文字は「.」(ドット)のみです。
57                  * @param targetVersion 基準となるバージョン
58                  * @param compareVersion 比較対象のバージョン
59                  * @param includeEqual 条件を「以上」にしたいならtrue。「より大きい」にしたいならfalse。デフォルト値はtrue。
60                  * @return targetVersion が compareVersion と比較して大なら true
61                  * @author  clockmaker
62                  * @since 2011/02/14
63                  *
64                  * バージョンチェックのアルゴリズム
65                  *   1. +,-,_,SPACE,COMMAはドットとして変換 : 1.2+-__5 => 1.2...5
66                  *   2. 連続したドットは単独のドットとして変換  1.2...5 => 1.2.5
67                  *   3. 数字と文字・記号の間にはドットを挿入: 1beta1 => 1.beta.1
68                  *   4. ドットを区切り文字として扱う
69                  *   5. 数字は大小で比較を行う, 文字列の中でもalpha,beta,rcは特別な意味ものとして扱う。大小関係はalpha < beta < rcと < rtm とする。
70                  */
71                 public static function compareVersion(targetVersion:String, compareVersion:String, includeEqual:Boolean = true):Boolean
72                 {
73                         var v1:String = compareVersion.replace(/[+\-_, ]/g, ".").replace(/\.(\.)+/g, ".").replace(/([^\d\.])([^\D\.])/g, "$1.$2").replace(/([^\D\.])([^\d\.])/g, "$1.$2");
74                         var v2:String = targetVersion.replace(/[+\-_, ]/g, ".").replace(/\.(\.)+/g, ".").replace(/([^\d\.])([^\D\.])/g, "$1.$2").replace(/([^\D\.])([^\d\.])/g, "$1.$2");
75                
76                         var parts1:Array = v1.split(".");
77                         var parts2:Array = v2.split(".");
78                        
79                         var minLen:int = Math.min(parts1.length, parts2.length);
80                        
81                         for (var i:int = 0; i < minLen; i ++)
82                         {
83                                 var p1:String = parts1[i];
84                                 var p2:String = parts2[i];
85                                
86                                 var isDigit1:Boolean = isDigit(p1.charAt(0));
87                                 var isDigit2:Boolean = isDigit(p2.charAt(0));
88                                 // 数字の比較
89                                 if (isDigit1 && isDigit2)
90                                 {
91                                         var n1:uint = uint(p1);
92                                         var n2:uint = uint(p2);
93                                         if (n2 != n1) return n2 > n1;
94        
95                                 }
96                                 // アルファニューメリックの比較         
97                                 else if (!isDigit1 && !isDigit2)
98                                 {
99                                         var index1:int = SPECIALS.indexOf(p1.toLowerCase());
100                                         var index2:int = SPECIALS.indexOf(p2.toLowerCase());
101                                         // rtm > rc > beta > alpha
102                                         if (index1 != -1 && index2 != -1)
103                                         {
104                                                 if (index1 != index2) return index2 > index1;
105                                         } else
106                                         {
107                                                 var p1l:String = p1.toLowerCase();
108                                                 var p2l:String = p2.toLowerCase();
109                                                 if (p2l != p1l) return p2l > p1l;
110                                         }
111                                 }
112                                 // 数字とアルファニューメリックの比較
113                                 else
114                                 {
115                                         // 数字 > アルファニューメリック
116                                         if (isDigit1)
117                                                 return false;
118                                         return true;
119                                 }
120                         }
121                         if (parts1.length == parts2.length)
122                         {
123                                 return includeEqual;
124                         }
125                        
126                         if (parts1.length > parts2.length)
127                         {
128                                 // 数字のほうが大きい
129                                 if (isDigit(parts1[minLen].charAt(0)))
130                                 {
131                                         return false;
132                                 } else {
133                                         // アルファニューメリックのほうが小さい
134                                         return true;
135                                 }
136                         }
137                         // バージョン番号に他のパーツがあった場合は、数字のほうが大きいとして扱う
138                         if (isDigit(parts2[minLen].charAt(0)))
139                         {
140                                 return true;
141                         }
142                         // アルファニューメリックのほうが小さい
143                         return false;
144                 }
145                
146                 /**
147                  * クライアントのFlash Playerのバージョンを取得します。
148                  * @param separator 区切り文字。デフォルトは","(カンマ).
149                  * @return Flash Player のバージョン。
150                  * @author  clockmaker
151                  * @since 2011/02/14
152                  */
153                 public static function getRuntimeVersion(separator:String = ","):String
154                 {
155                         return Capabilities.version.split(" ")[1].split(",").join(separator);
156                 }
157                
158                 /**
159                  * @private
160                  * @author  clockmaker
161                  * @since 2011/02/14
162                  */
163                 private static function isDigit(ch:String):Boolean
164                 {
165                         return ch >= '0' && ch <= '9';
166                 }
167         }
168 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。