package open.dolphin.impl.mml; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import open.dolphin.client.ClientContext; import open.dolphin.client.MainWindow; import open.dolphin.client.MmlMessageEvent; import open.dolphin.client.MmlMessageListener; import open.dolphin.infomodel.SchemaModel; import open.dolphin.project.Project; import org.apache.log4j.Logger; /** * MML 送信サービス。 * * @author Kazushi Minagawa, Digital Globe, Inc. */ public class SendMmlImpl implements MmlMessageListener { // CSGW への書き込みパス // CSGW = Client Side Gateway private String csgwPath; // MML Encoding private String encoding; // Work Queue private final LinkedList queue = new LinkedList(); private Kicker kicker; private Thread sendThread; private MainWindow context; private String name; /** Creates new SendMmlService */ public SendMmlImpl() { } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public MainWindow getContext() { return context; } @Override public void setContext(MainWindow context) { this.context = context; } @Override public String getCSGWPath() { return csgwPath; } @Override public void setCSGWPath(String val) { csgwPath = val; try { Path path = Paths.get(csgwPath); Files.createDirectories(path); } catch (Exception e) { java.util.logging.Logger.getLogger(this.getClass().getName()).warning("MMLファイル出力先のディレクトリを作成できません。"); } } @Override public void stop() { if (sendThread!=null) { Thread moribund = sendThread; sendThread = null; moribund.interrupt(); } logDump(); } @Override public void start() { // CSGW 書き込みパスを設定する setCSGWPath(Project.getCSGWPath()); encoding = "UTF-8"; //Project.getString(Project.MML_ENCODING); // 送信スレッドを開始する kicker = new Kicker(); sendThread = new Thread(kicker); sendThread.start(); java.util.logging.Logger.getLogger(this.getClass().getName()).info("Send MML statered with CSGW = " + getCSGWPath()); } @Override public void mmlMessageEvent(MmlMessageEvent e) { synchronized (queue) { queue.add(e); queue.notify(); } } private Object getMML() throws InterruptedException { synchronized(queue) { while (queue.isEmpty()) { queue.wait(); } } return queue.remove(0); } public void logDump() { synchronized(queue) { Iterator iter = queue.iterator(); while (iter.hasNext()) { MmlMessageEvent evt = (MmlMessageEvent) iter.next(); java.util.logging.Logger.getLogger(this.getClass().getName()).warning(evt.getMmlInstance()); } queue.clear(); } } protected String getCSGWPathname(String fileName, String ext) { StringBuilder buf = new StringBuilder(); buf.append(csgwPath); buf.append(File.separator); buf.append(fileName); buf.append("."); buf.append(ext); return buf.toString(); } protected class Kicker implements Runnable { @Override public void run() { Thread thisThread = Thread.currentThread(); //BufferedOutputStream writer; while (thisThread == sendThread) { try { // MML パッケージを取得 MmlMessageEvent mevt = (MmlMessageEvent) getMML(); //getLogger().debug("MMLファイルをコンシュームしました"); String groupId = mevt.getGroupId(); String instance = mevt.getMmlInstance(); List<SchemaModel> schemas = mevt.getSchema(); String filename = groupId+".xml.tmp"; Path dest = Paths.get(getCSGWPath(),filename); Files.write(dest, instance.getBytes(encoding)); Files.move(dest, dest.resolveSibling(groupId+".xml")); if (schemas != null) { for (SchemaModel schema : schemas) { filename = schema.getExtRefModel().getHref()+".tmp"; dest = Paths.get(getCSGWPath(),filename); Files.write(dest, schema.getJpegByte()); Files.move(dest, dest.resolveSibling(schema.getExtRefModel().getHref())); } } } catch (IOException e) { e.printStackTrace(System.err); java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage()); } catch (InterruptedException ie) { java.util.logging.Logger.getLogger(this.getClass().getName()).warning("Interrupted sending MML"); } } } } }