package open.dolphin.impl.mml;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.*;
import open.dolphin.infomodel.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
* MMLBuilder
*
* @author Minagawa,Kazushi
*/
public class MMLHelper23 {
// MML化する DocumentModel
private DocumentModel document;
private UserModel userModel;
private String patientId;
// Buffer
private StringBuilder freeExp;
private StringBuilder paragraphBuilder;
// SOA spec
private String soaSpec;
// PSpec
private String pSpec;
// P-Modules List
private List<ClaimBundle> bundle;
// Scheam List
private List<SchemaModel> schemas;
// Access Rights
private List<AccessRightModel> accessRights;
private final boolean DEBUG = false;
/** Creates a new instance of MMLBuilder */
public MMLHelper23() {
}
public DocumentModel getDocument() {
return document;
}
public void setDocument(DocumentModel document) {
this.document = document;
}
/**
* 経過記録モジュールの自由記載表現を生成する。
*/
public void buildText() {
// Moduleを抽出する
Collection<ModuleModel> moduleBeans = getDocument().getModules();
// P-Module List
bundle = new ArrayList<>();
// Moduleをイテレートして分ける
for (ModuleModel module : moduleBeans) {
// Role
String role = module.getModuleInfoBean().getStampRole();
if (role.equals(IInfoModel.ROLE_SOA_SPEC)) {
// SOA spec
soaSpec = ((ProgressCourse) module.getModel()).getFreeText();
} else if (role.equals(IInfoModel.ROLE_P)) {
if (module.getModel()!=null && module.getModel() instanceof BundleDolphin) {
// p-Module
BundleDolphin bd = (BundleDolphin)module.getModel();
if (bd.getClaimItem()!=null && bd.getClaimItem().length>0) {
bundle.add((ClaimBundle)bd);
}
}
} else if (role.equals(IInfoModel.ROLE_P_SPEC)) {
// P spec
pSpec = ((ProgressCourse) module.getModel()).getFreeText();
}
}
// Schemaを抽出する
Collection<SchemaModel> schemaC = getDocument().getSchema();
if (schemaC != null && schemaC.size() > 0) {
schemas = new ArrayList<>(schemaC.size());
schemas.addAll(schemaC);
}
// アクセス権を抽出する
Collection<AccessRightModel> arc = getDocument().getDocInfoModel().getAccessRights();
if (arc != null && arc.size() > 0) {
accessRights = new ArrayList<>(arc.size());
accessRights.addAll(arc);
}
// Builderを生成し soa及びpドキュメントをパースする
freeExp = new StringBuilder();
// SOA Textをパースする
if (soaSpec != null) {
//parse(soaSpec);
if (freeExp== null) {
freeExp = new StringBuilder();
}
freeExp.append(soaSpec.replaceAll("<.+?>", ""));
freeExp.append("\n");
}
// P Textをパースする
if (pSpec != null) {
//parse(pSpec);
if (freeExp== null) {
freeExp = new StringBuilder();
}
freeExp.append(pSpec.replaceAll("<.+?>", ""));
}
}
public void setUserModel(UserModel u) {
this.userModel = u;
}
public UserModel getUser() {
return userModel!=null ? userModel : document.getUserModel();
}
public void setPatientId(String id) {
this.patientId = id;
}
public String getPatientId() {
if (patientId!=null) {
return patientId;
}
if (document.getKarteBean()!=null) {
if (document.getKarteBean().getPatientModel()!=null) {
if (document.getKarteBean().getPatientModel().getPatientId()!=null) {
return document.getKarteBean().getPatientModel().getPatientId();
} else {
return "return document.getKarteBean().getPatientModel().getPatientId()=null";
}
} else {
return "document.getKarteBean().getPatientModel()=null";
}
} else {
return "document.getKarteBean()=null";
}
}
/**
* 地域連携用の患者IDを返す。
* 実装ルール 施設内のIDであることを示す。
* <mmlCm:Id mmlCm:type="facility" mmlCm:tableId="JPN452015100001">12345</mmlCm:Id>
* @return
*/
public String getCNPatientId() {
return getPatientId();
}
/**
* 地域連携用の患者IDTypeを返す。
* 実装ルール facility
* @return
*/
public String getCNPatientIdType() {
return "facility";
}
/**
* 地域連携用の患者ID TableIdを返す。
* 実装ルール その施設のJMARIコード
* @return
*/
public String getCNPatientIdTableId() {
return getCNFacilityId();
}
/**
* 地域連携で使用する施設名を返す。
* @return 施設名
*/
public String getCNFacilityName() {
if (getUser()!=null) {
if (getUser().getFacilityModel()!=null) {
if (getUser().getFacilityModel().getFacilityName()!=null) {
return getUser().getFacilityModel().getFacilityName();
} else {
return "getUser().getFacilityModel().getFacilityName()=null";
}
} else {
return "getUser().getFacilityModel()=null";
}
} else {
return "getUser()=null";
}
}
/**
* 地域連携用の施設IDを返す。
* 実装ルール JMARIコードを適用する
* <mmlCm:Id mmlCm:type="JMARI" mmlCm:tableId="MML0027">JPN452015100001</mmlCm:Id>
* @return
*/
public String getCNFacilityId() {
// // TODO
// if (Project.getJoinAreaNetwork()) {
// return Project.getAreaNetworkFacilityId();
// }
// String jmari = Project.getString(Project.JMARI_CODE);
// return (jmari != null) ? jmari : getUser().getFacilityModel().getFacilityId();
if (getUser()!=null) {
if (getUser().getFacilityModel()!=null) {
if (getUser().getFacilityModel().getFacilityName()!=null) {
return getUser().getFacilityModel().getFacilityId();
} else {
return "getUser().getFacilityModel().getFacilityId()=null";
}
} else {
return "getUser().getFacilityModel()=null";
}
} else {
return "getUser()=null";
}
}
/**
* 地域連携用の施設ID Typeを返す。
* 実装ルール JMARI
* @return
*/
public String getCNFacilityIdType() {
return "JMARI";
}
/**
* 地域連携用の施設ID tableIdを返す。
* 実装ルール MML0027
* @return
*/
public String getCNFacilityIdTableId() {
return "MML0027";
}
/**
* 地域連携用のCreatorIdを返す。
* 実装ルール
* <mmlCm:Id mmlCm:type="local" mmlCm:tableId="MML0024">12345</mmlCm:Id>
* @return
*/
public String getCNCreatorId() {
// if (Project.getBoolean(Project.JOIN_AREA_NETWORK)) {
// return Project.getString(Project.AREA_NETWORK_CREATOR_ID);
// }
return getUser().getUserId();
}
/**
* 地域連携用のCreatorId Typeを返す。
* 実装ルール local
* @return
*/
public String getCNCreatorIdType() {
return "local";
}
/**
* 地域連携用のCreatorId TableIdを返す。
* 実装ルール MML0024
* @return
*/
public String getCNCreatorIdTableId() {
return "MML0024";
}
public String getCreatorName() {
return getUser().getCommonName();
}
public String getCreatorLicense() {
if (getUser()!=null) {
if (getUser().getLicenseModel()!=null) {
if (getUser().getLicenseModel().getLicense()!=null) {
return getUser().getLicenseModel().getLicense();
} else {
return "return getUser().getLicenseModel().getLicense()=null";
}
} else {
return "return getUser().getLicenseModel()=null";
}
} else {
return "return getUser()=null";
}
}
public String getPurpose() {
return getDocument().getDocInfoModel().getPurpose();
}
public String getTitle() {
return getDocument().getDocInfoModel().getTitle();
}
public String getDocId() {
return getDocument().getDocInfoModel().getDocId();
}
public String getParentId() {
return getDocument().getDocInfoModel().getParentId();
}
public String getParentIdRelation() {
return getDocument().getDocInfoModel().getParentIdRelation();
}
public String getGroupId() {
//return getDocument().getDocInfoModel().getDocId();
// 共通使用
String uuid = UUID.randomUUID().toString();
return uuid.replaceAll("-", "");
}
public String getClaimDocId() {
String uuid = UUID.randomUUID().toString();
return uuid.replaceAll("-", "");
}
public String getConfirmDate() {
return ModelUtils.getDateTimeAsString(getDocument().getDocInfoModel().getConfirmDate());
}
public String getFirstConfirmDate() {
return ModelUtils.getDateTimeAsString(getDocument().getDocInfoModel().getFirstConfirmDate());
}
public List<SchemaModel> getSchema() {
return schemas;
}
public List<AccessRightModel> getAccessRights() {
return accessRights;
}
/**
* 経過記録モジュールの自由記載表現を返す。
* @return
*/
public String getFreeExpression() {
String ret = freeExp.toString();
ret = ret.trim();
ret = ret.replaceAll("\n", "<xhtml:br/>");
debug(ret);
return ret;
}
/**
* soaSpec 及び pSpecをパースし xhtml の自由記載表現に変換する。
*/
private void parse(String spec) {
try {
BufferedReader reader = new BufferedReader(new StringReader(spec));
SAXBuilder docBuilder = new SAXBuilder();
Document doc = docBuilder.build(reader);
Element root = doc.getRootElement();
debug(root.toString());
parseChildren(root);
reader.close();
} catch (JDOMException | IOException e) {
e.printStackTrace(System.err);
}
}
/**
* 子要素を再帰的にパースする。
*/
private void parseChildren(Element current) {
// 対象Elementの子をリストする
List children = current.getChildren();
// Leaf ならリターンする
if (children==null || children.isEmpty()) {
return;
}
// 子をイテレートする
for (Iterator iterator = children.iterator(); iterator.hasNext();) {
Element child = (Element) iterator.next();
//String qname = child.getQualifiedName();
String ename = child.getName();
//Namespace ns = child.getNamespace();
//debug(ename);
if (ename.equals("paragraph")) {
// 段落単位に<xhtml:br/>をつける
// 次の段落用にビルダを新たに生成する
if (paragraphBuilder != null) {
freeExp.append(paragraphBuilder.toString());
freeExp.append("<xhtml:br/>\n");
}
paragraphBuilder = new StringBuilder();
} else if (ename.equals("content")) {
// 取得するものなし
} else if (ename.equals("component")) {
String name = child.getAttributeValue("name");
int number = Integer.parseInt(child.getAttributeValue("component"));
if (name.equals("schemaHolder")) {
// Schema の場合はextRefに変換する
paragraphBuilder.append(getSchemaInfo(schemas.get(number)));
} else if (name.equals("stampHolder")) {
// オーダの場合は<br>でtoString()
//paragraphBuilder.append(getStampInfo(pModules.get(number)));
}
} else if (ename.equals("text")) {
// 意味があるかも知れないのでtrim()しない
//paragraphBuilder.append(child.getTextTrim());
paragraphBuilder.append(child.getText());
}
// 再帰する
parseChildren(child);
}
}
/**
* Schema の extRef Info を返す。
*/
private String getSchemaInfo(SchemaModel schema) {
String contentType = schema.getExtRefModel().getContentType();
String medicalRole = schema.getExtRefModel().getMedicalRole();
String title = schema.getExtRefModel().getTitle();
String href = schema.getExtRefModel().getHref();
StringBuilder sb = new StringBuilder();
sb.append("<mmlCm:extRef");
sb.append(" mmlCm:contentType=");
sb.append(addQuote(contentType));
sb.append(" mmlCm:medicalRole=");
sb.append(addQuote(medicalRole));
sb.append(" mmlCm:title=");
sb.append(addQuote(title));
sb.append(" mmlCm:href=");
sb.append(addQuote(href));
sb.append(" />");
return sb.toString();
}
/**
* スタンプの文字列表現を返す。
*/
private String getStampInfo(ModuleModel module) {
IInfoModel obj = module.getModel();
StringBuilder buf = new StringBuilder();
if (obj instanceof BundleMed) {
BundleMed med = (BundleMed) obj;
buf.append("RP<xhtml:br/>\n");
ClaimItem[] items = med.getClaimItem();
for (ClaimItem item : items) {
buf.append("・");
buf.append(item.getName());
buf.append(" ");
if (item.getNumber() != null) {
buf.append(item.getNumber());
if (item.getUnit() != null) {
buf.append(item.getUnit());
}
}
buf.append("<xhtml:br/>\n");
}
if (med.getAdmin().startsWith("内服")) {
buf.append(med.getAdmin().substring(0,2));
buf.append(" ");
buf.append(med.getAdmin().substring(4));
} else {
buf.append(med.getAdmin());
}
buf.append(" x ");
buf.append(med.getBundleNumber());
// FIXME
if (med.getAdmin().startsWith("内服")) {
if (med.getAdmin().charAt(3) == '回') {
buf.append(" 日分");
}
}
buf.append("<xhtml:br/>\n");
// Print admMemo
if (med.getAdminMemo() != null) {
buf.append(med.getAdminMemo());
buf.append("<xhtml:br/>\n");
}
// Print admMemo
if (med.getMemo() != null) {
buf.append(med.getMemo());
buf.append("<xhtml:br/>\n");
}
}
else if (obj instanceof BundleDolphin) {
BundleDolphin bundle = (BundleDolphin) obj;
// Print order name
buf.append(bundle.getOrderName());
buf.append("<xhtml:br/>\n");
ClaimItem[] items = bundle.getClaimItem();
for (ClaimItem item : items) {
// Print item name
buf.append("・");
buf.append(item.getName());
// Print item number
String number = item.getNumber();
if (number != null) {
buf.append(" ");
buf.append(number);
if (item.getUnit() != null) {
buf.append(item.getUnit());
}
}
buf.append("<xhtml:br/>\n");
}
// Print bundleNumber
if (! bundle.getBundleNumber().equals("1")) {
buf.append("X ");
buf.append(bundle.getBundleNumber());
buf.append("<xhtml:br/>\n");
}
// Print admMemo
if (bundle.getAdminMemo() != null) {
buf.append(bundle.getAdminMemo());
buf.append("<xhtml:br/>\n");
}
// Print bundleMemo
if (bundle.getMemo() != null) {
buf.append(bundle.getMemo());
buf.append("<xhtml:br/>\n");
}
}
return buf.toString();
}
public List<ClaimBundle> getClaimBundle() {
return (bundle.size()>0) ? bundle : null;
}
public String getGenerationPurpose() {
return document.getDocInfoModel().getPurpose();
}
public String getCreatorId() {
return getUser().getUserId();
}
public String getFacilityName() {
return getUser().getFacilityModel().getFacilityName();
}
public String getJmariCode() {
return getUser().getFacilityModel().getFacilityId();
}
public String getCreatorDeptDesc() {
return getUser().getDepartmentModel().getDepartmentDesc();
}
public String getCreatorDept() {
return getUser().getDepartmentModel().getDepartment();
}
public String getHealthInsuranceGUID() {
return document.getDocInfoModel().getHealthInsuranceGUID();
}
public String getHealthInsuranceClassCode() {
return document.getDocInfoModel().getHealthInsurance();
}
public String getHealthInsuranceDesc(){
return document.getDocInfoModel().getHealthInsuranceDesc();
}
private String addQuote(String str) {
StringBuilder buf = new StringBuilder();
buf.append("\"");
buf.append(str);
buf.append("\"");
return buf.toString();
}
private void debug(String msg) {
if (DEBUG) {
System.out.println(msg);
}
}
}