package open.dolphin.infomodel; import java.beans.ExceptionListener; import java.beans.XMLDecoder; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; /** * InfoModel * * @author Minagawa,Kazushi */ public class ModelUtils implements IInfoModel { public static final Date AD1800 = new Date(-5362016400000L); public static String trimTime(String mmlDate) { if (mmlDate != null) { int index = mmlDate.indexOf('T'); if (index > -1) { return mmlDate.substring(0, index); } else { return mmlDate; } } return null; } public static String trimDate(String mmlDate) { if (mmlDate != null) { int index = mmlDate.indexOf('T'); if (index > -1) { // THH:mm:ss -> HH:mm return mmlDate.substring(index + 1, index + 6); } else { return mmlDate; } } return null; } public static String getAgeBirthday(String mmlBirthday) { String age = getAge(mmlBirthday); if (age != null) { StringBuilder sb = new StringBuilder(); sb.append(age); //sb.append(" "); //sb.append(AGE); sb.append(" ("); sb.append(mmlBirthday); sb.append(")"); return sb.toString(); } return null; } public static String getAge(String mmlBirthday) { try { GregorianCalendar gc1 = getCalendar(mmlBirthday); GregorianCalendar gc2 = new GregorianCalendar(); // Today int years = 0; int month = 0; gc1.clear(Calendar.MILLISECOND); gc1.clear(Calendar.SECOND); gc1.clear(Calendar.MINUTE); gc1.clear(Calendar.HOUR_OF_DAY); gc2.clear(Calendar.MILLISECOND); gc2.clear(Calendar.SECOND); gc2.clear(Calendar.MINUTE); gc2.clear(Calendar.HOUR_OF_DAY); while (gc1.before(gc2)) { gc1.add(Calendar.YEAR, 1); years++; } gc1.add(Calendar.YEAR, -1); years--; while (gc1.before(gc2)) { gc1.add(Calendar.MONTH, 1); month++; } month--; StringBuilder buf = new StringBuilder(); buf.append(years); if (month != 0) { buf.append("."); buf.append(month); } return buf.toString(); } catch (Exception e) { return null; } } public static int[] getAgeSpec(String mmlBirthday) { try { GregorianCalendar gc1 = getCalendar(mmlBirthday); GregorianCalendar gc2 = new GregorianCalendar(); // Today int years = 0; int month = 0; gc1.clear(Calendar.MILLISECOND); gc1.clear(Calendar.SECOND); gc1.clear(Calendar.MINUTE); gc1.clear(Calendar.HOUR_OF_DAY); gc2.clear(Calendar.MILLISECOND); gc2.clear(Calendar.SECOND); gc2.clear(Calendar.MINUTE); gc2.clear(Calendar.HOUR_OF_DAY); while (gc1.before(gc2)) { gc1.add(Calendar.YEAR, 1); years++; } gc1.add(Calendar.YEAR, -1); years--; while (gc1.before(gc2)) { gc1.add(Calendar.MONTH, 1); month++; } month--; return new int[]{years, month}; } catch (Exception e) { e.printStackTrace(System.err); return new int[]{-1, -1}; } } public static GregorianCalendar getCalendar(String mmlDate) { try { // Trim time if contains mmlDate = trimTime(mmlDate); String[] cmp = mmlDate.split("-"); String yearSt = cmp[0]; String monthSt = cmp[1]; if (monthSt.startsWith("0")) { monthSt = monthSt.substring(1); } String daySt = cmp[2]; if (daySt.startsWith("0")) { daySt = daySt.substring(1); } int year = Integer.parseInt(yearSt); int month = Integer.parseInt(monthSt); month--; int day = Integer.parseInt(daySt); return new GregorianCalendar(year, month, day); } catch (Exception e) { e.printStackTrace(System.err); } return null; } public static Date getDateAsObject(String mmlDate) { if (mmlDate != null) { try { SimpleDateFormat sdf = new SimpleDateFormat(DATE_WITHOUT_TIME); return sdf.parse(mmlDate); } catch (Exception e) { e.printStackTrace(System.err); } } return null; } public static Date getDateTimeAsObject(String mmlDate) { if (mmlDate != null) { try { SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_DATE_FORMAT); return sdf.parse(mmlDate); } catch (Exception e) { e.printStackTrace(System.err); } } return null; } public static String getDateAsString(Date date) { if (date != null) { try { SimpleDateFormat sdf = new SimpleDateFormat(DATE_WITHOUT_TIME); return sdf.format(date); } catch (Exception e) { e.printStackTrace(System.err); } } return null; } public static String getDateTimeAsString(Date date) { if (date != null) { try { SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_DATE_FORMAT); return sdf.format(date); } catch (Exception e) { e.printStackTrace(System.err); } } return null; } public static String getDateAsFormatString(Date date, String format) { if (date != null) { try { SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); } catch (Exception e) { e.printStackTrace(System.err); } } return null; } public static String getGenderDesc(String gender) { if (gender != null) { String test = gender.toLowerCase(); if (test.equals(MALE)) { return MALE_DISP; } else if (test.equals(FEMALE)) { return FEMALE_DISP; } else { return UNKNOWN; } } return UNKNOWN; } public static String getGenderMFDesc(String gender) { if (gender != null) { String test = gender.toLowerCase(); if (test.startsWith("m") || test.startsWith("男") ) { return "M"; } else if (test.startsWith("f") || test.startsWith("女") ) { return "F"; } else { return "U"; } } return "U"; } public boolean isValidModel() { return true; } public static String[] splitDiagnosis(String diagnosis) { if (diagnosis == null) { return null; } String[] ret = null; try { ret = diagnosis.split("\\s*,\\s*"); } catch (Exception e) { } return ret; } public static String getDiagnosisName(String hasAlias) { String[] splits = splitDiagnosis(hasAlias); return (splits != null && splits.length == 2 && splits[0] != null) ? splits[0] : hasAlias; } public static String getDiagnosisAlias(String hasAlias) { String[] splits = splitDiagnosis(hasAlias); return (splits != null && splits.length == 2 && splits[1] != null) ? splits[1] : null; } public static ModuleModel cloneModule(ModuleModel module) { try { return (ModuleModel)module.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(System.err); } return null; } public static SchemaModel cloneSchema(SchemaModel model) { try { return (SchemaModel)model.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(System.err); } return null; } public static AttachmentModel cloneAttachment(AttachmentModel model) { try { return (AttachmentModel)model.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(System.err); } return null; } public static BundleDolphin cloneBundleDolphin(BundleDolphin model) { try { return (BundleDolphin)model.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(System.err); } return null; } public static BundleMed cloneBundleMed(BundleMed model) { try { return (BundleMed)model.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(System.err); } return null; } //masuda^ // test(mmlDate形式)当時の年齢を計算する public static String getAge2(String mmlBirthday, String test) { try { GregorianCalendar gc1 = getCalendar(mmlBirthday); GregorianCalendar gc2 = getCalendar(test); int years = 0; gc1.clear(GregorianCalendar.MILLISECOND); gc1.clear(GregorianCalendar.SECOND); gc1.clear(GregorianCalendar.MINUTE); gc1.clear(GregorianCalendar.HOUR_OF_DAY); gc2.clear(GregorianCalendar.MILLISECOND); gc2.clear(GregorianCalendar.SECOND); gc2.clear(GregorianCalendar.MINUTE); gc2.clear(GregorianCalendar.HOUR_OF_DAY); while (gc1.before(gc2)) { gc1.add(GregorianCalendar.YEAR, 1); years++; } years--; int month = 12; while (gc1.after(gc2)) { gc1.add(GregorianCalendar.MONTH, -1); month--; } StringBuilder buf = new StringBuilder(); buf.append(years); if (month != 0) { buf.append("."); buf.append(month); } return buf.toString(); } catch (Exception e) { return null; } } // 日付の比較のためにNullなら大昔にする public static GregorianCalendar getStartDate(Date start) { GregorianCalendar ret; if (start != null) { ret = getMidnightGc(start); } else { ret = new GregorianCalendar(); ret.setTime(AD1800); } return ret; } // 日付の比較のためにNullなら遠い未来にする public static GregorianCalendar getEndedDate(Date ended) { GregorianCalendar ret; if (ended != null) { ret = getMidnightGc(ended); } else { ret = new GregorianCalendar(); ret.setTime(new Date(Long.MAX_VALUE)); } return ret; } // 指定日の0時0分0秒のGregorianCalendarを取得する public static GregorianCalendar getMidnightGc(Date d) { GregorianCalendar ret = new GregorianCalendar(); ret.setTime(d); int year = ret.get(GregorianCalendar.YEAR); int month = ret.get(GregorianCalendar.MONTH); int date = ret.get(GregorianCalendar.DAY_OF_MONTH); ret.clear(); ret.set(year, month, date); return ret; } // public static boolean isDateBetween(Date start, Date end, Date test) { //boolean ret = (test.after(start) || test.getTime() == start.getTime()) // && (test.before(end) || test.getTime() == end.getTime()); boolean ret = !test.before(start) && !test.after(end); return ret; } public static String getAgeBirthday2(String mmlBirthday){ String age = getAge(mmlBirthday); if (age != null) { StringBuilder sb = new StringBuilder(); sb.append(age); //sb.append(" "); //sb.append(AGE); sb.append(" (["); sb.append(toNengo(mmlBirthday).substring(0, 3)); sb.append("]"); sb.append(mmlBirthday); sb.append(")"); return sb.toString(); } return null; } //// 西暦=>年号変換 public static String toNengo(String mmlBirthday) { int year; int month; int day; String nengo; year = Integer.valueOf(mmlBirthday.substring(0,4)); month = Integer.valueOf(mmlBirthday.substring(5,7)); day = Integer.valueOf(mmlBirthday.substring(8,10)); // 1990年より先は平成 if (year >= 1990) { nengo = "H"; year = year - 1988; } // 1989年だったら,1月7日以前は昭和 else if (year == 1989) { if (month == 1 && day <= 7) { nengo = "S"; year = 64; } else { nengo = "H"; year = 1; } } // 1927年から1988年は昭和 else if (year >= 1927 && year <= 1988) { nengo = "S"; year = year - 1925; } // 1926年だったら,12月25日以降は昭和 else if (year == 1926) { if (month == 12 && day >= 25) { nengo = "S"; year = 1; } else { nengo = "T"; year = 15; } } // 1913年から1925年は大正 else if (year >= 1913 && year <= 1925) { nengo = "T"; year = year - 1911; } // 1912 年だったら,7/30 以降は大正 else if (year == 1912) { if (month >= 8) { nengo = "T"; year = 1; } else if (month <= 6) { nengo = "M"; year = 45; } else if (day >= 30) { nengo = "T"; year = 1; } else { nengo = "M"; year = 45; } } // 1911年以前は明治 else { nengo = "M"; year = year - 1867; } StringBuilder buf = new StringBuilder(); buf.append(nengo); if (year <= 9) { buf.append("0"); } buf.append(Integer.toString(year)); buf.append("-"); if (month <= 9) { buf.append("0"); } buf.append(Integer.toString(month)); buf.append("-"); if (day <= 9) { buf.append("0"); } buf.append(Integer.toString(day)); return buf.toString(); } public static String getByoKanrenKbnStr(int byoKanrenKbn) { String ret = ""; switch (byoKanrenKbn) { case 3: ret = "皮特疾Ⅰ"; break; case 4: ret = "皮特疾Ⅱ"; break; case 5: ret = "特定疾患"; break; } return ret; } public static String extractText(String xml) { StringBuilder sb = new StringBuilder(); String head[] = xml.split("<text>"); for (String str : head) { String tail[] = str.split("</text>"); if (tail.length == 2) { sb.append(tail[0].trim()); } } return sb.toString(); } public static Object xmlDecode(byte[] bytes) { // target should not be null でヌルポとか何とか… // org.hibernate.collection.PersistentBag でヌルポとか何とか… // なんでやねん ExceptionListener el = new ExceptionListener() { public void exceptionThrown(Exception e) { } }; XMLDecoder d = new XMLDecoder( new BufferedInputStream( new ByteArrayInputStream(bytes))); d.setExceptionListener(el); return d.readObject(); } public static String convertListLongToStr(List<Long> list){ StringBuilder sb = new StringBuilder(); boolean first = true; for (Long value : list) { if (!first) { sb.append(","); } else { first = false; } sb.append(String.valueOf(value)); } return sb.toString(); } public static List<Long> convertStrToListLong(String str) { String[] values = str.split(","); List<Long> list = new ArrayList<Long>(); for (String value : values) { list.add(Long.valueOf(value)); } return list; } //masuda$ //新宿ヒロクリニック 処方箋印刷^ public static String convertToGengo(String dateStr) { int year; int month; int day; String nengo; year = Integer.valueOf(dateStr.substring(0, 4)); month = Integer.valueOf(dateStr.substring(5, 7)); day = Integer.valueOf(dateStr.substring(8, 10)); if (year >= 1990) { // 1990年より先は平成 nengo = "平成"; year = year - 1988; } else if (year == 1989) { // 1989年だったら,1月7日以前は昭和 if (month == 1 & day <= 7) { nengo = "昭和"; year = 64; } else { nengo = "平成"; year = 1; } } else if (year >= 1927 & year <= 1988) { // 1927年から1988年は昭和 nengo = "昭和"; year = year - 1925; } else if (year == 1926) { // 1926年だったら,12月25日以降は昭和 if (month == 12 & day >= 25) { nengo = "昭和"; year = 1; } else { nengo = "大正"; year = 15; } } else if (year >= 1913 & year <= 1925) { // 1913年から1925年は大正 nengo = "大正"; year = year - 1911; } else if (year == 1912) { // 1912 年だったら,7/30 以降は大正 if (month >= 8) { nengo = "大正"; year = 1; } else if (month <= 6) { nengo = "明治"; year = 45; } else if (day >= 30) { nengo = "大正"; year = 1; } else { nengo = "明治"; year = 45; } } else { // 1911年以前は明治 nengo = "明治"; year = year - 1867; } StringBuilder sb = new StringBuilder(); sb.append(nengo); if (year <= 9) { sb.append(" "); } sb.append(Integer.toString(year)); sb.append("年"); if (month <= 9) { sb.append(" "); } sb.append(Integer.toString(month)); sb.append("月"); if (day <= 9) { sb.append(" "); } sb.append(Integer.toString(day)); sb.append("日"); return sb.toString(); } //新宿ヒロクリニック 処方箋印刷$ }