package com.vci.server.omd.qt.delegate; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.hibernate.SQLQuery; import org.hibernate.Session; import com.vci.common.exception.VciExceptionTool; import com.vci.common.log.ServerWithLog4j; import com.vci.corba.common.VCIError; import com.vci.corba.omd.qtm.QTD; import com.vci.corba.omd.qtm.QTInfo; import com.vci.server.base.exception.ExceptionLocalHandler; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.omd.qt.cache.QTDServerCacheUtil; import com.vci.server.omd.qt.dao.impl.QTDaoImpl; import com.vci.server.omd.qt.entity.QTEntity; import com.zeroc.Ice.Current; public class QTDServiceDelegate { private DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); //private Date date = Calendar.getInstance().getTime(); private static QTDServiceDelegate instance = null; public static QTDServiceDelegate getInstance() { if (instance == null) { instance = new QTDServiceDelegate(); } return instance; } private VCIError getLocalVciError(String key, Throwable e) { VCIError error = new VCIError(key, new String[]{VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e)}); VCIError rsError = ExceptionLocalHandler.getInstance().getLocalString(error, "PLMOQ"); return rsError; } /** * 保存查询模板到数据库 */ public boolean saveQT(QTInfo qtWrapper)throws VCIError { try{ if ( this.isExistsQT(qtWrapper.qtName) ) new QTDaoImpl().update(getQTEntity(qtWrapper)); else new QTDaoImpl().save(getQTEntity(qtWrapper)); QTDServerCacheUtil.setQTemplate(qtWrapper); }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00003", e); } return true; } public boolean bacthSaveQT(QTInfo[] qtWrappers)throws VCIError { try{ QTDaoImpl impl = new QTDaoImpl(); List list = new ArrayList(); int batchCount = 200; for (int i = 0; i < qtWrappers.length; i++) { if (this.isExistsQT(qtWrappers[i].qtName)) { list.add(getQTEntity(qtWrappers[i])); } else { list.add(getQTEntity(qtWrappers[i])); } if ((i + 1) % batchCount == 0) { impl.saveOrUpdateAll(list); list = new ArrayList(); } } impl.saveOrUpdateAll(list); }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00003", e); } return true; } /** * 从数据库获取查询模板 */ public QTInfo[] getObjTypeQTs(String typeName) throws VCIError { return QTDServerCacheUtil.getObjTypeQTs(typeName); // List qtWrapperList = new ArrayList(); // try{ // List qtEntites = new QTDaoImpl().findEntities("from QTemplate where btmName = '" + typeName + "'"); // for(QTemplate qtEntity : qtEntites){ // QTInfo qtWrapper = getQTWrapper(qtEntity); // qtWrapperList.add(qtWrapper); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00004", e); // } // return qtWrapperList.toArray(new QTInfo[0]); } /** * 从数据库获取查询模板 */ // public QTInfo[] getAllBizTypeQTDs() throws VCIError { // List qtWrapperList = new ArrayList(); // try{ // List qtEntites = new QTDaoImpl().findEntities("from QTemplate where btmName is not null"); // for(QTemplate qtEntity : qtEntites){ // QTInfo qtWrapper = getQTWrapper(qtEntity); // qtWrapperList.add(qtWrapper); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00004", e); // } // return qtWrapperList.toArray(new QTInfo[0]); // } /** * 检查名字是否存在 */ public boolean isExistsQT(String name) throws VCIError { return QTDServerCacheUtil.isExistsQT(name); // try{ // String sql = "select count(qtName) from PL_QTEMPLATE where qtName = ?"; // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, name); // List list = query.list(); // int count = ((BigDecimal)list.get(0)).intValue(); // if(count > 0){ // return true; // }else{ // return false; // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00005", e); // } // } /** * 删除查询模板 */ public boolean deleteQTS(String[] qtNames) throws VCIError { try{ StringBuilder names = new StringBuilder(); for(int i = 0; i < qtNames.length; i++){ names.append("'"); names.append(qtNames[i]); names.append("'"); if(i < qtNames.length - 1){ names.append(", "); } } StringBuilder sql = new StringBuilder("delete from PL_QTEMPLATE where qtName in ("); sql.append(names.toString()); sql.append(")"); Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql.toString()); query.executeUpdate(); for (String name : qtNames) { QTDServerCacheUtil.delQTemplate(name); } return true; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00006", e); } } /** * 根据查询模板名获取查询模板 */ public QTInfo getQT(String qtName) throws VCIError { return QTDServerCacheUtil.getQTemplate(qtName); // QTInfo qtWrapper = new QTInfo(); // try{ // QTemplate qtEntity = new QTDaoImpl().getById(qtName); // if(qtEntity != null){ // qtWrapper = getQTWrapper(qtEntity); // } //// System.out.println("sss---------------------"); //// qtWrapper = QTServerCacheUtil.getInstance().getQtById(qtName); // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00004", e); // } // return qtWrapper; } /** * QTEntity --〉 QTInfo * @param qtEntity * @return */ private QTInfo getQTWrapper(QTEntity qtEntity){ if(qtEntity == null){ return null; } QTInfo qtWrapper = new QTInfo(); qtWrapper.qtName = qtEntity.getQtName(); qtWrapper.btmName = qtEntity.getBtmName(); qtWrapper.creator = qtEntity.getCreator(); qtWrapper.createTime = qtEntity.getCreateTime().getTime(); qtWrapper.levelFlag = qtEntity.getLevelFlag(); String qtUIText = qtEntity.getQtUIText(); qtWrapper.qtUIText = (qtUIText == null ? "" : qtUIText); String qtText = qtEntity.getQtText(); qtWrapper.qtText = (qtText == null ? "" : qtText); return qtWrapper; } /** * QTInfo --〉 QTemplate * @param qtWrapper * @return */ private QTEntity getQTEntity(QTInfo qtWrapper){ if(qtWrapper == null){ return null; } QTEntity qtEntity = new QTEntity(); qtEntity.setQtName(qtWrapper.qtName); qtEntity.setBtmName(qtWrapper.btmName); qtEntity.setCreator(qtWrapper.creator); Date date = Calendar.getInstance().getTime(); qtEntity.setCreateTime(date); qtEntity.setLevelFlag(qtWrapper.levelFlag); qtEntity.setQtUIText(qtWrapper.qtUIText); qtEntity.setQtText(qtWrapper.qtText); return qtEntity; } /** * 更新QT将qtUIText和qtText变更为CLOB字段 */ public boolean updateQT() throws VCIError { String sql = "select * from PL_QTEMPLATE"; QTDaoImpl qtDaoImpl = new QTDaoImpl(); try{ Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); List list = query.list(); for(int i = 0; i < list.size(); i++){ QTInfo qtWrapper = new QTInfo(); Object[] obj = (Object[]) list.get(i); qtWrapper.qtName = (String)obj[0]; qtWrapper.btmName = (String)obj[1]; qtWrapper.creator = (String)obj[2]; qtWrapper.createTime = ((Date)obj[3]).getTime(); qtWrapper.levelFlag = ((BigDecimal)obj[4]).shortValue(); qtWrapper.qtUIText = ((String)obj[5] == null ? "" : (String)obj[5]); qtWrapper.qtText = (String)obj[6]; qtDaoImpl.save(getQTEntity(qtWrapper)); QTDServerCacheUtil.setQTemplate(qtWrapper); } }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00013", e); } return true; } /** * 保存查询模板到数据库 */ // public boolean saveQT(QTInfo qtWrapper, Current current)throws VCIError { // String sql = "insert into PL_QTEMPLATE values(?, ?, ?, to_date(?, 'yyyy-MM-dd'), ?, ?, ?)"; // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, qtWrapper.qtName); // query.setString(1, qtWrapper.btmName); // query.setString(2, qtWrapper.creator); // //CreateTime 应取服务器时间 // qtWrapper.createTime = dFormat.format(date); // query.setString(3, qtWrapper.createTime); // query.setInteger(4, qtWrapper.levelFlag); // query.setString(5, qtWrapper.qtUIText); // query.setString(6, qtWrapper.qtText); // query.executeUpdate(); // // QTServerCacheUtil.setQTemplate(qtWrapper); // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00003", e); // } // return true; // } /** * 从数据库获取查询模板 */ public QTInfo[] getQTS(String btmName, Current current) throws VCIError { QTInfo[] qts = QTDServerCacheUtil.getAllQTemplate(); List lstQT = new ArrayList(); for (QTInfo qt : qts) { if (qt.btmName.equalsIgnoreCase(btmName)) lstQT.add(qt); } return lstQT.toArray(new QTInfo[0]); // String sql = "select * from PL_QTEMPLATE where btmName = ?"; // List qtWrapperList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, btmName); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTInfo qtWrapper = new QTInfo(); // Object[] obj = (Object[]) list.get(i); // qtWrapper.qtName = (String)obj[0]; // qtWrapper.btmName = (String)obj[1]; // qtWrapper.creator = (String)obj[2]; // qtWrapper.createTime = dFormat.format((Date)obj[3]); // qtWrapper.levelFlag = ((BigDecimal)obj[4]).shortValue(); // qtWrapper.qtUIText = ((String)obj[5] == null ? "" : (String)obj[5]); // qtWrapper.qtText = (String)obj[6]; // qtWrapperList.add(qtWrapper); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00004", e); // } // return qtWrapperList.toArray(new QTInfo[0]); } /** * 检查名字是否存在 */ public boolean isExists(String name, Current current) throws VCIError { return QTDServerCacheUtil.isExistsQT(name); // try{ // String sql = "select count(qtName) from PL_QTEMPLATE where qtName = ?"; // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, name); // List list = query.list(); // int count = ((BigDecimal)list.get(0)).intValue(); // if(count > 0){ // return true; // }else{ // return false; // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00005", e); // } // } /** * 删除查询模板 */ // public boolean deleteQTS(String[] qtNames, Current current) throws VCIError { // try{ // StringBuilder sql = new StringBuilder("delete from PL_QTEMPLATE where qtName in ("); // StringBuilder names = new StringBuilder(); // for(int i = 0; i < qtNames.length; i++){ // names.append("'"); // names.append(qtNames[i]); // names.append("'"); // if(i < qtNames.length - 1){ // names.append(", "); // } // } // // sql.append(names.toString()); // sql.append(")"); // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql.toString()); // query.executeUpdate(); // // for (String name : qtNames) { // QTServerCacheUtil.delQTemplate(name); // } // // return true; // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00006", e); // } // // } /** * 根据查询模板名获取查询模板 */ // public QTInfo getQT(String qtName, Current current) throws VCIError { // return QTServerCacheUtil.getQTemplate(qtName); //// String sql = "select * from PL_QTEMPLATE where qtName = ?"; //// QTInfo qtWrapper = new QTInfo(); //// try{ //// Session session = HibernateSessionFactory.getSession(); //// SQLQuery query = session.createSQLQuery(sql); //// query.setString(0, qtName); //// List list = query.list(); //// if(list.size() > 0){ //// Object[] obj = (Object[]) list.get(0); //// qtWrapper.qtName = (String)obj[0]; //// qtWrapper.btmName = (String)obj[1]; //// qtWrapper.creator = (String)obj[2]; //// qtWrapper.createTime = dFormat.format((Date)obj[3]); //// qtWrapper.levelFlag = ((BigDecimal)obj[4]).shortValue(); //// qtWrapper.qtUIText = ((String)obj[5] == null ? "" : (String)obj[5]); //// qtWrapper.qtText = (String)obj[6]; //// } //// }catch(Throwable e){ //// e.printStackTrace(); //// throw getLocalVciError("P0010QT-00004", e); //// } //// return qtWrapper; // } // public boolean updateQT(Current current) throws VCIError { // // TODO Auto-generated method stub // return false; // } //add by zhangweiwei 2014/12/09 start /** * 从数据库获取查询模板 */ public QTInfo[] getAllQTS() throws VCIError { return QTDServerCacheUtil.getAllQTemplate(); // List qtWrapperList = new ArrayList(); // try{ // List qtEntites = new QTDaoImpl().findEntities("from QTemplate"); // for(QTemplate qtEntity : qtEntites){ // QTInfo qtWrapper = getQTWrapper(qtEntity); // qtWrapperList.add(qtWrapper); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("P0010QT-00004", e); // } // return qtWrapperList.toArray(new QTInfo[0]); } //add by zhangweiwei 2014/12/09 end public QTD[] getAllLinkQTDS() throws VCIError { QTD[] qtds = QTDServerCacheUtil.getAllQTD(); List lstQTD = new ArrayList(); for (QTD qtd : qtds) { if (StringUtils.isNotBlank(qtd.linkTypeName)) lstQTD.add(qtd); } return lstQTD.toArray(new QTD[0]); // String sql = "select * from PL_QTEMPLATEDEF t where t.linkTypeName is not null"; // List qtdList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTD qtd = new QTD(); // Object[] obj = (Object[]) list.get(i); // qtd.name = (String)obj[0]; // qtd.creator = (String)obj[1]; // qtd.createTime = dFormat.format((Date)obj[2]); // qtd.btmName = (String)obj[3] == null ? "" : (String)obj[3]; // String abNames = ((String)obj[4]); // if(abNames == null || abNames.equals("")){ // qtd.abNames = new String[0]; // }else{ // qtd.abNames = ((String)obj[4]).split(","); // } // qtd.linkTypeName = (String)obj[5]; // qtdList.add(qtd); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("PLMQTD-00003", e); // } // return qtdList.toArray(new QTD[0]); } public QTD[] getAllBTMQTDS() throws VCIError { QTD[] qtds = QTDServerCacheUtil.getAllQTD(); List lstQTD = new ArrayList(); for (QTD qtd : qtds) { if (StringUtils.isNotBlank(qtd.btmName)) lstQTD.add(qtd); } return lstQTD.toArray(new QTD[0]); // String sql = "select * from PL_QTEMPLATEDEF t where t.btmName is not null"; // List qtdList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTD qtd = new QTD(); // Object[] obj = (Object[]) list.get(i); // qtd.name = (String)obj[0]; // qtd.creator = (String)obj[1]; // qtd.createTime = dFormat.format((Date)obj[2]); // qtd.btmName = (String)obj[3] == null ? "" : (String)obj[3]; // String abNames = ((String)obj[4]); // if(abNames == null || abNames.equals("")){ // qtd.abNames = new String[0]; // }else{ // qtd.abNames = ((String)obj[4]).split(","); // } // qtd.linkTypeName = (String)obj[5] == null ? "" : (String)obj[5]; // qtdList.add(qtd); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("PLMQTD-00003", e); // } // return qtdList.toArray(new QTD[0]); } public QTD[] getAllQTD() { return QTDServerCacheUtil.getAllQTD(); // // String sql = "select * from PL_QTEMPLATEDEF t where 1=1"; // List qtdList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTD qtd = new QTD(); // Object[] obj = (Object[]) list.get(i); // qtd.name = (String)obj[0]; // qtd.creator = (String)obj[1]; // qtd.createTime = dFormat.format((Date)obj[2]); // qtd.btmName = (String)obj[3] == null ? "" : (String)obj[3]; // String abNames = ((String)obj[4]); // if(abNames == null || abNames.equals("")){ // qtd.abNames = new String[0]; // }else{ // qtd.abNames = ((String)obj[4]).split(","); // } // qtd.linkTypeName = (String)obj[5] == null ? "" : (String)obj[5]; // qtdList.add(qtd); // } // }catch(Throwable e){ // e.printStackTrace(); // //throw getLocalVciError("PLMQTD-00003", e); // } // return qtdList.toArray(new QTD[0]); } public boolean deleteQTD(String qtdName) throws VCIError { boolean flag = false; if(qtdName == null || qtdName.equals("")){ ServerWithLog4j.logger.info("未指定要删除的查询模板定义"); return flag; } try{ String sql = "delete from PL_QTEMPLATEDEF t where t.qtdName = ?"; Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); query.setString(0, qtdName); query.executeUpdate(); QTDServerCacheUtil.delQTD(qtdName); return true; }catch(Throwable e){ throw getLocalVciError("PLMQTD-00006", e); } } public boolean updateQTD(QTD qtd) throws VCIError { boolean flag = false; if(qtd == null){ ServerWithLog4j.logger.info("修改的查询模板定义为null"); return flag; } try{ String sql = "update PL_QTEMPLATEDEF t set t.creator = ?, t.createtime = to_date(?, 'yyyy-MM-dd'), t.btmname= ?, t.abnames = ?, t.linkTypeName = ? where t.qtdname = ?"; Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); query.setString(0, qtd.creator); query.setDate(1, new Date(qtd.createTime)); query.setString(2, qtd.btmName); query.setString(3, arrayToString(qtd.abNames)); query.setString(4, qtd.linkTypeName); query.setString(5, qtd.name); query.executeUpdate(); flag = true; QTDServerCacheUtil.setQTD(qtd); }catch(Throwable e){ throw getLocalVciError("PLMQTD-00005", e); } return flag; } /** * String数组加上',' 转换成String * @param array * @return */ private String arrayToString(String[] array){ StringBuilder strb = new StringBuilder(); for(int i = 0; i < array.length; i++){ strb.append(array[i]); if(i < array.length - 1){ strb.append(","); } } return strb.toString(); } public QTD getQTDByName(String name) throws VCIError { return QTDServerCacheUtil.getQTD(name); // QTD qtd = new QTD(); // try{ // String sql = "select * from PL_QTEMPLATEDEF t where t.qtdName = ?"; // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, name); // List list = query.list(); // Object[] objArray = (Object[]) list.get(0); // qtd.name = (String) objArray[0]; // qtd.creator = (String) objArray[1]; // qtd.createTime = dFormat.format((Date)objArray[2]); // qtd.btmName = (String) objArray[3] == null ? "" : (String) objArray[3]; // qtd.abNames = ((String) objArray[4]).split(","); // qtd.linkTypeName = (String) objArray[5] == null ? "" : (String) objArray[5]; // }catch(Throwable e){ // throw getLocalVciError("PLMQTD-00004", e); // } // return qtd; } public QTD[] getQTDsByLinkType(String ltName) throws VCIError { return QTDServerCacheUtil.getLinkTypeQTDs(ltName); // String sql = "select * from PL_QTEMPLATEDEF t where t.linkTypeName = ?"; // List qtdList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, ltName); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTD qtd = new QTD(); // Object[] obj = (Object[]) list.get(i); // qtd.name = (String)obj[0]; // qtd.creator = (String)obj[1]; // qtd.createTime = dFormat.format((Date)obj[2]); // qtd.btmName = (String)obj[3] == null ? "" : (String)obj[3]; // String abNames = ((String)obj[4]); // if(abNames == null || abNames.equals("")){ // qtd.abNames = new String[0]; // }else{ // qtd.abNames = ((String)obj[4]).split(","); // } // qtd.linkTypeName = (String)obj[5]; // qtdList.add(qtd); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("PLMQTD-00003", e); // } // return qtdList.toArray(new QTD[0]); } public QTD[] getQTDsByBizType(String btName) throws VCIError { return QTDServerCacheUtil.getBizTypeQTDs(btName); // String sql = "select * from PL_QTEMPLATEDEF t where t.btmName = ?"; // List qtdList = new ArrayList(); // try{ // Session session = HibernateSessionFactory.getSession(); // SQLQuery query = session.createSQLQuery(sql); // query.setString(0, btName); // List list = query.list(); // for(int i = 0; i < list.size(); i++){ // QTD qtd = new QTD(); // Object[] obj = (Object[]) list.get(i); // qtd.name = (String)obj[0]; // qtd.creator = (String)obj[1]; // qtd.createTime = dFormat.format((Date)obj[2]); // qtd.btmName = (String)obj[3]; // String abNames = ((String)obj[4]); // if(abNames == null || abNames.equals("")){ // qtd.abNames = new String[0]; // }else{ // qtd.abNames = ((String)obj[4]).split(","); // } // qtd.linkTypeName = (String)obj[5] == null ? "" : (String)obj[5]; // qtdList.add(qtd); // } // }catch(Throwable e){ // e.printStackTrace(); // throw getLocalVciError("PLMQTD-00003", e); // } // return qtdList.toArray(new QTD[0]); } public boolean saveQTD(QTD qtd) throws VCIError { String sql = "insert into PL_QTEMPLATEDEF values(?, ?, to_date(?, 'yyyy-MM-dd'), ?, ?, ?)"; try{ Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); query.setString(0, qtd.name); query.setString(1, qtd.creator); //CreateTime 应取服务器时间 Date date = Calendar.getInstance().getTime(); qtd.createTime = date.getTime(); query.setString(2, dFormat.format(date)); query.setString(3, qtd.btmName); query.setString(4, arrayToString(qtd.abNames)); query.setString(5, qtd.linkTypeName); query.executeUpdate(); QTDServerCacheUtil.setQTD(qtd); }catch(Throwable e){ throw new VCIError("PLMQTD-00002", new String[]{e.getMessage()}); } return true; } public boolean isExistsQTD(String name) throws VCIError { return QTDServerCacheUtil.isExistsQTD(name); } }