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
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
*/\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
/**\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
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
* @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
}\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
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("<");\r
+ }\r
+ else if ( c == '>' ) {\r
+ sb.append(">");\r
+ }\r
+ else if ( c == '&' ) {\r
+ sb.append("&");\r
+ }\r
+ else {\r
+ sb.append(c);\r
+ }\r
+ }\r
+ return sb.toString();\r
+ }\r
+ \r
+ \r
/**\r
* Unicodeエスケープをデコードします。\r
*/\r
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
}\r
\r
/**\r
- * XMLDecorderでシリアライズしたファイルを読みだす\r
+ * XMLDecorderでシリアライズしたファイルを読みだす(オブジェクトを返す場合)\r
*/\r
public static Object readXML(String fname) {\r
{\r
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