OSDN Git Service

予約ダイアログに裏番組情報のグラフィカル表示を追加
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / CommonUtils.java
index 80a7262..d20ce51 100644 (file)
@@ -2,7 +2,6 @@
 package tainavi;\r
 \r
 import java.awt.Color;\r
-import java.awt.Component;\r
 import java.awt.Desktop;\r
 import java.beans.XMLDecoder;\r
 import java.beans.XMLEncoder;\r
@@ -23,21 +22,13 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;\r
 import java.io.Reader;\r
 import java.io.Writer;\r
-import java.lang.reflect.Array;\r
-import java.lang.reflect.Field;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.lang.reflect.Method;\r
-import java.lang.reflect.Modifier;\r
 import java.net.HttpURLConnection;\r
 import java.net.Socket;\r
 import java.nio.channels.FileChannel;\r
 import java.nio.channels.FileLock;\r
 import java.text.SimpleDateFormat;\r
-import java.util.AbstractList;\r
-import java.util.AbstractMap;\r
 import java.util.ArrayList;\r
 import java.util.Calendar;\r
-import java.util.ConcurrentModificationException;\r
 import java.util.GregorianCalendar;\r
 import java.util.HashMap;\r
 import java.util.Map.Entry;\r
@@ -62,7 +53,6 @@ public class CommonUtils {
         */\r
        public static void setDebug(boolean b) { debug = b; }\r
        private static boolean debug = false;\r
-       private static boolean debuglv2 = false;        // これは俺用\r
        \r
        /**\r
         *  深夜の帯予約補正に対応するかどうか\r
@@ -221,13 +211,32 @@ public class CommonUtils {
        /**\r
         *  開始・終了時刻から長さを算出する。引数の前後関係は意識しなくて良い。\r
         */\r
-       private static int getRecMinVal(int ahh, int amm, int zhh, int zmm) {\r
+       public static int getRecMinVal(int ahh, int amm, int zhh, int zmm) {\r
                int min = (zhh*60+zmm) - (ahh*60+amm);\r
                if (min < 0) min += 24*60;\r
                return min;\r
        }\r
        \r
        /**\r
+        *  1440分中の何分目か返す\r
+        */\r
+       public static int getMinOfDate(String ahh, String amm) {\r
+               try {\r
+                       return getMinOfDate(Integer.valueOf(ahh),Integer.valueOf(amm));\r
+               }\r
+               catch (NumberFormatException e) {\r
+                       return -1;\r
+               }\r
+       }\r
+       \r
+       /**\r
+        *  1440分中の何分目か返す\r
+        */\r
+       public static int getMinOfDate(int ahh, int amm) {\r
+               return ahh*60+amm;\r
+       }\r
+       \r
+       /**\r
         * @see #getCritDateTime(int)\r
         */\r
        public static String getCritDateTime() {\r
@@ -254,6 +263,19 @@ public class CommonUtils {
                        return getDateTime(0);\r
                }\r
        }\r
+       /**\r
+        * \r
+        */\r
+       public static GregorianCalendar getCritCalendar(String date) {\r
+               GregorianCalendar ca = getCalendar(date);\r
+               int hh = ca.get(Calendar.HOUR_OF_DAY);\r
+               int mm = ca.get(Calendar.MINUTE);\r
+               int ss = ca.get(Calendar.SECOND);\r
+               ca.add(Calendar.HOUR_OF_DAY,-hh+5);\r
+               ca.add(Calendar.MINUTE,-mm);\r
+               ca.add(Calendar.SECOND,-ss);\r
+               return ca;\r
+       }\r
        \r
        /**\r
         * 次回実行予定日を取得する\r
@@ -464,7 +486,7 @@ public class CommonUtils {
         *  @param date YYYY/MM/DD[(.)][ hh:mm[:ss]] or YYYY-MM-DD[Thh:mm[:ss]] or YYYYMMDD[hhmm[ss]]\r
         */\r
        public static GregorianCalendar getCalendar(String date) {\r
-               Matcher ma = Pattern.compile("^(\\d\\d\\d\\d)[/-](\\d\\d)[/-](\\d\\d)(\\(.\\))?([ T](\\d\\d):(\\d\\d)(:\\d\\d)?)?$").matcher(date);\r
+               Matcher ma = Pattern.compile("^(\\d\\d\\d\\d)[/-](\\d{1,2})[/-](\\d{1,2})(\\(.\\))?([ T](\\d{1,2}):(\\d{1,2})(:\\d{1,2})?)?$").matcher(date);\r
                if ( ! ma.find()) {\r
                        ma = Pattern.compile("^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)()?((\\d\\d)(\\d\\d)(\\d\\d)?)?$").matcher(date);\r
                        if ( ! ma.find()) {\r
@@ -631,6 +653,13 @@ public class CommonUtils {
        }\r
        \r
        /**\r
+        * 日付を日付形式に変換。\r
+        * @return YYYY/MM/DD(WD)\r
+        */ \r
+       public static String getDate() {\r
+               return getDate(getCalendar(0), true);\r
+       }\r
+       /**\r
         * <P>「当日」の日付文字列を返します。\r
         * <P>ただし、05時~29時を当日として判断するので、<B>24時~29時に実行した場合は前日の日付が返ります</B>。\r
         * @param n : 現在日時に対して n秒 加えた日時を返します。負の値も許可されます。\r
@@ -869,6 +898,27 @@ public class CommonUtils {
                return dst;\r
        }\r
        \r
+       public static String enEscape(String src) {\r
+               StringBuilder sb = new StringBuilder();\r
+               for ( int index=0; index<src.length(); index++ ) {\r
+                       char c = src.charAt(index);\r
+                       if ( c == '<' ) {\r
+                               sb.append("&lt;");\r
+                       }\r
+                       else if ( c == '>' ) {\r
+                               sb.append("&gt;");\r
+                       }\r
+                       else if ( c == '&' ) {\r
+                               sb.append("&amp;");\r
+                       }\r
+                       else {\r
+                               sb.append(c);\r
+                       }\r
+               }\r
+               return sb.toString();\r
+       }\r
+       \r
+       \r
        /**\r
         *  Unicodeエスケープをデコードします。\r
         */\r
@@ -943,292 +993,27 @@ public class CommonUtils {
                return sb.toString();\r
        }\r
 \r
-       /*******************************************************************************\r
-        * オブジェクト操作関連\r
-        ******************************************************************************/\r
-\r
-       /**\r
-        * <P>オブジェクトからオブジェクトへフィールドのコピー(ディープコピー)を行います。\r
-        * <P>新しく作ったインスタンスに入れ替えたいけど、ポインタを変えたくないので中身だけコピーできないか?という時に使います。\r
-        * <P>fromにあってtoにないフィールドについては無視して最後まで処理を続行します(というか型違いとかも無視します)。\r
-        * <P>多分遅いので、設定ファイルの読み出しなど使用頻度の少ないところで利用します。\r
-        * @param to : HashMapクラスの場合は、コピー先にインスタンスが存在している必要があります(nullはだめ)\r
-        * @param from\r
-        * @version 3.15.4β~\r
-        */\r
-       public static boolean FieldCopy(final Object to, final Object from) {\r
-               try {\r
-                       return FieldCopy(to,from,null);\r
-               }\r
-               catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return false;\r
-       }\r
        \r
-       @SuppressWarnings("rawtypes")\r
-       private static boolean FieldCopy(final Object to, final Object from, final Field fn) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ConcurrentModificationException, InstantiationException  {\r
-               \r
-               // 継承しているクラスのリストを作成する\r
-               ArrayList<Class> fromCL = new ArrayList<Class>();\r
-               ArrayList<Class> toCL = new ArrayList<Class>();\r
-               for ( Class c=from.getClass(); c!=null && ! Object.class.equals(c); c=c.getSuperclass() ) {\r
-                       //if (debug) System.out.println("[DEBUG] FROM "+c.getName());\r
-                       fromCL.add(c);\r
-               }\r
-               for ( Class c=to.getClass(); c!=null && ! Object.class.equals(c); c=c.getSuperclass() ) {\r
-                       //if (debug) System.out.println("[DEBUG] TO "+c.getName());\r
-                       toCL.add(c);\r
-               }\r
-\r
-               // 両方の開始位置をそろえる\r
-               while ( fromCL.size() > 0 && ! toCL.contains(fromCL.get(0)) ) {\r
-                       if (debuglv2) System.out.println("[DEBUG] removed FROM "+fromCL.get(0).getName());\r
-                       fromCL.remove(0);\r
-               }\r
-               while ( toCL.size() > 0 && ! fromCL.contains(toCL.get(0)) ) {\r
-                       if (debuglv2) System.out.println("[DEBUG] removed TO "+toCL.get(0).getName());\r
-                       toCL.remove(0);\r
+       public static String getVerticalSplittedHTML(String text) {\r
+               if ( text == null ) {\r
+                       return null;\r
                }\r
                \r
-               int i=0;\r
-               for ( Class c : fromCL ) {\r
-                       \r
-                       i++;\r
-                       \r
-                       String ctype = (i>1)?(" (super class)"):("");\r
-                       String cname = c.getName();\r
-                       String fname = (fn!=null)?(" name="+fn.getName()):("");\r
-                       \r
-                       if ( isHashMap(to,from,c,fn) ) {\r
-                               if (debuglv2) System.err.println("[DEBUG] FieldCopy("+cname+") *** TERM *** deep copy"+ctype+fname);\r
-                               return true;\r
-                       }\r
-                       \r
-                       if ( isLeaf(to,from,c,fn) ) {\r
-                               if (debuglv2) System.err.println("[DEBUG] FieldCopy("+cname+") *** TERM *** leaf"+ctype+fname);\r
-                               return true;\r
-                       }\r
-                       \r
-                       Field[] fd = c.getDeclaredFields();\r
-                       \r
-                       // フィールドなんかねーよ\r
-                       if ( fd.length == 0 ) {\r
-                               if ( fn == null ) {\r
-                                       // 継承だけして追加のフィールドがない場合にここに入る\r
-                                       if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") no field"+ctype+fname);\r
-                                       continue;\r
-                               }\r
-                               \r
-                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") *** TERM *** no field"+ctype+fname);\r
-                               return isCopyable(to,from,c,fn);        // 終端\r
-                       }\r
-                       \r
-                       // (フィールド)たんけんぼくのまち。チョーさん生きてるよ!\r
-                       for ( Field f : fd ) {\r
-                               f.setAccessible(true);\r
-                               \r
-                               String xcname = f.getType().getName();\r
-                               String xfname = " name="+f.getName();\r
-                               \r
-                               int mod = f.getModifiers();\r
-                               \r
-                               if ( Modifier.isFinal(mod) ) {\r
-                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+xcname+") : FINAL field "+ctype+xfname);\r
-                                       continue;\r
-                               }\r
-                               if ( Modifier.isStatic(mod) ) {\r
-                                       if (debug) System.err.println("[DEBUG] FieldCopy("+xcname+") : STATIC field "+ctype+xfname);\r
-                                       continue;\r
-                               }\r
-                               \r
-                               \r
-                               Object o = f.get(from);\r
-                               if ( o == null ) {\r
-                                       if (debug) System.err.println("[DEBUG] FieldCopy("+xcname+") *** TERM *** null value FROM"+ctype+xfname);\r
-                                       f.set(to, null);\r
-                                       continue;       // 終端\r
-                               }\r
-                               \r
-                               Class xc = o.getClass();\r
-                               xcname = xc.getName();\r
-                               \r
-                               if ( isHashMap(to,o,xc,f) ) {\r
-                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+xcname+") *** TERM *** deep copy"+ctype+xfname);\r
-                                       continue;\r
-                               }\r
-                               \r
-                               if ( isLeaf(to,o,xc,f) ) {\r
-                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+xcname+") *** TERM *** leaf"+ctype+xfname);\r
-                                       continue;\r
-                               }\r
-                               \r
-                               isCopyable(to,o,xc,f);  // 終端\r
-                       }\r
+               String html = "<HTML>";\r
+               for ( String s : text.split("") ) {\r
+                       html += s+"<BR>";\r
                }\r
+               html += "</HTML>";\r
                \r
-               return true;\r
+               return html;\r
        }\r
        \r
-       // HashMapとか、コピーする\r
-       @SuppressWarnings({ "unchecked", "rawtypes" })\r
-       private static boolean isHashMap(Object to, Object from, Class c, Field f) throws InstantiationException, IllegalAccessException, ConcurrentModificationException  {\r
-               \r
-               String cname = c.getName();\r
-               String fname = " name="+((f==null)?("<TOP>"):(f.getName()));\r
-               \r
-               for ( Class cx : unCloneables ) {\r
-                       if ( cx.equals(c) ) {\r
-                               if ( HashMap.class.equals(c) || ArrayList.class.equals(c) ) {\r
-               \r
-                                       final Object px = (f==null)?(to):(f.get(to));\r
-                                       if ( px == null ) {\r
-                                               // コピー先にインスタンスが存在している必要がある\r
-                                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isCloneable() : must have been initialized"+fname);\r
-                                               return true;\r
-                                       }\r
-                                       \r
-                                       // 個別(キャスト!)\r
-               \r
-                                       if ( HashMap.class.equals(c) ) {\r
-                                               HashMap<Object, Object> o = (HashMap<Object, Object>) from;\r
-                                               HashMap<Object, Object> p;\r
-                                               if ( f != null ) {\r
-                                                       // フィールドならclone()では社ローコピーのせいで同じものを指してるに違いない、新しいインスタンスを作らないといけない\r
-                                                       p = (HashMap<Object, Object>) c.newInstance();\r
-                                               }\r
-                                               else {\r
-                                                       // 自身(orスーパークラス)なら別物だろうからキャストで大丈夫だろう\r
-                                                       p = (HashMap<Object, Object>) to;\r
-                                               }\r
-                                               \r
-                                               p.clear(); // とりあえず消す\r
-                                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isHashMap() : HashMap "+cname+fname+" size="+o.size());\r
-                                               for ( Entry<Object, Object> entry: o.entrySet() ) {\r
-                                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+cname+") / isHashMap() : copy"+fname+" key="+entry.getKey()+" value="+entry.getValue());\r
-                                                       p.put(entry.getKey(), entry.getValue());\r
-                                               }\r
-                                               \r
-                                               if ( f != null ) {\r
-                                                       f.set(to, p);\r
-                                               }\r
-                                       }\r
-                                       else if ( ArrayList.class.equals(c) ) {\r
-                                               ArrayList<Object> o = (ArrayList<Object>) from;\r
-                                               ArrayList<Object> p = null;\r
-                                               if ( f != null ) {\r
-                                                       p = (ArrayList<Object>) c.newInstance();\r
-                                               }\r
-                                               else {\r
-                                                       p = (ArrayList<Object>) to;\r
-                                               }\r
-                                               \r
-                                               p.clear(); // とりあえず消す\r
-                                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isHashMap() : ArrayList "+cname+fname+" size="+o.size());\r
-                                               for ( Object entry: o ) {\r
-                                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+cname+") / isHashMap() : copy"+fname+" value="+entry);\r
-                                                       p.add(entry);\r
-                                               }\r
-                                               \r
-                                               if ( f != null ) {\r
-                                                       f.set(to, p);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isHashMap() : unsupported"+fname);\r
-                               }\r
-                               return true;\r
-                       }                       \r
-               }\r
-               return false;\r
-       }\r
-       \r
-       @SuppressWarnings("rawtypes")\r
-       private static final Class[] unCloneables = { HashMap.class, AbstractMap.class, ArrayList.class, AbstractList.class };\r
-       \r
-       // Integerとか、コピーする\r
-       @SuppressWarnings("rawtypes")\r
-       private static boolean isLeaf(Object to, Object from, Class c, Field f) throws IllegalArgumentException, IllegalAccessException {\r
-               \r
-               String cname = c.getName();\r
-               String fname = " name="+((f==null)?("<TOP>"):(f.getName()));\r
-               \r
-               if ( from instanceof String || from instanceof Boolean || from instanceof Number || from instanceof Color || from instanceof Enum || from instanceof Component ) {\r
-                       if ( f == null ) {\r
-                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isLeaf() : <Top> is not allowed");\r
-                               return true;\r
-                       }\r
-                               \r
-                       //if (debuglv2) System.err.println("[DEBUG] FieldCopy("+cname+") / isLeaf() : leaf field"+fname);\r
-                       f.set(to, from);\r
-                       return true;\r
-               }\r
-               \r
-               return false;\r
-       }\r
-       \r
-       //\r
-       @SuppressWarnings("rawtypes")\r
-       private static boolean isCopyable(Object to, Object from, Class c, Field f) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {\r
-               \r
-               String cname = c.getName();\r
-               String fname = " name="+((f==null)?("<TOP>"):(f.getName()));\r
-               \r
-               // コピーに失敗して例外の発生したフィールドについては無視します\r
-               \r
-               if ( c.isPrimitive() ) {\r
-                       if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isCopyable() : primitive"+fname);\r
-                       f.set(to, from);\r
-               }\r
-               else if ( c.isArray() ) {\r
-                       if ( f == null ) {\r
-                               // 自分自身だとコピーするしかないが、しない。redim()があればなんとかできたのに!\r
-                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isCopyable() : not copyable array"+fname);\r
-                       }\r
-                       else {\r
-                               // フィールドなら入れ物は作る。要素はコピー\r
-                               Class comp = c.getComponentType();\r
-                               if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / isCopyable() : array of "+comp.getName()+fname+" lenth="+Array.getLength(from));\r
-                               Object[] o = (Object[]) from;\r
-                               Object[] p = (Object[]) Array.newInstance(comp, Array.getLength(from));\r
-                               \r
-                               for ( int i=o.length-1; i>=0; i-- ) {\r
-                                       if (debuglv2) System.err.println("[DEBUG] FieldCopy("+comp.getName()+") / isCopyable() : copy"+fname+" value="+o[i]);\r
-                                       p[i] = o[i];\r
-                               }\r
-                       }\r
-               }\r
-               else {\r
-                       // そのほかは可能な限りcloneする\r
-                       invokeClone(to,from,c,f);\r
-               }\r
-               \r
-               return true;\r
-       }\r
-       \r
-       //\r
-       @SuppressWarnings("rawtypes")\r
-       private static boolean invokeClone(Object to, Object from, Class c, Field f) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {\r
-               \r
-               final String cname = c.getName();\r
-               final String fname = " name="+((f==null)?("<TOP>"):(f.getName())); // よく考えたらここにf==nullで入ってくることはない\r
-               \r
-               try {\r
-                       @SuppressWarnings("unchecked")\r
-                       Method m = c.getMethod("clone");\r
-                       f.set(to, m.invoke(from));\r
-                       if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / invokeClone() : invoke clone "+cname+fname);\r
-                       return true;\r
-               }\r
-               catch (NoSuchMethodException e) {\r
-                       // ちょっとこわいのでコピーせずに無視\r
-                       if (debug) System.err.println("[DEBUG] FieldCopy("+cname+") / invokeClone() : clone unsupported and ignored "+fname);\r
-               }\r
-               return false;\r
-       }\r
        \r
        /*******************************************************************************\r
+        * オブジェクト操作関連\r
+        ******************************************************************************/\r
+\r
+       /*******************************************************************************\r
         * JavaVM関連\r
         ******************************************************************************/\r
 \r
@@ -1789,7 +1574,7 @@ public class CommonUtils {
        }\r
        \r
        /**\r
-        *  XMLDecorderでシリアライズしたファイルを読みだす\r
+        * XMLDecorderでシリアライズしたファイルを読みだす(オブジェクトを返す場合)\r
         */\r
        public static Object readXML(String fname) {\r
                {\r
@@ -1815,6 +1600,19 @@ public class CommonUtils {
                return null;\r
        }\r
        \r
+       /**\r
+        * XMLDecorderでシリアライズしたファイルを読みだす(既存のオブジェクトに値を入れて返す場合)\r
+        */\r
+       public static boolean readXML(String fname, Object obj) {\r
+               \r
+               Object tmp = readXML(fname);\r
+               if ( tmp == null ) {\r
+                       return false;\r
+               }\r
+               \r
+               return FieldUtils.deepCopy(obj, tmp);\r
+       }\r
+\r
        /*\r
         * finallyブロックで書き間違えそうなので\r
         */\r