package open.dolphin.impl.mml;
import java.io.*;
import open.dolphin.client.Chart;
import open.dolphin.client.ClientContext;
import open.dolphin.client.IKarteSender;
import open.dolphin.client.MmlMessageEvent;
import open.dolphin.client.MmlMessageListener;
import open.dolphin.infomodel.DocumentModel;
import open.dolphin.project.Project;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
/**
*
* @author Kazushi Minagawa. Digital Globe, Inc.
*/
public class MMLSender implements IKarteSender {
private Chart context;
private MmlMessageListener mmlListener;
@Override
public Chart getContext() {
return context;
}
@Override
public void setContext(Chart context) {
this.context = context;
}
@Override
public void prepare(DocumentModel data) {
if (data.getDocInfoModel().isSendMml()) {
mmlListener = context.getMMLListener();
}
}
@Override
public void send(DocumentModel model) {
if ((!model.getDocInfoModel().isSendMml()) || mmlListener==null) {
return;
}
// MML Message を生成する
MMLHelper23 mb = new MMLHelper23();
mb.setDocument(model);
mb.setUserModel(Project.getUserModel());
mb.setPatientId(context.getPatient().getPatientId());
mb.buildText();
// 患者情報
PatientHelper ph = new PatientHelper();
ph.setPatient(getContext().getPatient());
ph.setFacility(Project.getUserModel().getFacilityModel().getFacilityName());
try {
VelocityContext vct = ClientContext.getVelocityContext();
vct.put("mmlHelper", mb);
vct.put("patientHelper", ph);
// このスタンプのテンプレートファイルを得る
String templateFile = "mml2.3Helper.vm";
// Merge する
StringWriter sw = new StringWriter();
BufferedWriter bw = new BufferedWriter(sw);
InputStream instream = ClientContext.getTemplateAsStream(templateFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
Velocity.evaluate(vct, bw, "mml", reader);
bw.flush();
bw.close();
reader.close();
String mml = sw.toString();
//System.err.println(mml);
// debug出力を行う
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(mml);
MmlMessageEvent mevt = new MmlMessageEvent(this);
mevt.setGroupId(mb.getDocId());
mevt.setMmlInstance(mml);
if (mb.getSchema() != null) {
mevt.setSchema(mb.getSchema());
}
mmlListener.mmlMessageEvent(mevt);
if (Project.getBoolean(Project.JOIN_AREA_NETWORK)) {
// TODO
}
} catch (ParseErrorException | MethodInvocationException | ResourceNotFoundException | IOException e) {
e.printStackTrace(System.err);
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage());
}
}
}