package open.dolphin.adm20.rest; import java.beans.XMLDecoder; import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; /** * * @author kazushi Minagawa, Digital Globe, Inc. */ public class AbstractResource { protected static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; protected static final String RESOURCE_START = "<mmlTouch version=\"1.0\">"; protected static final String RESOURCE_END = "</mmlTouch>"; protected static final String PROPERTY_START = "<property>"; protected static final String PROPERTY_END = "</property>"; protected static final String STRING_START = "<string>"; protected static final String STRING_END = "</string>"; protected static final String XML_LT = "<"; protected static final String XML_GT = ">"; protected static final String XML_AND = "&"; protected static final String XML_QUOT = """; protected static final String XML_APOS = "'"; protected static final String STRING_LT = "<"; protected static final String STRING_GT = ">"; protected static final String STRING_AND = "&"; protected static final String STRING_QUOT = "\""; protected static final String STRING_APOS = "'"; protected static final String DOLPHIN_ASP_OID = "1.3.6.1.4.1.9414."; protected static final String USER_START = "<user>"; protected static final String USER_END = "</user>"; protected static final String FACILITY_START = "<facility>"; protected static final String FACILITY_END = "</facility>"; protected static final String ELEMENT_USER_ID = "userId"; protected static final String ELEMENT_COMMON_NAME = "commonName"; //minagawa^ VisitTouch追加 protected static final String ELEMENT_USER_PK = "pk"; protected static final String ELEMENT_LICENSE = "license"; protected static final String ELEMENT_LICENSE_DESC = "licenseDesc"; protected static final String ELEMENT_DEPARTMENT = "department"; protected static final String ELEMENT_DEPARTMENT_DESC = "departmentDesc"; protected static final String ELEMENT_ORCA_ID = "orcaId"; //minagawa$ protected static final String ELEMENT_FACILITY_ID = "facilityId"; protected static final String ELEMENT_FACILITY_NAME = "facilityName"; //minagawa^ VisitTouch追加 protected static final String ELEMENT_FACILITY_ZIP = "zipCode"; protected static final String ELEMENT_FACILITY_ADDRESS = "address"; protected static final String ELEMENT_FACILITY_TELEPHONE = "telephone"; protected static final String ELEMENT_FACILITY_FAX = "facsimile"; //minagawa$ protected static final String PATIENT_START = "<patient>"; protected static final String PATIENT_END = "</patient>"; protected static final String ELEMENT_PK = "pk"; protected static final String ELEMENT_PATIENT_ID = "patientId"; protected static final String ELEMENT_NAME = "name"; protected static final String ELEMENT_KANA = "kana"; protected static final String ELEMENT_SEX = "sex"; protected static final String ELEMENT_BIRTHDAY = "birthday"; protected static final String ELEMENT_FIRST_VISIT = "firstVisit"; protected static final String ELEMENT_VISITED = "visited"; protected static final String ELEMENT_DISEASE = "disease"; // protected static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // protected static SimpleDateFormat fullDf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // protected static SimpleDateFormat mmlDf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); protected static final String[] MALES = {"m", "M", "男"}; protected static final String[] FEMALES = {"f", "F", "女"}; protected static final String MALE = "M"; protected static final String FEMALE = "F"; protected static final String UNKNOWN = "U"; protected static final String ENTITY_MED_ORDER = "medOrder"; protected static final String ENTITY_BASE_CHARGE_ORDER = "baseChargeOrder"; protected static final String ENTITY_INSTRACTION_CHARGE_ORDER = "instractionChargeOrder"; protected static final String ENTITY_INJECTION_ORDER = "injectionOrder"; protected static final String ENTITY_TREATMENT_ORDER = "treatmentOrder"; protected static final String ENTITY_SURGERY_ORDER = "surgeryOrder"; protected static final String ENTITY_BACTERIA_ORDER = "bacteriaOrder"; protected static final String ENTITY_PHYSIOLOGY_ORDER = "physiologyOrder"; protected static final String ENTITY_TEST_ORDER = "testOrder"; protected static final String ENTITY_RADIOLOGY_ORDER = "radiologyOrder"; protected static final String ENTITY_OTHER_ORDER = "otherOrder"; protected static final String ENTITY_GENERAL_ORDER = "generalOrder"; // Document, Module, Item, TextItem, SChema, ClaimItem protected static final String ELEMENT_PAGE_INFO_START = "<pageInfo>"; protected static final String ELEMENT_PAGE_INFO_END = "</pageInfo>"; protected static final String ELEMENT_NUM_RECORDS = "numRecords"; protected static final String ELEMENT_DOCUMENT_START = "<document>"; protected static final String ELEMENT_DOCUMENT_END = "</document>"; protected static final String ELEMENT_MODULE_START = "<module>"; protected static final String ELEMENT_MODULE_END = "</module>"; protected static final String ELEMENT_ITEM_START = "<item>"; protected static final String ELEMENT_ITEM_END = "</item>"; protected static final String ELEMENT_TEXT_ITEM_START = "<textItem>"; protected static final String ELEMENT_TEXT_ITEM_END = "</textItem>"; protected static final String ELEMENT_CLAIM_ITEM_START = "<claimItem>"; protected static final String ELEMENT_CLAIM_ITEM_END = "</claimItem>"; // entity, name, startDate, code, quantity, unit protected static final String ELEMENT_ENTITY = "entity"; protected static final String ELEMENT_START_DATE = "startDate"; protected static final String ELEMENT_CODE = "code"; protected static final String ELEMENT_VALUE = "value"; protected static final String ELEMENT_QUANTITY = "quantity"; protected static final String ELEMENT_UNIT = "unit"; // ProgressCourse parse protected static final String COMPONENT_ELEMENT_NAME = "component"; //protected static final String STAMP_HOLDER = "stampHolder"; //protected static final String SCHEMA_HOLDER = "schemaHolder"; protected static final int TT_SECTION = 0; protected static final int TT_PARAGRAPH = 1; protected static final int TT_CONTENT = 2; protected static final int TT_ICON = 3; protected static final int TT_COMPONENT = 4; protected static final int TT_PROGRESS_COURSE = 5; protected static final String SECTION_NAME = "section"; protected static final String PARAGRAPH_NAME = "paragraph"; protected static final String CONTENT_NAME = "content"; protected static final String COMPONENT_NAME = "component"; protected static final String ICON_NAME = "icon"; protected static final String ALIGNMENT_NAME = "Alignment"; protected static final String FOREGROUND_NAME = "foreground"; protected static final String SIZE_NAME = "size"; protected static final String BOLD_NAME = "bold"; protected static final String ITALIC_NAME = "italic"; protected static final String UNDERLINE_NAME = "underline"; protected static final String TEXT_NAME = "text"; protected static final String NAME_NAME = "name"; protected static final String LOGICAL_STYLE_NAME = "logicalStyle"; protected static final String PROGRESS_COURSE_NAME = "kartePane"; protected static final String NAME_STAMP_HOLDER = "name=\"stampHolder\""; protected boolean DEBUG; //=========================================== // Helper Methods //=========================================== protected static String simpleFormat(Date date) { return new SimpleDateFormat("yyyy-MM-dd").format(date); } protected static Date simpleParse(String dateStr) { try { return (Date) new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); } catch (ParseException ex) { ex.printStackTrace(System.err); } return null; } protected static Date fullParse(String dateStr) { try { return (Date) new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr); } catch (ParseException ex) { ex.printStackTrace(System.err); } return null; } protected static Date mmlDfParse(String dateStr) { try { return (Date) new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(dateStr); } catch (ParseException ex) { ex.printStackTrace(System.err); } return null; } protected static void propertyString(String prop, String strValue, StringBuilder sb) { if (prop != null && strValue != null) { strValue = strValue.replaceAll(STRING_LT, XML_LT); strValue = strValue.replaceAll(STRING_GT, XML_GT); strValue = strValue.replaceAll(STRING_AND, XML_AND); strValue = strValue.replaceAll(STRING_QUOT, XML_QUOT); strValue = strValue.replaceAll(STRING_APOS, XML_APOS); sb.append(PROPERTY_START); sb.append(prop); sb.append(PROPERTY_END); sb.append(STRING_START); sb.append(strValue); sb.append(STRING_END); } } protected static String entityToName(String order) { if (order == null) { return null; } String ret = null; if (order.equals(ENTITY_MED_ORDER)) { ret = "RP"; } else if (order.equals(ENTITY_BASE_CHARGE_ORDER)) { ret = "診断料"; } else if (order.equals(ENTITY_INSTRACTION_CHARGE_ORDER)) { ret = "指導・在宅"; } else if (order.equals(ENTITY_INJECTION_ORDER)) { ret = "注 射"; } else if (order.equals(ENTITY_TREATMENT_ORDER)) { ret = "処 置"; } else if (order.equals(ENTITY_SURGERY_ORDER)) { ret = "手 術"; } else if (order.equals(ENTITY_BACTERIA_ORDER)) { ret = "細菌検査"; } else if (order.equals(ENTITY_PHYSIOLOGY_ORDER)) { ret = "生体検査"; } else if (order.equals(ENTITY_TEST_ORDER)) { ret = "検体検査"; } else if (order.equals(ENTITY_RADIOLOGY_ORDER)) { ret = "放射線"; } else if (order.equals(ENTITY_OTHER_ORDER)) { ret = "その他"; } else if (order.equals(ENTITY_GENERAL_ORDER)) { ret = "汎 用"; } return ret; } protected void debug(String str) { if (DEBUG) { System.err.println(str); System.err.println("----------------------------"); } } protected static Object xmlDecode(byte[] bytes) { XMLDecoder d = new XMLDecoder( new BufferedInputStream( new ByteArrayInputStream(bytes))); return d.readObject(); } protected static String sexValueToDesc(String code) { for (int i=0; i < MALES.length; i++) { if (code.startsWith(MALES[i])) { return MALE; } } for (int i=0; i < FEMALES.length; i++) { if (code.startsWith(FEMALES[i])) { return FEMALE; } } return UNKNOWN; } /** * OpenDolphinの textPane データをパースする。 * @param sb contentのテキストを集積するためのStringBuilder * @param xml textPane データ */ protected void renderPane(StringBuilder sb, String xml) { debug(xml); SAXBuilder docBuilder = new SAXBuilder(); try { StringReader sr = new StringReader(xml); Document doc = docBuilder.build(new BufferedReader(sr)); org.jdom.Element root = (org.jdom.Element) doc.getRootElement(); writeChildren(sb, root); } catch (JDOMException e) { e.printStackTrace(System.err); } catch (IOException e) { e.printStackTrace(System.err); } } /** * 要素を再帰的に解析する。 * @param sb contentのテキストを集積するためのStringBuilder * @param current XML要素 */ protected void writeChildren(StringBuilder sb, org.jdom.Element current) { int eType = -1; String eName = current.getName(); if (eName.equals(PARAGRAPH_NAME)) { eType = TT_PARAGRAPH; startParagraph(sb, current.getAttributeValue(LOGICAL_STYLE_NAME), current.getAttributeValue(ALIGNMENT_NAME)); } else if (eName.equals(CONTENT_NAME) && (current.getChild(TEXT_NAME) != null)) { eType = TT_CONTENT; startContent(sb, current.getAttributeValue(FOREGROUND_NAME), current.getAttributeValue(SIZE_NAME), current.getAttributeValue(BOLD_NAME), current.getAttributeValue(ITALIC_NAME), current.getAttributeValue(UNDERLINE_NAME), current.getChildText(TEXT_NAME)); } else if (eName.equals(COMPONENT_NAME)) { eType = TT_COMPONENT; startComponent(sb, current.getAttributeValue(NAME_NAME), // compoenet=number current.getAttributeValue(COMPONENT_ELEMENT_NAME)); } else if (eName.equals(ICON_NAME)) { eType = TT_ICON; startIcon(sb, current); } else if (eName.equals(PROGRESS_COURSE_NAME)) { eType = TT_PROGRESS_COURSE; startProgressCourse(sb); } else if (eName.equals(SECTION_NAME)) { eType = TT_SECTION; startSection(sb); } else { debug("Other element:" + eName); } // // 再帰: 子を探索するのはパラグフとトップ要素のみ // if (eType == TT_PARAGRAPH || eType == TT_PROGRESS_COURSE || eType == TT_SECTION) { java.util.List children = (java.util.List) current.getChildren(); Iterator iterator = children.iterator(); while (iterator.hasNext()) { org.jdom.Element child = (org.jdom.Element) iterator.next(); writeChildren(sb, child); } } switch (eType) { case TT_PARAGRAPH: endParagraph(sb); break; case TT_CONTENT: endContent(sb); break; case TT_ICON: endIcon(sb); break; case TT_COMPONENT: endComponent(sb); break; case TT_PROGRESS_COURSE: endProgressCourse(sb); break; case TT_SECTION: endSection(sb); break; } } protected void startSection(StringBuilder sb) { debug("startSection"); } protected void endSection(StringBuilder sb) { debug("endSection"); } protected void startProgressCourse(StringBuilder sb) { debug("startProgressCourse"); } protected void endProgressCourse(StringBuilder sb) { debug("endProgressCourse"); } protected void startParagraph(StringBuilder sb, String lStyle, String alignStr) { debug("startParagraph"); debug("lStyle: " + lStyle); debug("alignStr: " + alignStr); } protected void endParagraph(StringBuilder sb) { debug("endParagraph"); // パラグラフを生成する sb.append("\n"); } protected void startContent(StringBuilder sb, String foreground, String size, String bold, String italic, String underline, String text) { debug("startContent"); debug("foreground: " + foreground); debug("size: " + size); debug("bold: " + bold); debug("italic: " + italic); debug("underline: " + underline); debug("text: " + text); // ゴミ除去 sb.append(text.trim()); } protected void endContent(StringBuilder sb) { } protected void startComponent(StringBuilder sb, String name, String number) { debug("startComponent"); debug("name: " + name); debug("number: " + number); } protected void endComponent(StringBuilder sb) { debug("endComponent"); } protected void startIcon(StringBuilder sb, org.jdom.Element current) { String name = current.getChildTextTrim("name"); if (name != null) { debug(name); } } protected void endIcon(StringBuilder sb) { } protected String toIsoBirtday(String birthday) { String[] spec = birthday.split("/"); StringBuilder sb = new StringBuilder(); sb.append(spec[0]); sb.append("-"); if (spec[1].length() == 1) { sb.append("0"); } sb.append(spec[1]); sb.append("-"); if (spec[2].length() == 1) { sb.append("0"); } sb.append(spec[2]); return sb.toString(); } }