package open.dolphin.delegater; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.ws.rs.client.Entity; import javax.ws.rs.core.Response; import open.dolphin.converter.*; import open.dolphin.infomodel.*; import org.codehaus.jackson.map.ObjectMapper; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; /** * Stamp関連の Delegater クラス。 * * @author Kazushi Minagawa, Digital Globe, Inc. */ public final class StampDelegater extends BusinessDelegater { private static final StampDelegater instance; static { instance = new StampDelegater(); } private static final String RES_STAMP_TREE = "/stamp/tree"; private static final String RES_TREE_SYNC = "/stamp/tree/sync"; private static final String RES_TREE_FORCE_SYNC = "/stamp/tree/forcesync"; public static StampDelegater getInstance() { return instance; } /** * StampTree を保存/更新する。 * @param model 保存する StampTree * @return treeのPK * @throws java.lang.Exception */ public long putTree(IStampTreeModel model) throws Exception { // Converter model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); // UTF-8 bytes StampTreeModelConverter conv = new StampTreeModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT //String entityStr = putEasyJson(RES_STAMP_TREE, data, String.class); String entityStr = putEasyStampTree(RES_STAMP_TREE, data, String.class); // PK return Long.parseLong(entityStr); } /** * 現在のuserTreeとDBを同期化する。 * @param model StampTree * @return primaryPKとversionNumberのカンマ連結 * @throws Exception */ public String syncTree(IStampTreeModel model) throws Exception { // Converter model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); // UTF-8 bytes StampTreeModelConverter conv = new StampTreeModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(RES_TREE_SYNC, data, String.class); // What? return entityStr; } public void forceSyncTree(IStampTreeModel model) throws Exception { // Converter model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); // UTF-8 bytes StampTreeModelConverter conv = new StampTreeModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT ResteasyWebTarget target = getWebTarget(RES_TREE_FORCE_SYNC); Response response = target.request().put(Entity.json(data)); response.close(); } public List<IStampTreeModel> getTrees(long userPK) throws Exception { // PATH StringBuilder sb = new StringBuilder(); sb.append(RES_STAMP_TREE).append("/").append(userPK); String path = sb.toString(); // GET StampTreeHolder h = getEasyJson(path, StampTreeHolder.class); // return List List<IStampTreeModel> retList = new ArrayList<>(); // 個人用のtree if (h.getPersonalTree()!=null) { StampTreeModel model = h.getPersonalTree(); String treeXml = new String(model.getTreeBytes(), UTF8); model.setTreeXml(treeXml); model.setTreeBytes(null); retList.add((IStampTreeModel)model); } // import(subscribed)している tree if (h.getSubscribedList()!=null) { List<PublishedTreeModel> inList = h.getSubscribedList(); for (PublishedTreeModel model : inList) { String treeXml = new String(model.getTreeBytes(), UTF8); model.setTreeXml(treeXml); model.setTreeBytes(null); retList.add((IStampTreeModel)model); } } return retList; } /** * 既に保存されている個人用のTreeを公開する。 * @param model 既に保存されている個人用のTreeで公開するもの * @param publishBytes * @return 公開数 * @throws java.lang.Exception */ public String publishTree(StampTreeModel model, byte[] publishBytes) throws Exception { // PATH StringBuilder sb = new StringBuilder(); sb.append("/stamp/published/tree"); String path = sb.toString(); // Model model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); PublishedTreeModel publishedModel = createPublishedTreeModel(model, publishBytes); // Holder StampTreeHolder h = new StampTreeHolder(); h.setPersonalTree(model); h.addSubscribedTree(publishedModel); // Converter StampTreeHolderConverter conv = new StampTreeHolderConverter(); conv.setModel(h); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); // What? return entityStr; } /** * 公開されているTreeを更新する。 * @param model 更新するTree * @param publishBytes * @return 更新数 * @throws java.lang.Exception */ public String updatePublishedTree(StampTreeModel model, byte[] publishBytes) throws Exception { // PATH StringBuilder sb = new StringBuilder(); sb.append("/stamp/published/tree"); String path = sb.toString(); // Model model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); PublishedTreeModel publishedModel = createPublishedTreeModel(model, publishBytes); // Holder StampTreeHolder h = new StampTreeHolder(); h.setPersonalTree(model); h.addSubscribedTree(publishedModel); // Converter StampTreeHolderConverter conv = new StampTreeHolderConverter(); conv.setModel(h); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); // What? return entityStr; } /** * 公開されているTreeを削除する。 * @param model * @return 削除数 * @throws java.lang.Exception */ public String cancelPublishedTree(StampTreeModel model) throws Exception { // PATH String path = "/stamp/published/cancel"; // Model model.setTreeBytes(model.getTreeXml().getBytes(UTF8)); // Converter StampTreeModelConverter conv = new StampTreeModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); return entityStr; } public List<PublishedTreeModel> getPublishedTrees() throws Exception { // PATH String path = "/stamp/published/tree"; // GET PublishedTreeList result = getEasyJson(path, PublishedTreeList.class); // List return result.getList(); } // 個人用StampTreeから公開用StampTreeを生成する。 // byte[] publishBytes は公開されるカテゴリのみを含むサブセットバイト private PublishedTreeModel createPublishedTreeModel(StampTreeModel model, byte[] publishBytes) { PublishedTreeModel publishedModel = new PublishedTreeModel(); publishedModel.setId(model.getId()); // pk publishedModel.setUserModel(model.getUserModel()); // UserModel publishedModel.setName(model.getName()); // 名称 publishedModel.setPublishType(model.getPublishType()); // 公開タイプ publishedModel.setCategory(model.getCategory()); // カテゴリ publishedModel.setPartyName(model.getPartyName()); // パーティー名 publishedModel.setUrl(model.getUrl()); // URL publishedModel.setDescription(model.getDescription()); // 説明 publishedModel.setPublishedDate(model.getPublishedDate()); // 公開日 publishedModel.setLastUpdated(model.getLastUpdated()); // 更新日 publishedModel.setTreeBytes(publishBytes); // XML bytes return publishedModel; } //--------------------------------------------------------------------------- public List<Long> subscribeTrees(List<SubscribedTreeModel> subscribeList) throws Exception { // PATH String path = "/stamp/subscribed/tree"; // Wrapper SubscribedTreeList wrapper = new SubscribedTreeList(); wrapper.setList(subscribeList); // Converter SubscribedTreeListConverter conv = new SubscribedTreeListConverter(); conv.setModel(wrapper); // JSON ObjectMapper mapper = this.getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); // PK List String[] pks = entityStr.split(","); List<Long> ret = new ArrayList<>(pks.length); for (String str : pks) { ret.add(Long.parseLong(str)); } return ret; } public int unsubscribeTrees(List<SubscribedTreeModel> removeList) throws Exception { // PATH StringBuilder sb = new StringBuilder(); sb.append("/stamp/subscribed/tree/"); for (SubscribedTreeModel s : removeList) { sb.append(String.valueOf(s.getTreeId())); sb.append(CAMMA); sb.append(String.valueOf(s.getUserModel().getId())); sb.append(CAMMA); } String path = sb.toString(); path = path.substring(0, path.length()-1); // DELETE deleteEasy(path); // Count return 1; } //--------------------------------------------------------------------------- /** * Stampを保存する。 * @param list * @return 保存件数 * @throws java.lang.Exception */ public List<String> putStamp(List<StampModel> list) throws Exception { // PATH String path = "/stamp/list"; // Wrapper StampList wrapper = new StampList(); wrapper.setList(list); // Converter StampListConverter conv = new StampListConverter(); conv.setModel(wrapper); // JSON ObjectMapper mapper = getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); String[] params = entityStr.split(","); List<String> ret = new ArrayList<>(); ret.addAll(Arrays.asList(params)); return ret; } /** * Stampを保存する。 * @param model StampModel * @return 保存件数 * @throws java.lang.Exception */ public String putStamp(StampModel model) throws Exception { // PATH String path = "/stamp/id"; // Convereter StampModelConverter conv = new StampModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); return entityStr; } /** * Stampを置き換える。 * @param model * @return * @throws Exception */ public String replaceStamp(StampModel model) throws Exception { // PATH String path = "/stamp/id"; // Converter StampModelConverter conv = new StampModelConverter(); conv.setModel(model); // JSON ObjectMapper mapper = getSerializeMapper(); byte[] data = mapper.writeValueAsBytes(conv); // PUT String entityStr = putEasyJson(path, data, String.class); return entityStr; } /** * Stampを取得する。 * @param stampId 取得する StampModel の id * @return StampModel * @throws java.lang.Exception */ public StampModel getStamp(String stampId) throws Exception { // PATH String path = "/stamp/id/" + stampId; // GET StampModel ret = getEasyJson(path, StampModel.class); return ret; } /** * Stampを取得する。 * @param list * @return StampModel * @throws java.lang.Exception */ public List<StampModel> getStamp(List<ModuleInfoBean> list) throws Exception { // PATH StringBuilder sb = new StringBuilder(); for (ModuleInfoBean info : list) { sb.append(info.getStampId()); sb.append(","); } String ids = sb.toString(); ids = ids.substring(0, ids.length()-1); String path = "/stamp/list/" + ids; // GET StampList result = getEasyJson(path, StampList.class); // List return result.getList(); } /** * Stampを削除する。 * @param stampId 削除する StampModel の id * @return 削除件数 * @throws java.lang.Exception */ public int removeStamp(String stampId) throws Exception { // PATH String path = "/stamp/id/" + stampId; // DELETE deleteEasy(path); // Count return 1; } /** * Stampを削除する。 * @param ids * @return 削除件数 * @throws java.lang.Exception */ public int removeStamp(List<String> ids) throws Exception { // PATH StringBuilder sb = new StringBuilder(); for (String s : ids) { sb.append(s); sb.append(","); } String idList = sb.toString(); idList = idList.substring(0, idList.length()-1); String path = "/stamp/list/" + idList; // DELETE deleteEasy(path); // Count return ids.size(); } }